1212
1313# Precomputed S-Box for byte substitution
1414S_BOX = (
15- 0x63 ,
16- 0x7C ,
17- 0x77 ,
18- 0x7B ,
19- 0xF2 ,
20- 0x6B ,
21- 0x6F ,
22- 0xC5 ,
23- 0x30 ,
24- 0x01 ,
25- 0x67 ,
26- 0x2B ,
27- 0xFE ,
28- 0xD7 ,
29- 0xAB ,
30- 0x76 ,
31- 0xCA ,
32- 0x82 ,
33- 0xC9 ,
34- 0x7D ,
35- 0xFA ,
36- 0x59 ,
37- 0x47 ,
38- 0xF0 ,
39- 0xAD ,
40- 0xD4 ,
41- 0xA2 ,
42- 0xAF ,
43- 0x9C ,
44- 0xA4 ,
45- 0x72 ,
46- 0xC0 ,
47- 0xB7 ,
48- 0xFD ,
49- 0x93 ,
50- 0x26 ,
51- 0x36 ,
52- 0x3F ,
53- 0xF7 ,
54- 0xCC ,
55- 0x34 ,
56- 0xA5 ,
57- 0xE5 ,
58- 0xF1 ,
59- 0x71 ,
60- 0xD8 ,
61- 0x31 ,
62- 0x15 ,
63- 0x04 ,
64- 0xC7 ,
65- 0x23 ,
66- 0xC3 ,
67- 0x18 ,
68- 0x96 ,
69- 0x05 ,
70- 0x9A ,
71- 0x07 ,
72- 0x12 ,
73- 0x80 ,
74- 0xE2 ,
75- 0xEB ,
76- 0x27 ,
77- 0xB2 ,
78- 0x75 ,
79- 0x09 ,
80- 0x83 ,
81- 0x2C ,
82- 0x1A ,
83- 0x1B ,
84- 0x6E ,
85- 0x5A ,
86- 0xA0 ,
87- 0x52 ,
88- 0x3B ,
89- 0xD6 ,
90- 0xB3 ,
91- 0x29 ,
92- 0xE3 ,
93- 0x2F ,
94- 0x84 ,
95- 0x53 ,
96- 0xD1 ,
97- 0x00 ,
98- 0xED ,
99- 0x20 ,
100- 0xFC ,
101- 0xB1 ,
102- 0x5B ,
103- 0x6A ,
104- 0xCB ,
105- 0xBE ,
106- 0x39 ,
107- 0x4A ,
108- 0x4C ,
109- 0x58 ,
110- 0xCF ,
111- 0xD0 ,
112- 0xEF ,
113- 0xAA ,
114- 0xFB ,
115- 0x43 ,
116- 0x4D ,
117- 0x33 ,
118- 0x85 ,
119- 0x45 ,
120- 0xF9 ,
121- 0x02 ,
122- 0x7F ,
123- 0x50 ,
124- 0x3C ,
125- 0x9F ,
126- 0xA8 ,
127- 0x51 ,
128- 0xA3 ,
129- 0x40 ,
130- 0x8F ,
131- 0x92 ,
132- 0x9D ,
133- 0x38 ,
134- 0xF5 ,
135- 0xBC ,
136- 0xB6 ,
137- 0xDA ,
138- 0x21 ,
139- 0x10 ,
140- 0xFF ,
141- 0xF3 ,
142- 0xD2 ,
143- 0xCD ,
144- 0x0C ,
145- 0x13 ,
146- 0xEC ,
147- 0x5F ,
148- 0x97 ,
149- 0x44 ,
150- 0x17 ,
151- 0xC4 ,
152- 0xA7 ,
153- 0x7E ,
154- 0x3D ,
155- 0x64 ,
156- 0x5D ,
157- 0x19 ,
158- 0x73 ,
159- 0x60 ,
160- 0x81 ,
161- 0x4F ,
162- 0xDC ,
163- 0x22 ,
164- 0x2A ,
165- 0x90 ,
166- 0x88 ,
167- 0x46 ,
168- 0xEE ,
169- 0xB8 ,
170- 0x14 ,
171- 0xDE ,
172- 0x5E ,
173- 0x0B ,
174- 0xDB ,
175- 0xE0 ,
176- 0x32 ,
177- 0x3A ,
178- 0x0A ,
179- 0x49 ,
180- 0x06 ,
181- 0x24 ,
182- 0x5C ,
183- 0xC2 ,
184- 0xD3 ,
185- 0xAC ,
186- 0x62 ,
187- 0x91 ,
188- 0x95 ,
189- 0xE4 ,
190- 0x79 ,
191- 0xE7 ,
192- 0xC8 ,
193- 0x37 ,
194- 0x6D ,
195- 0x8D ,
196- 0xD5 ,
197- 0x4E ,
198- 0xA9 ,
199- 0x6C ,
200- 0x56 ,
201- 0xF4 ,
202- 0xEA ,
203- 0x65 ,
204- 0x7A ,
205- 0xAE ,
206- 0x08 ,
207- 0xBA ,
208- 0x78 ,
209- 0x25 ,
210- 0x2E ,
211- 0x1C ,
212- 0xA6 ,
213- 0xB4 ,
214- 0xC6 ,
215- 0xE8 ,
216- 0xDD ,
217- 0x74 ,
218- 0x1F ,
219- 0x4B ,
220- 0xBD ,
221- 0x8B ,
222- 0x8A ,
223- 0x70 ,
224- 0x3E ,
225- 0xB5 ,
226- 0x66 ,
227- 0x48 ,
228- 0x03 ,
229- 0xF6 ,
230- 0x0E ,
231- 0x61 ,
232- 0x35 ,
233- 0x57 ,
234- 0xB9 ,
235- 0x86 ,
236- 0xC1 ,
237- 0x1D ,
238- 0x9E ,
239- 0xE1 ,
240- 0xF8 ,
241- 0x98 ,
242- 0x11 ,
243- 0x69 ,
244- 0xD9 ,
245- 0x8E ,
246- 0x94 ,
247- 0x9B ,
248- 0x1E ,
249- 0x87 ,
250- 0xE9 ,
251- 0xCE ,
252- 0x55 ,
253- 0x28 ,
254- 0xDF ,
255- 0x8C ,
256- 0xA1 ,
257- 0x89 ,
258- 0x0D ,
259- 0xBF ,
260- 0xE6 ,
261- 0x42 ,
262- 0x68 ,
263- 0x41 ,
264- 0x99 ,
265- 0x2D ,
266- 0x0F ,
267- 0xB0 ,
268- 0x54 ,
269- 0xBB ,
270- 0x16 ,
15+ 0x63 , 0x7C , 0x77 , 0x7B , 0xF2 , 0x6B , 0x6F , 0xC5 , 0x30 , 0x01 , 0x67 , 0x2B , 0xFE , 0xD7 , 0xAB , 0x76 ,
16+ 0xCA , 0x82 , 0xC9 , 0x7D , 0xFA , 0x59 , 0x47 , 0xF0 , 0xAD , 0xD4 , 0xA2 , 0xAF , 0x9C , 0xA4 , 0x72 , 0xC0 ,
17+ 0xB7 , 0xFD , 0x93 , 0x26 , 0x36 , 0x3F , 0xF7 , 0xCC , 0x34 , 0xA5 , 0xE5 , 0xF1 , 0x71 , 0xD8 , 0x31 , 0x15 ,
18+ 0x04 , 0xC7 , 0x23 , 0xC3 , 0x18 , 0x96 , 0x05 , 0x9A , 0x07 , 0x12 , 0x80 , 0xE2 , 0xEB , 0x27 , 0xB2 , 0x75 ,
19+ 0x09 , 0x83 , 0x2C , 0x1A , 0x1B , 0x6E , 0x5A , 0xA0 , 0x52 , 0x3B , 0xD6 , 0xB3 , 0x29 , 0xE3 , 0x2F , 0x84 ,
20+ 0x53 , 0xD1 , 0x00 , 0xED , 0x20 , 0xFC , 0xB1 , 0x5B , 0x6A , 0xCB , 0xBE , 0x39 , 0x4A , 0x4C , 0x58 , 0xCF ,
21+ 0xD0 , 0xEF , 0xAA , 0xFB , 0x43 , 0x4D , 0x33 , 0x85 , 0x45 , 0xF9 , 0x02 , 0x7F , 0x50 , 0x3C , 0x9F , 0xA8 ,
22+ 0x51 , 0xA3 , 0x40 , 0x8F , 0x92 , 0x9D , 0x38 , 0xF5 , 0xBC , 0xB6 , 0xDA , 0x21 , 0x10 , 0xFF , 0xF3 , 0xD2 ,
23+ 0xCD , 0x0C , 0x13 , 0xEC , 0x5F , 0x97 , 0x44 , 0x17 , 0xC4 , 0xA7 , 0x7E , 0x3D , 0x64 , 0x5D , 0x19 , 0x73 ,
24+ 0x60 , 0x81 , 0x4F , 0xDC , 0x22 , 0x2A , 0x90 , 0x88 , 0x46 , 0xEE , 0xB8 , 0x14 , 0xDE , 0x5E , 0x0B , 0xDB ,
25+ 0xE0 , 0x32 , 0x3A , 0x0A , 0x49 , 0x06 , 0x24 , 0x5C , 0xC2 , 0xD3 , 0xAC , 0x62 , 0x91 , 0x95 , 0xE4 , 0x79 ,
26+ 0xE7 , 0xC8 , 0x37 , 0x6D , 0x8D , 0xD5 , 0x4E , 0xA9 , 0x6C , 0x56 , 0xF4 , 0xEA , 0x65 , 0x7A , 0xAE , 0x08 ,
27+ 0xBA , 0x78 , 0x25 , 0x2E , 0x1C , 0xA6 , 0xB4 , 0xC6 , 0xE8 , 0xDD , 0x74 , 0x1F , 0x4B , 0xBD , 0x8B , 0x8A ,
28+ 0x70 , 0x3E , 0xB5 , 0x66 , 0x48 , 0x03 , 0xF6 , 0x0E , 0x61 , 0x35 , 0x57 , 0xB9 , 0x86 , 0xC1 , 0x1D , 0x9E ,
29+ 0xE1 , 0xF8 , 0x98 , 0x11 , 0x69 , 0xD9 , 0x8E , 0x94 , 0x9B , 0x1E , 0x87 , 0xE9 , 0xCE , 0x55 , 0x28 , 0xDF ,
30+ 0x8C , 0xA1 , 0x89 , 0x0D , 0xBF , 0xE6 , 0x42 , 0x68 , 0x41 , 0x99 , 0x2D , 0x0F , 0xB0 , 0x54 , 0xBB , 0x16 ,
27131)
27232
27333# Round constants used for key expansion
274- RCON = (0x00 , 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 , 0x1B , 0x36 )
275-
34+ RCON = (
35+ 0x00 , 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 , 0x1B , 0x36
36+ )
27637
27738def sub_bytes (state : list [int ]) -> None :
27839 """
@@ -286,7 +47,6 @@ def sub_bytes(state: list[int]) -> None:
28647 for i in range (16 ):
28748 state [i ] = S_BOX [state [i ]]
28849
289-
29050def shift_rows (state : list [int ]) -> None :
29151 """
29252 Shifts the rows of the 4x4 state matrix.
@@ -304,12 +64,7 @@ def shift_rows(state: list[int]) -> None:
30464 # Row 3: shifted left by 3
30565 state [3 ], state [7 ], state [11 ], state [15 ] = state [15 ], state [3 ], state [7 ], state [11 ]
30666
307-
308- < << << << HEAD
309- def galois_multiply (a : int , b : int ) -> int :
310- == == == =
31167def galois_multiply (multiplicand : int , multiplier : int ) -> int :
312- > >> >> >> b42bd6a1 (Fix line length formatting issues for ruff )
31368 """
31469 Multiplies two numbers in the GF(2^8) Galois field.
31570
@@ -329,7 +84,6 @@ def galois_multiply(multiplicand: int, multiplier: int) -> int:
32984 multiplier >>= 1
33085 return p % 256
33186
332-
33387def mix_columns (state : list [int ]) -> None :
33488 """
33589 Mixes the columns of the state matrix to provide diffusion.
@@ -354,7 +108,6 @@ def mix_columns(state: list[int]) -> None:
354108 galois_multiply (col [0 ], 3 ) ^ col [1 ] ^ col [2 ] ^ galois_multiply (col [3 ], 2 )
355109 )
356110
357-
358111def add_round_key (state : list [int ], round_key : list [int ]) -> None :
359112 """
360113 XORs the state matrix with the current round key.
@@ -368,7 +121,6 @@ def add_round_key(state: list[int], round_key: list[int]) -> None:
368121 for i in range (16 ):
369122 state [i ] ^= round_key [i ]
370123
371-
372124def key_expansion (key : bytes ) -> list [int ]:
373125 """
374126 Expands a 16-byte key into 11 round keys (176 bytes total).
@@ -393,7 +145,6 @@ def key_expansion(key: bytes) -> list[int]:
393145
394146 return key_schedule
395147
396-
397148def aes_128_encrypt_block (plaintext : bytes , key : bytes ) -> bytes :
398149 """
399150 Encrypts a single 16-byte block of plaintext using AES-128.
@@ -439,7 +190,6 @@ def aes_128_encrypt_block(plaintext: bytes, key: bytes) -> bytes:
439190
440191 return bytes (state )
441192
442-
443193if __name__ == "__main__" :
444194 import doctest
445195
0 commit comments