-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
267 lines (198 loc) · 7.81 KB
/
main.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
from controller2 import Initiate
from controller2 import RotWord
from controller2 import SubWord
from controller2 import XorRcon
from controller2 import TempXor
from controller2 import SubBytes
from controller2 import FormMatrix
from controller2 import ShiftRows
from controller2 import GaloisField
from controller2 import AddRoundKey
from controller2 import InverseSubBytes
from controller2 import InverseShiftRows
import time
def ReadFile(filename):
f = open(filename, "r")
content = f.read()
return content
def WriteFile(filename, content):
f = 0
for i in range(0, len(content)):
str1 = " ".join(content[i])
if i == 0:
f = open(filename, "w")
str1 = str1 + "\n"
f.write(str1)
f.close()
else:
f = open(filename, "a")
str1 = str1 + "\n"
f.write(str1)
f.close()
# APPENDING KEY
def append_keys(keys, final):
w = []
str1 = ""
for i in range(0, len(final)):
str1 = str1 + final[i]
if len(str1) == 2:
w.append(str1)
str1 = ""
keys.append(w)
def GenerateKeys(cipher_key):
# USED FOR KEY EXPANDING
rcon = ["01000000", "02000000", "04000000", "08000000", "10000000", "20000000", "40000000", "80000000",
"1b000000",
"36000000"]
rcon_count = 0
# CONVERTING TO THE MATRIX FORM
keys = Initiate(cipher_key)
print("Initial 4 keys : ", keys)
for i in range(4, 44):
print("-------------------------------------- ", i, "---------------------------------------")
if i % 4 == 0:
temp = keys[i - 1]
temp = "".join(temp)
print("Temp : ", temp)
# SHIFTING
print("Here ", temp)
rotWord = RotWord(temp, 2)
print("Rot word : ", rotWord)
# SUBSTITUTION
subWord = SubWord(rotWord)
print("Sub word : ", subWord)
XOR_Rcon = XorRcon(subWord, rcon[rcon_count])
print("XOR RCON :", XOR_Rcon)
rcon_count = rcon_count + 1
final = TempXor(XOR_Rcon, keys[i - 4])
print("Final : ", final)
append_keys(keys, final)
else:
temp = keys[i - 1]
temp = "".join(temp)
print("Temp : ", temp)
final = TempXor(temp, keys[i - 4])
print("Final : ", final)
append_keys(keys, final)
print("Expanded Keys : ", keys)
return keys
def Encryption(plain_text, keys):
print("*********************************************** ENCRYPTION **********************************************")
plainText = Initiate(plain_text)
print("Plain text : ", plainText)
addRoundKey = 0
rowNum = 0
for round in range(0, 11):
print("--------------------------------------------", round, "-----------------------------------------------")
# IF ROUND 1
if round == 0:
matrix = FormMatrix(plainText)
print("matrix : ", matrix)
key = keys[rowNum:rowNum + 4]
rowNum = rowNum + 4
key = FormMatrix(key)
print("key : ", key)
addRoundKey = AddRoundKey(matrix, key)
print("Round Key : ", addRoundKey)
# IF LAST ROUND
elif round == 10:
subMatrix = SubBytes(addRoundKey)
print("Sub Bytes : ", subMatrix)
shiftRows = ShiftRows(subMatrix)
print("Shift Rows : ", shiftRows)
# Getting next key
key = keys[rowNum:rowNum + 4]
rowNum = rowNum + 4
key = FormMatrix(key)
print("Round Key : ", key)
addRoundKey = AddRoundKey(shiftRows, key)
print("Add Round Key : ", addRoundKey)
else:
subMatrix = SubBytes(addRoundKey)
print("Sub Bytes : ", subMatrix)
shiftRows = ShiftRows(subMatrix)
print("Shift Rows : ", shiftRows)
# THIS FUNCTION DOES NOT APPEND ONE BIT AT THE START IF SINGLE BIT IS THERE
mixColumns = GaloisField(shiftRows, 0)
print("Mix Column : ", mixColumns)
# Getting next key
key = keys[rowNum:rowNum + 4]
rowNum = rowNum + 4
key = FormMatrix(key)
print("Round Key : ", key)
addRoundKey = AddRoundKey(mixColumns, key)
print("Add Round Key : ", addRoundKey)
finalCipherText = addRoundKey
print("CIPHER TEXT :", finalCipherText)
WriteFile("encryption.enc", finalCipherText)
return finalCipherText
def Decryption(final_cipher_text, keys):
print("******************************************* DECRYPTION ************************************************")
addRoundKey = 0
rowNum = 40
for round1 in range(0, 11):
print("--------------------------------------------", round1, "-----------------------------------------------")
if round1 == 0:
# Preparing matrix
key = keys[rowNum:rowNum + 4]
rowNum = rowNum - 4
key = FormMatrix(key)
addRoundKey = AddRoundKey(final_cipher_text, key)
print("Add Round Key : ", addRoundKey)
# LAST ROUND
elif round1 == 10:
inverseShiftRows = InverseShiftRows(addRoundKey)
print("Inverse shift rows : ", inverseShiftRows)
inverseSubBytes = InverseSubBytes(inverseShiftRows)
print("Inverse Sub bytes : ", inverseSubBytes)
# Preparing matrix
key = keys[rowNum:rowNum + 4]
rowNum = rowNum - 4
key = FormMatrix(key)
addRoundKey = AddRoundKey(inverseSubBytes, key)
print("Add Round Key : ", addRoundKey)
else:
# THIS USES THE PREVIOUS addRoundKey GENERATED FROM Round 0
inverseShiftRows = InverseShiftRows(addRoundKey)
print("Inverse shift rows : ", inverseShiftRows)
inverseSubBytes = InverseSubBytes(inverseShiftRows)
print("Inverse Sub bytes : ", inverseSubBytes)
# Preparing matrix that is w[36:39] matrix
key = keys[rowNum:rowNum + 4]
rowNum = rowNum - 4
key = FormMatrix(key)
print("Round Key : ", key)
addRoundKey = AddRoundKey(inverseSubBytes, key)
print("Add Round Key : ", addRoundKey)
inverseMixColumns = GaloisField(addRoundKey, 1)
print("Inverse mix column : ", inverseMixColumns)
addRoundKey = inverseMixColumns
print("DECRYPTION RESULT : ", addRoundKey)
WriteFile("decryption.dec", addRoundKey)
if __name__ == "__main__":
# READING KEY FROM A FILE
Cipher_Key = ReadFile("aes.key")
print("Cipher key is : ", Cipher_Key)
# READING PLAIN TEXT FROM A FILE
Plaintext = ReadFile("plainText.pt")
print("PLain text is : ", Plaintext)
# THIS FUNCTION RETURNS THE GENERATED KEYS
keys = GenerateKeys(Cipher_Key)
# STARTING TIME FOR ENCRYPTION
EncryptionStart = time.time()
# TAKE THE KEY AND PLAIN TEXT AND ENCRYPT IT
CipherText = Encryption(Plaintext, keys)
# ENDING TIME FOR ENCRYPTION
EncryptionEnd = time.time()
# STARTING TIME FOR DECRYPTION
DecryptionStart = time.time()
# TAKE THE KEY AND CIPHER TEXT AND PERFORM DECRYPTION
Decryption(CipherText, keys)
# ENDING TIME FOR DECRYPTION
DecryptionEnd = time.time()
print("Total time taken for encryption : ", EncryptionEnd - EncryptionStart)
print("Total time taken for decryption : ", DecryptionEnd - DecryptionStart)
# Cipher_Key = "2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c"
# Plaintext = "32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34"
# Plaintext = "54 77 6F 20 4F 6E 65 20 4E 69 6E 65 20 54 77 6F"
# Cipher_Key = "54 68 61 74 73 20 6D 79 20 4B 75 6E 67 20 46 75"