Skip to content

Instantly share code, notes, and snippets.

@arya-oss
Last active July 3, 2018 08:52
Show Gist options
  • Save arya-oss/179a0a47b9bab8afca418008f8f033b6 to your computer and use it in GitHub Desktop.
Save arya-oss/179a0a47b9bab8afca418008f8f033b6 to your computer and use it in GitHub Desktop.
Data Encryption Standard
#!/usr/bin/env python
p_table_1 = [
[57,49,41,33,25,17, 9],
[ 1,58,50,42,34,26,18],
[10, 2,59,51,43,35,27],
[19,11, 3,60,52,44,36],
[63,55,47,39,31,23,15],
[ 7,62,54,46,38,30,22],
[14, 6,61,53,45,37,29],
[21,13, 5,28,20,12, 4]
]
p_table_2 = [
[14,17,11,24, 1, 5],
[ 3, 28,15, 6,21,10],
[23,19,12, 4,26, 8],
[16, 7,27,20,13, 2],
[41,52,31,37,47,55],
[30,40,51,45,33,48],
[44,49,39,56,34,53],
[46,42,50,36,29,32]
]
ip_table_1 = [
[58,50,42,34,26,18,10,2],
[60,52,44,36,28,20,12,4],
[62,54,46,38,30,22,14,6],
[64,56,48,40,32,24,16,8],
[57,49,41,33,25,17, 9,1],
[59,51,43,35,27,19,11,3],
[61,53,45,37,29,21,13,5],
[63,55,47,39,31,23,15,7]
]
s_table_1 = [
[32, 1, 2, 3, 4, 5],
[ 4, 5, 6, 7, 8, 9],
[ 8, 9,10,11,12,13],
[12,13,14,15,16,17],
[16,17,18,19,20,21],
[20,21,22,23,24,25],
[24,25,26,27,28,29],
[28,29,30,31,32, 1]
]
sub_table = [
[
[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]
],
[
[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]
],
[
[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]
],
[
[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]
],
[
[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]
],
[
[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]
],
[
[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]
],
[
[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]
]
]
per_table = [
[16,7,20,21],
[29,12,28,17],
[1,15,23,26],
[5,18,31,10],
[2,8,24,14],
[32,27,3,9],
[19,13,30,6],
[22,11,4,25]
]
inverse_perm_table = [
[40,8,48,16,56,24,64,32],
[39,7,47,15,55,23,63,31],
[38,6,46,14,54,22,62,30],
[37,5,45,13,53,21,61,29],
[36,4,44,12,52,20,60,28],
[35,3,43,11,51,19,59,27],
[34,2,42,10,50,18,58,26],
[33,1,41,9,49,17,57,25]
]
iter_table = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]
def toBinary(num):
b = []
while num!=0:
if num%2==1:
b.insert(0, '1')
else:
b.insert(0, '0')
num = num/2
while len(b) < 4:
b.insert(0, '0')
return "".join(b)
def toDecimal(binary):
num = 0
coeff = 1
for v in reversed(binary):
if v == '1':
num += coeff
coeff *= 2
return num
def xor(list1, list2):
res = ''
l = len(list2)
for i in range(l):
if list1[i] == list2[i]:
res += '0'
else:
res += '1'
return res
def left_shift(arr, pos):
return arr[pos:] + arr[0:pos]
def func_key(right, key):
exp_right = ''
for row in s_table_1:
for val in row:
exp_right += right[val-1]
x = xor(exp_right, key)
f = ''
for i, sub_table_item in enumerate(sub_table):
l_pos = 6*i
r_pos = l_pos + 5
index = toDecimal(x[l_pos:l_pos+1]+x[r_pos:r_pos+1])
value = toDecimal(x[l_pos+1: r_pos])
t = toBinary(sub_table_item[index][value])
# print t
f += t
final_val = ''
for row in per_table:
for val in row:
final_val += f[val-1]
return final_val
K = '0001001100110100010101110111100110011011101111001101111111110001'
K_P = ''
for row in p_table_1:
for pos in row:
K_P += K[pos-1]
left_key = K_P[:28]
right_key = K_P[28:]
data = '0000000100100011010001010110011110001001101010111100110111101111'
p_data = ''
for row in ip_table_1:
for val in row:
p_data += data[val-1]
left_data = p_data[0:32]
right_data = p_data[32:]
for i, v in enumerate(iter_table):
K_key = ''
left_key = left_shift(left_key, v)
right_key = left_shift(right_key,v)
arr = left_key+right_key
for row in p_table_2:
for pos in row:
K_key += arr[pos-1]
# Swap Left data and right after calculation
x = xor(left_data, func_key(right_data, K_key))
left_data = right_data
right_data = x
x = right_data+left_data
crypt=''
for row in inverse_perm_table:
for val in row:
crypt += x[val-1]
print 'Final Encryption', crypt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment