Skip to content

Instantly share code, notes, and snippets.

@Harkirat9711
Forked from asdvd01/DES.py
Created October 12, 2017 00:41
Show Gist options
  • Select an option

  • Save Harkirat9711/b17d7cebad52c1dfcae950081fe7f39c to your computer and use it in GitHub Desktop.

Select an option

Save Harkirat9711/b17d7cebad52c1dfcae950081fe7f39c to your computer and use it in GitHub Desktop.
P1 = [
56, 48, 40, 32, 24, 16, 8,
0, 57, 49, 41, 33, 25, 17,
9, 1, 58, 50, 42, 34, 26,
18, 10, 2, 59, 51, 43, 35,
62, 54, 46, 38, 30, 22, 14,
6, 61, 53, 45, 37, 29, 21,
13, 5, 60, 52, 44, 36, 28,
20, 12, 4, 27, 19, 11, 3
]
P2 = [
13, 16, 10, 23, 0, 4,
2, 27, 14, 5, 20, 9,
22, 18, 11, 3, 25, 7,
15, 6, 26, 19, 12, 1,
40, 51, 30, 36, 46, 54,
29, 39, 50, 44, 32, 47,
43, 48, 38, 55, 33, 52,
45, 41, 49, 35, 28, 31
]
ShiftTable = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
ExpansionTable = [
31, 0, 1, 2, 3, 4,
3, 4, 5, 6, 7, 8,
7, 8, 9, 10, 11, 12,
11, 12, 13, 14, 15, 16,
15, 16, 17, 18, 19, 20,
19, 20, 21, 22, 23, 24,
23, 24, 25, 26, 27, 28,
27, 28, 29, 30, 31, 0
]
P3 = [
15, 6, 19, 20, 28, 11, 27, 16,
0, 14, 22, 25, 4, 17, 30, 9,
1, 7, 23, 13, 31, 26, 2, 8,
18, 12, 29, 5, 21, 10, 3, 24
]
SBoxes = [
# S1
[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13],
# S2
[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9],
# S3
[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12],
# S4
[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14],
# S5
[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3],
# S6
[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13],
# S7
[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12],
# S8
[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11],
]
def BintoDec(binstring):
radix = 1
val = 0
for i in range(len(binstring)-1, -1, -1):
val = val + int(binstring[i])*radix
radix = radix * 2
return val
def DectoBin(num):
num = int(num)
string = ''
while(num > 0):
string = string + str(num%2)
num = num/2
string = string[::-1]
while(len(string) < 4):
string = '0' + string
return string
def HextoBin(hexstring):
#Hex to binary
string = ''
for i in range(len(hexstring)):
if(hexstring[i] == '0'):
string = string + '0000'
continue
elif(hexstring[i] == '1'):
string = string + '0001'
continue
elif(hexstring[i] == '2'):
string = string + '0010'
continue
elif(hexstring[i] == '3'):
string = string + '0011'
continue
elif(hexstring[i] == '4'):
string = string + '0100'
continue
elif(hexstring[i] == '5'):
string = string + '0101'
continue
elif(hexstring[i] == '6'):
string = string + '0110'
continue
elif(hexstring[i] == '7'):
string = string + '0111'
continue
elif(hexstring[i] == '8'):
string = string + '1000'
continue
elif(hexstring[i] == '9'):
string = string + '1001'
continue
elif(hexstring[i] == 'A'):
string = string + '1010'
continue
elif(hexstring[i] == 'B'):
string = string + '1011'
continue
elif(hexstring[i] == 'C'):
string = string + '1100'
continue
elif(hexstring[i] == 'D'):
string = string + '1101'
continue
elif(hexstring[i] == 'E'):
string = string + '1110'
continue
elif(hexstring[i] == 'F'):
string = string + '1111'
continue
else:
print "Invalid Character. Exiting..."
break
return string
def BintoHex(bitstring):
#Binary to Hex
string = ''
for i in range(len(bitstring)/4):
if(bitstring[4*i:4*i+4] == '0000'):
string = string + '0'
continue
elif(bitstring[4*i:4*i+4] == '0001'):
string = string + '1'
continue
elif(bitstring[4*i:4*i+4] == '0010'):
string = string + '2'
continue
elif(bitstring[4*i:4*i+4] == '0011'):
string = string + '3'
continue
elif(bitstring[4*i:4*i+4] == '0100'):
string = string + '4'
continue
elif(bitstring[4*i:4*i+4] == '0101'):
string = string + '5'
continue
elif(bitstring[4*i:4*i+4] == '0110'):
string = string + '6'
continue
elif(bitstring[4*i:4*i+4] == '0111'):
string = string + '7'
continue
elif(bitstring[4*i:4*i+4] == '1000'):
string = string + '8'
continue
elif(bitstring[4*i:4*i+4] == '1001'):
string = string + '9'
continue
elif(bitstring[4*i:4*i+4] == '1010'):
string = string + 'A'
continue
elif(bitstring[4*i:4*i+4] == '1011'):
string = string + 'B'
continue
elif(bitstring[4*i:4*i+4] == '1100'):
string = string + 'C'
continue
elif(bitstring[4*i:4*i+4] == '1101'):
string = string + 'D'
continue
elif(bitstring[4*i:4*i+4] == '1110'):
string = string + 'E'
continue
elif(bitstring[4*i:4*i+4] == '1111'):
string = string + 'F'
continue
else:
print "Invalid Character. Exiting..."
break
return string
def LeftShift(string, n):
if(n >= len(string)):
n = n%len(string)
return string[n:] + string[0:n]
def swap(string):
n = len(string)
return string[n/2:] + string[0:n/2]
def RoundKeyGenerator(KeyWithParities):
KeyWithParities = HextoBin(KeyWithParities)
CipherKey = ''
for i in range(len(P1)):
CipherKey = CipherKey + KeyWithParities[P1[i]]
RoundKeys = []
for i in range(16):
temp1 = LeftShift(CipherKey[0:28], ShiftTable[i])
temp2 = LeftShift(CipherKey[28:56], ShiftTable[i])
CipherKey = temp1 + temp2
RoundKey = ''
for j in range(len(P2)):
RoundKey = RoundKey + CipherKey[P2[j]]
RoundKeys.append(BintoHex(RoundKey))
return RoundKeys
def f(Ri, Ki):
Ri = HextoBin(Ri)
Ki = HextoBin(Ki)
ExpandedRi = ''
for i in range(len(ExpansionTable)):
ExpandedRi = ExpandedRi + Ri[ExpansionTable[i]]
temp = ''
for i in range(len(ExpandedRi)):
temp = temp + str(int(ExpandedRi[i]) ^ int(Ki[i]))
Substituted = ''
for i in range(len(temp)/6):
row = temp[6*i] + temp[6*i + 5]
col = temp[6*i+1:6*i+5]
row = BintoDec(row)
col = BintoDec(col)
val = SBoxes[i][row*16 + col]
Substituted = Substituted + DectoBin(val)
Permuted = ''
for i in range(len(Substituted)):
Permuted = Permuted + Substituted[P3[i]]
return BintoHex(Permuted)
def Mixer(A, B):
A = HextoBin(A)
B = HextoBin(B)
temp = ''
for i in range(len(A)):
temp = temp + str(int(A[i]) ^ int(B[i]))
return BintoHex(temp)
if __name__ == "__main__":
print 'Plain Text :',
pt=raw_input()
if(len(pt)>8):
while(len(pt) % 8 !=0):
pt=pt+'X'
pt=pt.encode("hex")
Plaintext=pt.upper()
print 'Plain Text (Hex format):',Plaintext
print 'key :',
Key = raw_input()
while(len(Key)!=8):
print "Key should be 64 bit (8 characters) "
print 'key :',
Key = raw_input()
Key=Key.encode("hex").upper()
RoundKeys = RoundKeyGenerator(Key)
Ciphertext=""
for _ in range(0,len(Plaintext),16):
cp = Plaintext[_:_+16]
for i in range(16):
L0 = cp[0:8]
R0 = cp[8:16]
temp = f(R0, RoundKeys[i])
L0 = Mixer(L0, temp)
cp = R0 + L0
Ciphertext = Ciphertext+swap(cp)
print "Ciphertext(Hex format): " + Ciphertext
print "Ciphertext(Binary format): " + HextoBin(Ciphertext)
ans=""
for _ in range(0,len(Plaintext),16):
cp = Ciphertext[_:_+16]
for i in range(16):
L0 = cp[0:8]
R0 = cp[8:16]
temp = f(R0, RoundKeys[15 - i])
L0 = Mixer(L0, temp)
cp = R0 + L0
ans=ans+(swap(cp)).decode('hex')
print "Plaintext: " + ans
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment