172172 0x17 , 0x2b , 0x04 , 0x7e , 0xba , 0x77 , 0xd6 , 0x26 ,
173173 0xe1 , 0x69 , 0x14 , 0x63 , 0x55 , 0x21 , 0x0c , 0x7d )
174174
175- rcon = (0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 ,
175+ rcon = (0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 ,
176176 0x40 , 0x80 , 0x1b , 0x36 , 0x6c , 0xd8 ,
177- 0xab , 0x4d , 0x9a , 0x2f , 0x5e , 0xbc ,
177+ 0xab , 0x4d , 0x9a , 0x2f , 0x5e , 0xbc ,
178178 0x63 , 0xc6 , 0x97 , 0x35 , 0x6a , 0xd4 ,
179179 0xb3 , 0x7d , 0xfa , 0xef , 0xc5 , 0x91 )
180180
184184lt_d = Logtable [0xD ]
185185lt_9 = Logtable [0x9 ]
186186
187+ # Pre-calculate the special case for zero values in decrypt
188+ # This avoids conditional checks in the decrypt function
189+ def _prepare_inverse_mix_column_parts ():
190+ """Create lookup tables for the inverse mix column operation."""
191+ e_table = [0 ] * 256
192+ b_table = [0 ] * 256
193+ d_table = [0 ] * 256
194+ nine_table = [0 ] * 256
195+
196+ for i in range (1 , 256 ): # Skip zero to handle separately
197+ e_table [i ] = Alogtable [(lt_e + Logtable [i ]) % 255 ]
198+ b_table [i ] = Alogtable [(lt_b + Logtable [i ]) % 255 ]
199+ d_table [i ] = Alogtable [(lt_d + Logtable [i ]) % 255 ]
200+ nine_table [i ] = Alogtable [(lt_9 + Logtable [i ]) % 255 ]
201+
202+ return e_table , b_table , d_table , nine_table
203+
204+ # Initialize the lookup tables
205+ E_TABLE , B_TABLE , D_TABLE , NINE_TABLE = _prepare_inverse_mix_column_parts ()
206+
187207@memoized
188208def _keygen (k ):
189209 rk = [0 ] * 240
190-
210+
191211 if len (k ) % 32 :
192212 k += b'\xee ' * (32 - (len (k ) % 32 ))
193213
@@ -229,7 +249,7 @@ def encrypt(ctxt, key):
229249
230250 if len (ctxt ) % 16 != 0 :
231251 ctxt .extend ([0xee ] * (16 - (len (ctxt ) % 16 )))
232-
252+
233253 rk = _keygen (key )
234254
235255 blocks = len (ctxt ) // 16
@@ -258,7 +278,7 @@ def encrypt(ctxt, key):
258278 r16 = r * 16
259279
260280 # S BOX
261- a = (S [a [0 ]], S [a [1 ]], S [a [2 ]], S [a [3 ]],
281+ a = (S [a [0 ]], S [a [1 ]], S [a [2 ]], S [a [3 ]],
262282 S [a [4 ]], S [a [5 ]], S [a [6 ]], S [a [7 ]],
263283 S [a [8 ]], S [a [9 ]], S [a [10 ]], S [a [11 ]],
264284 S [a [12 ]], S [a [13 ]], S [a [14 ]], S [a [15 ]])
@@ -313,7 +333,7 @@ def encrypt(ctxt, key):
313333 r += 1
314334
315335 # S BOX
316- a = (S [a [0 ]], S [a [1 ]], S [a [2 ]], S [a [3 ]],
336+ a = (S [a [0 ]], S [a [1 ]], S [a [2 ]], S [a [3 ]],
317337 S [a [4 ]], S [a [5 ]], S [a [6 ]], S [a [7 ]],
318338 S [a [8 ]], S [a [9 ]], S [a [10 ]], S [a [11 ]],
319339 S [a [12 ]], S [a [13 ]], S [a [14 ]], S [a [15 ]])
@@ -323,7 +343,7 @@ def encrypt(ctxt, key):
323343 a [5 ], a [6 ], a [7 ], a [4 ],
324344 a [10 ], a [11 ], a [8 ], a [9 ],
325345 a [15 ], a [12 ], a [13 ], a [14 ])
326-
346+
327347 # Key addition
328348 a = (a [0 ] ^ rk [224 ],
329349 a [1 ] ^ rk [225 ],
@@ -353,7 +373,7 @@ def decrypt(ctxt, key):
353373 rk = _keygen (key )
354374
355375 ctxt = list (ctxt )
356-
376+
357377 blocks = len (ctxt ) // 16
358378
359379 extend = dtxt .extend
@@ -378,117 +398,70 @@ def decrypt(ctxt, key):
378398 a [13 ] ^ rk [237 ],
379399 a [14 ] ^ rk [238 ],
380400 a [15 ] ^ rk [239 ])
381-
401+
382402 # Si Box
383- a = (Si [a [0 ]], Si [a [1 ]], Si [a [2 ]], Si [a [3 ]],
403+ a = (Si [a [0 ]], Si [a [1 ]], Si [a [2 ]], Si [a [3 ]],
384404 Si [a [4 ]], Si [a [5 ]], Si [a [6 ]], Si [a [7 ]],
385405 Si [a [8 ]], Si [a [9 ]], Si [a [10 ]], Si [a [11 ]],
386406 Si [a [12 ]], Si [a [13 ]], Si [a [14 ]], Si [a [15 ]])
387407
388408 # Shift Row Invert
389- a = (a [0 ], a [1 ], a [2 ], a [3 ],
390- a [7 ], a [4 ], a [5 ], a [6 ],
391- a [10 ], a [11 ], a [8 ], a [9 ],
409+ a = (a [0 ], a [1 ], a [2 ], a [3 ],
410+ a [7 ], a [4 ], a [5 ], a [6 ],
411+ a [10 ], a [11 ], a [8 ], a [9 ],
392412 a [13 ], a [14 ], a [15 ], a [12 ])
393413
394414 for r in range (13 , 0 , - 1 ):
395415 r16 = r * 16
396-
416+
397417 # Key Addition
398418 a = (a [0 ] ^ rk [r16 ],
399- a [1 ] ^ rk [1 + r16 ],
400- a [2 ] ^ rk [2 + r16 ],
401- a [3 ] ^ rk [3 + r16 ],
402- a [4 ] ^ rk [4 + r16 ],
403- a [5 ] ^ rk [5 + r16 ],
404- a [6 ] ^ rk [6 + r16 ],
405- a [7 ] ^ rk [7 + r16 ],
406- a [8 ] ^ rk [8 + r16 ],
407- a [9 ] ^ rk [9 + r16 ],
408- a [10 ] ^ rk [10 + r16 ],
409- a [11 ] ^ rk [11 + r16 ],
410- a [12 ] ^ rk [12 + r16 ],
411- a [13 ] ^ rk [13 + r16 ],
412- a [14 ] ^ rk [14 + r16 ],
413- a [15 ] ^ rk [15 + r16 ])
414-
415- # Inv Mix Column
419+ a [1 ] ^ rk [1 + r16 ],
420+ a [2 ] ^ rk [2 + r16 ],
421+ a [3 ] ^ rk [3 + r16 ],
422+ a [4 ] ^ rk [4 + r16 ],
423+ a [5 ] ^ rk [5 + r16 ],
424+ a [6 ] ^ rk [6 + r16 ],
425+ a [7 ] ^ rk [7 + r16 ],
426+ a [8 ] ^ rk [8 + r16 ],
427+ a [9 ] ^ rk [9 + r16 ],
428+ a [10 ] ^ rk [10 + r16 ],
429+ a [11 ] ^ rk [11 + r16 ],
430+ a [12 ] ^ rk [12 + r16 ],
431+ a [13 ] ^ rk [13 + r16 ],
432+ a [14 ] ^ rk [14 + r16 ],
433+ a [15 ] ^ rk [15 + r16 ])
434+
435+ # Inv Mix Column - use pre-calculated tables to avoid conditionals
416436 a = (
417- (Alogtable [(lt_e + Logtable [a [0 ]]) % 255 ] if a [0 ] else 0 ) ^
418- (Alogtable [(lt_b + Logtable [a [4 ]]) % 255 ] if a [4 ] else 0 ) ^
419- (Alogtable [(lt_d + Logtable [a [8 ]]) % 255 ] if a [8 ] else 0 ) ^
420- (Alogtable [(lt_9 + Logtable [a [12 ]]) % 255 ] if a [12 ] else 0 ),
421- (Alogtable [(lt_e + Logtable [a [1 ]]) % 255 ] if a [1 ] else 0 ) ^
422- (Alogtable [(lt_b + Logtable [a [5 ]]) % 255 ] if a [5 ] else 0 ) ^
423- (Alogtable [(lt_d + Logtable [a [9 ]]) % 255 ] if a [9 ] else 0 ) ^
424- (Alogtable [(lt_9 + Logtable [a [13 ]]) % 255 ] if a [13 ] else 0 ),
425- (Alogtable [(lt_e + Logtable [a [2 ]]) % 255 ] if a [2 ] else 0 ) ^
426- (Alogtable [(lt_b + Logtable [a [6 ]]) % 255 ] if a [6 ] else 0 ) ^
427- (Alogtable [(lt_d + Logtable [a [10 ]]) % 255 ] if a [10 ] else 0 ) ^
428- (Alogtable [(lt_9 + Logtable [a [14 ]]) % 255 ] if a [14 ] else 0 ),
429- (Alogtable [(lt_e + Logtable [a [3 ]]) % 255 ] if a [3 ] else 0 ) ^
430- (Alogtable [(lt_b + Logtable [a [7 ]]) % 255 ] if a [7 ] else 0 ) ^
431- (Alogtable [(lt_d + Logtable [a [11 ]]) % 255 ] if a [11 ] else 0 ) ^
432- (Alogtable [(lt_9 + Logtable [a [15 ]]) % 255 ] if a [15 ] else 0 ),
433- (Alogtable [(lt_e + Logtable [a [4 ]]) % 255 ] if a [4 ] else 0 ) ^
434- (Alogtable [(lt_b + Logtable [a [8 ]]) % 255 ] if a [8 ] else 0 ) ^
435- (Alogtable [(lt_d + Logtable [a [12 ]]) % 255 ] if a [12 ] else 0 ) ^
436- (Alogtable [(lt_9 + Logtable [a [0 ]]) % 255 ] if a [0 ] else 0 ),
437- (Alogtable [(lt_e + Logtable [a [5 ]]) % 255 ] if a [5 ] else 0 ) ^
438- (Alogtable [(lt_b + Logtable [a [9 ]]) % 255 ] if a [9 ] else 0 ) ^
439- (Alogtable [(lt_d + Logtable [a [13 ]]) % 255 ] if a [13 ] else 0 ) ^
440- (Alogtable [(lt_9 + Logtable [a [1 ]]) % 255 ] if a [1 ] else 0 ),
441- (Alogtable [(lt_e + Logtable [a [6 ]]) % 255 ] if a [6 ] else 0 ) ^
442- (Alogtable [(lt_b + Logtable [a [10 ]]) % 255 ] if a [10 ] else 0 ) ^
443- (Alogtable [(lt_d + Logtable [a [14 ]]) % 255 ] if a [14 ] else 0 ) ^
444- (Alogtable [(lt_9 + Logtable [a [2 ]]) % 255 ] if a [2 ] else 0 ),
445- (Alogtable [(lt_e + Logtable [a [7 ]]) % 255 ] if a [7 ] else 0 ) ^
446- (Alogtable [(lt_b + Logtable [a [11 ]]) % 255 ] if a [11 ] else 0 ) ^
447- (Alogtable [(lt_d + Logtable [a [15 ]]) % 255 ] if a [15 ] else 0 ) ^
448- (Alogtable [(lt_9 + Logtable [a [3 ]]) % 255 ] if a [3 ] else 0 ),
449- (Alogtable [(lt_e + Logtable [a [8 ]]) % 255 ] if a [8 ] else 0 ) ^
450- (Alogtable [(lt_b + Logtable [a [12 ]]) % 255 ] if a [12 ] else 0 ) ^
451- (Alogtable [(lt_d + Logtable [a [0 ]]) % 255 ] if a [0 ] else 0 ) ^
452- (Alogtable [(lt_9 + Logtable [a [4 ]]) % 255 ] if a [4 ] else 0 ),
453- (Alogtable [(lt_e + Logtable [a [9 ]]) % 255 ] if a [9 ] else 0 ) ^
454- (Alogtable [(lt_b + Logtable [a [13 ]]) % 255 ] if a [13 ] else 0 ) ^
455- (Alogtable [(lt_d + Logtable [a [1 ]]) % 255 ] if a [1 ] else 0 ) ^
456- (Alogtable [(lt_9 + Logtable [a [5 ]]) % 255 ] if a [5 ] else 0 ),
457- (Alogtable [(lt_e + Logtable [a [10 ]]) % 255 ] if a [10 ] else 0 ) ^
458- (Alogtable [(lt_b + Logtable [a [14 ]]) % 255 ] if a [14 ] else 0 ) ^
459- (Alogtable [(lt_d + Logtable [a [2 ]]) % 255 ] if a [2 ] else 0 ) ^
460- (Alogtable [(lt_9 + Logtable [a [6 ]]) % 255 ] if a [6 ] else 0 ),
461- (Alogtable [(lt_e + Logtable [a [11 ]]) % 255 ] if a [11 ] else 0 ) ^
462- (Alogtable [(lt_b + Logtable [a [15 ]]) % 255 ] if a [15 ] else 0 ) ^
463- (Alogtable [(lt_d + Logtable [a [3 ]]) % 255 ] if a [3 ] else 0 ) ^
464- (Alogtable [(lt_9 + Logtable [a [7 ]]) % 255 ] if a [7 ] else 0 ),
465- (Alogtable [(lt_e + Logtable [a [12 ]]) % 255 ] if a [12 ] else 0 ) ^
466- (Alogtable [(lt_b + Logtable [a [0 ]]) % 255 ] if a [0 ] else 0 ) ^
467- (Alogtable [(lt_d + Logtable [a [4 ]]) % 255 ] if a [4 ] else 0 ) ^
468- (Alogtable [(lt_9 + Logtable [a [8 ]]) % 255 ] if a [8 ] else 0 ),
469- (Alogtable [(lt_e + Logtable [a [13 ]]) % 255 ] if a [13 ] else 0 ) ^
470- (Alogtable [(lt_b + Logtable [a [1 ]]) % 255 ] if a [1 ] else 0 ) ^
471- (Alogtable [(lt_d + Logtable [a [5 ]]) % 255 ] if a [5 ] else 0 ) ^
472- (Alogtable [(lt_9 + Logtable [a [9 ]]) % 255 ] if a [9 ] else 0 ),
473- (Alogtable [(lt_e + Logtable [a [14 ]]) % 255 ] if a [14 ] else 0 ) ^
474- (Alogtable [(lt_b + Logtable [a [2 ]]) % 255 ] if a [2 ] else 0 ) ^
475- (Alogtable [(lt_d + Logtable [a [6 ]]) % 255 ] if a [6 ] else 0 ) ^
476- (Alogtable [(lt_9 + Logtable [a [10 ]]) % 255 ] if a [10 ] else 0 ),
477- (Alogtable [(lt_e + Logtable [a [15 ]]) % 255 ] if a [15 ] else 0 ) ^
478- (Alogtable [(lt_b + Logtable [a [3 ]]) % 255 ] if a [3 ] else 0 ) ^
479- (Alogtable [(lt_d + Logtable [a [7 ]]) % 255 ] if a [7 ] else 0 ) ^
480- (Alogtable [(lt_9 + Logtable [a [11 ]]) % 255 ] if a [11 ] else 0 ))
437+ (E_TABLE [a [0 ]] ^ B_TABLE [a [4 ]] ^ D_TABLE [a [8 ]] ^ NINE_TABLE [a [12 ]]),
438+ (E_TABLE [a [1 ]] ^ B_TABLE [a [5 ]] ^ D_TABLE [a [9 ]] ^ NINE_TABLE [a [13 ]]),
439+ (E_TABLE [a [2 ]] ^ B_TABLE [a [6 ]] ^ D_TABLE [a [10 ]] ^ NINE_TABLE [a [14 ]]),
440+ (E_TABLE [a [3 ]] ^ B_TABLE [a [7 ]] ^ D_TABLE [a [11 ]] ^ NINE_TABLE [a [15 ]]),
441+ (E_TABLE [a [4 ]] ^ B_TABLE [a [8 ]] ^ D_TABLE [a [12 ]] ^ NINE_TABLE [a [0 ]]),
442+ (E_TABLE [a [5 ]] ^ B_TABLE [a [9 ]] ^ D_TABLE [a [13 ]] ^ NINE_TABLE [a [1 ]]),
443+ (E_TABLE [a [6 ]] ^ B_TABLE [a [10 ]] ^ D_TABLE [a [14 ]] ^ NINE_TABLE [a [2 ]]),
444+ (E_TABLE [a [7 ]] ^ B_TABLE [a [11 ]] ^ D_TABLE [a [15 ]] ^ NINE_TABLE [a [3 ]]),
445+ (E_TABLE [a [8 ]] ^ B_TABLE [a [12 ]] ^ D_TABLE [a [0 ]] ^ NINE_TABLE [a [4 ]]),
446+ (E_TABLE [a [9 ]] ^ B_TABLE [a [13 ]] ^ D_TABLE [a [1 ]] ^ NINE_TABLE [a [5 ]]),
447+ (E_TABLE [a [10 ]] ^ B_TABLE [a [14 ]] ^ D_TABLE [a [2 ]] ^ NINE_TABLE [a [6 ]]),
448+ (E_TABLE [a [11 ]] ^ B_TABLE [a [15 ]] ^ D_TABLE [a [3 ]] ^ NINE_TABLE [a [7 ]]),
449+ (E_TABLE [a [12 ]] ^ B_TABLE [a [0 ]] ^ D_TABLE [a [4 ]] ^ NINE_TABLE [a [8 ]]),
450+ (E_TABLE [a [13 ]] ^ B_TABLE [a [1 ]] ^ D_TABLE [a [5 ]] ^ NINE_TABLE [a [9 ]]),
451+ (E_TABLE [a [14 ]] ^ B_TABLE [a [2 ]] ^ D_TABLE [a [6 ]] ^ NINE_TABLE [a [10 ]]),
452+ (E_TABLE [a [15 ]] ^ B_TABLE [a [3 ]] ^ D_TABLE [a [7 ]] ^ NINE_TABLE [a [11 ]])
453+ )
481454
482455 # Si Box
483- a = (Si [a [0 ]], Si [a [1 ]], Si [a [2 ]], Si [a [3 ]],
456+ a = (Si [a [0 ]], Si [a [1 ]], Si [a [2 ]], Si [a [3 ]],
484457 Si [a [4 ]], Si [a [5 ]], Si [a [6 ]], Si [a [7 ]],
485458 Si [a [8 ]], Si [a [9 ]], Si [a [10 ]], Si [a [11 ]],
486459 Si [a [12 ]], Si [a [13 ]], Si [a [14 ]], Si [a [15 ]])
487460
488461 # Shift Row Invert
489- a = (a [0 ], a [1 ], a [2 ], a [3 ],
490- a [7 ], a [4 ], a [5 ], a [6 ],
491- a [10 ], a [11 ], a [8 ], a [9 ],
462+ a = (a [0 ], a [1 ], a [2 ], a [3 ],
463+ a [7 ], a [4 ], a [5 ], a [6 ],
464+ a [10 ], a [11 ], a [8 ], a [9 ],
492465 a [13 ], a [14 ], a [15 ], a [12 ])
493466
494467
0 commit comments