22
33logger = logging .getLogger (__name__ )
44
5- # AES128 Constants
6- Nr = 10
5+ # AES Constants
76Nb = 4
8- Nk = 4
97
108s_box = [[0x63 , 0x7c , 0x77 , 0x7b , 0xf2 , 0x6b , 0x6f , 0xc5 , 0x30 , 0x01 , 0x67 , 0x2b , 0xfe , 0xd7 , 0xab , 0x76 ],
119 [0xca , 0x82 , 0xc9 , 0x7d , 0xfa , 0x59 , 0x47 , 0xf0 , 0xad , 0xd4 , 0xa2 , 0xaf , 0x9c , 0xa4 , 0x72 , 0xc0 ],
@@ -134,6 +132,20 @@ def Cipher(text_in, w):
134132 logger .info ("input was string not binary" )
135133 text_in_hex = bytes .fromhex (text_in )
136134 state = []
135+
136+ key_len = len (w ) * 4
137+ if key_len == 128 :
138+ Nk = 4
139+ Nr = 10
140+ elif key_len == 192 :
141+ Nk = 6
142+ Nr = 12
143+ elif key_len == 256 :
144+ Nk = 8
145+ Nr = 14
146+ else :
147+ assert (0 )
148+
137149 # s[r,c]=in[r+4c] for0≤r<4 and 0≤c<Nb, (3.3)
138150 for r in range (0 ,4 ):
139151 row = []
@@ -142,7 +154,7 @@ def Cipher(text_in, w):
142154 state .append (row )
143155 print_state (state )
144156
145- w = KeyExpansion (w , Nk )
157+ w = KeyExpansion (w , Nk , Nr )
146158
147159 logger .debug ("\n Round: 0" )
148160 logger .debug ("input" )
@@ -168,7 +180,7 @@ def Cipher(text_in, w):
168180 logger .debug (f'out: { out } ' )
169181 return out
170182
171- def KeyExpansion (key , Nk ):
183+ def KeyExpansion (key , Nk , Nr ):
172184 temp = None
173185 w = []
174186 key_hex = bytes .fromhex (key )
@@ -187,8 +199,10 @@ def KeyExpansion(key, Nk):
187199
188200 for i in range (Nk , Nb * (Nr + 1 )):
189201 temp = w [i - 1 ]
190- if (i % Nk == 0 ):
202+ if (i % Nk == 0 ):
191203 temp = SubWord (RotWord (temp )) ^ rcon_arr [i // Nk ]
204+ elif (Nk > 6 and (i % Nk ) == 4 ):
205+ temp = SubWord (temp )
192206 w .append ( w [i - Nk ] ^ temp )
193207 logger .debug (f'{ i // 4 } : { hex (w [i ])} ' )
194208
0 commit comments