-
-
Save bloodyburger/daf489d573e790f0e9bc833d1cec1244 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