forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsdes.py
96 lines (82 loc) · 2.64 KB
/
sdes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
defapply_table(inp, table):
"""
>>> apply_table("0123456789", list(range(10)))
'9012345678'
>>> apply_table("0123456789", list(range(9, -1, -1)))
'8765432109'
"""
res=""
foriintable:
res+=inp[i-1]
returnres
defleft_shift(data):
"""
>>> left_shift("0123456789")
'1234567890'
"""
returndata[1:] +data[0]
defxor(a, b):
"""
>>> xor("01010101", "00001111")
'01011010'
"""
res=""
foriinrange(len(a)):
ifa[i] ==b[i]:
res+="0"
else:
res+="1"
returnres
defapply_sbox(s, data):
row=int("0b"+data[0] +data[-1], 2)
col=int("0b"+data[1:3], 2)
returnbin(s[row][col])[2:]
deffunction(expansion, s0, s1, key, message):
left=message[:4]
right=message[4:]
temp=apply_table(right, expansion)
temp=xor(temp, key)
left_bin_str=apply_sbox(s0, temp[:4])
right_bin_str=apply_sbox(s1, temp[4:])
left_bin_str="0"* (2-len(left_bin_str)) +left_bin_str
right_bin_str="0"* (2-len(right_bin_str)) +right_bin_str
temp=apply_table(left_bin_str+right_bin_str, p4_table)
temp=xor(left, temp)
returntemp+right
if__name__=="__main__":
key=input("Enter 10 bit key: ")
message=input("Enter 8 bit message: ")
p8_table= [6, 3, 7, 4, 8, 5, 10, 9]
p10_table= [3, 5, 2, 7, 4, 10, 1, 9, 8, 6]
p4_table= [2, 4, 3, 1]
IP= [2, 6, 3, 1, 4, 8, 5, 7]
IP_inv= [4, 1, 3, 5, 7, 2, 8, 6]
expansion= [4, 1, 2, 3, 2, 3, 4, 1]
s0= [[1, 0, 3, 2], [3, 2, 1, 0], [0, 2, 1, 3], [3, 1, 3, 2]]
s1= [[0, 1, 2, 3], [2, 0, 1, 3], [3, 0, 1, 0], [2, 1, 0, 3]]
# key generation
temp=apply_table(key, p10_table)
left=temp[:5]
right=temp[5:]
left=left_shift(left)
right=left_shift(right)
key1=apply_table(left+right, p8_table)
left=left_shift(left)
right=left_shift(right)
left=left_shift(left)
right=left_shift(right)
key2=apply_table(left+right, p8_table)
# encryption
temp=apply_table(message, IP)
temp=function(expansion, s0, s1, key1, temp)
temp=temp[4:] +temp[:4]
temp=function(expansion, s0, s1, key2, temp)
CT=apply_table(temp, IP_inv)
print("Cipher text is:", CT)
# decryption
temp=apply_table(CT, IP)
temp=function(expansion, s0, s1, key2, temp)
temp=temp[4:] +temp[:4]
temp=function(expansion, s0, s1, key1, temp)
PT=apply_table(temp, IP_inv)
print("Plain text after decypting is:", PT)