Last active
July 3, 2018 08:52
-
-
Save arya-oss/179a0a47b9bab8afca418008f8f033b6 to your computer and use it in GitHub Desktop.
Data Encryption Standard
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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