1212
1313# Precomputed S-Box for byte substitution
1414S_BOX = (
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 ,
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 ,
31271)
32272
33273# Round constants used for key expansion
34- RCON = (
35- 0x00 , 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 , 0x1B , 0x36
36- )
274+ RCON = (0x00 , 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 , 0x1B , 0x36 )
275+
37276
38277def sub_bytes (state : list [int ]) -> None :
39278 """
@@ -47,6 +286,7 @@ def sub_bytes(state: list[int]) -> None:
47286 for i in range (16 ):
48287 state [i ] = S_BOX [state [i ]]
49288
289+
50290def shift_rows (state : list [int ]) -> None :
51291 """
52292 Shifts the rows of the 4x4 state matrix.
@@ -64,6 +304,7 @@ def shift_rows(state: list[int]) -> None:
64304 # Row 3: shifted left by 3
65305 state [3 ], state [7 ], state [11 ], state [15 ] = state [15 ], state [3 ], state [7 ], state [11 ]
66306
307+
67308def galois_multiply (multiplicand : int , multiplier : int ) -> int :
68309 """
69310 Multiplies two numbers in the GF(2^8) Galois field.
@@ -84,6 +325,7 @@ def galois_multiply(multiplicand: int, multiplier: int) -> int:
84325 multiplier >>= 1
85326 return p % 256
86327
328+
87329def mix_columns (state : list [int ]) -> None :
88330 """
89331 Mixes the columns of the state matrix to provide diffusion.
@@ -108,6 +350,7 @@ def mix_columns(state: list[int]) -> None:
108350 galois_multiply (col [0 ], 3 ) ^ col [1 ] ^ col [2 ] ^ galois_multiply (col [3 ], 2 )
109351 )
110352
353+
111354def add_round_key (state : list [int ], round_key : list [int ]) -> None :
112355 """
113356 XORs the state matrix with the current round key.
@@ -121,6 +364,7 @@ def add_round_key(state: list[int], round_key: list[int]) -> None:
121364 for i in range (16 ):
122365 state [i ] ^= round_key [i ]
123366
367+
124368def key_expansion (key : bytes ) -> list [int ]:
125369 """
126370 Expands a 16-byte key into 11 round keys (176 bytes total).
@@ -145,6 +389,7 @@ def key_expansion(key: bytes) -> list[int]:
145389
146390 return key_schedule
147391
392+
148393def aes_128_encrypt_block (plaintext : bytes , key : bytes ) -> bytes :
149394 """
150395 Encrypts a single 16-byte block of plaintext using AES-128.
@@ -190,6 +435,7 @@ def aes_128_encrypt_block(plaintext: bytes, key: bytes) -> bytes:
190435
191436 return bytes (state )
192437
438+
193439if __name__ == "__main__" :
194440 import doctest
195441
0 commit comments