|
1 <!DOCTYPE html> |
|
2 <html><head> |
|
3 <title>eric7.EricUtilities.crypto.py3AES</title> |
|
4 <meta charset="UTF-8"> |
|
5 <link rel="stylesheet" href="styles.css"> |
|
6 </head> |
|
7 <body> |
|
8 <a NAME="top" ID="top"></a> |
|
9 <h1>eric7.EricUtilities.crypto.py3AES</h1> |
|
10 <p> |
|
11 Module implementing classes for encryption according |
|
12 Advanced Encryption Standard. |
|
13 </p> |
|
14 |
|
15 <h3>Global Attributes</h3> |
|
16 <table> |
|
17 <tr><td>None</td></tr> |
|
18 </table> |
|
19 |
|
20 <h3>Classes</h3> |
|
21 <table> |
|
22 <tr> |
|
23 <td><a href="#AES">AES</a></td> |
|
24 <td>Class implementing the Advanced Encryption Standard algorithm.</td> |
|
25 </tr> |
|
26 <tr> |
|
27 <td><a href="#AESModeOfOperation">AESModeOfOperation</a></td> |
|
28 <td>Class implementing the different AES mode of operations.</td> |
|
29 </tr> |
|
30 </table> |
|
31 |
|
32 <h3>Functions</h3> |
|
33 <table> |
|
34 <tr> |
|
35 <td><a href="#append_PKCS7_padding">append_PKCS7_padding</a></td> |
|
36 <td>Function to pad the given data to a multiple of 16-bytes by PKCS7 padding.</td> |
|
37 </tr> |
|
38 <tr> |
|
39 <td><a href="#decryptData">decryptData</a></td> |
|
40 <td>Module function to decrypt the given data with the given key.</td> |
|
41 </tr> |
|
42 <tr> |
|
43 <td><a href="#encryptData">encryptData</a></td> |
|
44 <td>Module function to encrypt the given data with the given key.</td> |
|
45 </tr> |
|
46 <tr> |
|
47 <td><a href="#strip_PKCS7_padding">strip_PKCS7_padding</a></td> |
|
48 <td>Function to strip off PKCS7 padding.</td> |
|
49 </tr> |
|
50 </table> |
|
51 |
|
52 <hr /> |
|
53 <hr /> |
|
54 <a NAME="AES" ID="AES"></a> |
|
55 <h2>AES</h2> |
|
56 <p> |
|
57 Class implementing the Advanced Encryption Standard algorithm. |
|
58 </p> |
|
59 |
|
60 <h3>Derived from</h3> |
|
61 None |
|
62 <h3>Class Attributes</h3> |
|
63 <table> |
|
64 <tr><td>KeySize</td></tr> |
|
65 <tr><td>Rcon</td></tr> |
|
66 <tr><td>rsbox</td></tr> |
|
67 <tr><td>sbox</td></tr> |
|
68 </table> |
|
69 |
|
70 <h3>Class Methods</h3> |
|
71 <table> |
|
72 <tr><td>None</td></tr> |
|
73 </table> |
|
74 |
|
75 <h3>Methods</h3> |
|
76 <table> |
|
77 <tr> |
|
78 <td><a href="#AES.__addRoundKey">__addRoundKey</a></td> |
|
79 <td>Private method to add (XORs) the round key to the state.</td> |
|
80 </tr> |
|
81 <tr> |
|
82 <td><a href="#AES.__aes_invMain">__aes_invMain</a></td> |
|
83 <td>Private method to do the inverse AES encryption for one round.</td> |
|
84 </tr> |
|
85 <tr> |
|
86 <td><a href="#AES.__aes_invRound">__aes_invRound</a></td> |
|
87 <td>Private method to apply the 4 operations of the inverse round in sequence.</td> |
|
88 </tr> |
|
89 <tr> |
|
90 <td><a href="#AES.__aes_main">__aes_main</a></td> |
|
91 <td>Private method to do the AES encryption for one round.</td> |
|
92 </tr> |
|
93 <tr> |
|
94 <td><a href="#AES.__aes_round">__aes_round</a></td> |
|
95 <td>Private method to apply the 4 operations of the forward round in sequence.</td> |
|
96 </tr> |
|
97 <tr> |
|
98 <td><a href="#AES.__core">__core</a></td> |
|
99 <td>Private method performing the key schedule core operation.</td> |
|
100 </tr> |
|
101 <tr> |
|
102 <td><a href="#AES.__createRoundKey">__createRoundKey</a></td> |
|
103 <td>Private method to create a round key.</td> |
|
104 </tr> |
|
105 <tr> |
|
106 <td><a href="#AES.__expandKey">__expandKey</a></td> |
|
107 <td>Private method performing Rijndael's key expansion.</td> |
|
108 </tr> |
|
109 <tr> |
|
110 <td><a href="#AES.__galois_multiplication">__galois_multiplication</a></td> |
|
111 <td>Private method to perform a Galois multiplication of 8 bit characters a and b.</td> |
|
112 </tr> |
|
113 <tr> |
|
114 <td><a href="#AES.__getRconValue">__getRconValue</a></td> |
|
115 <td>Private method to retrieve a given Rcon value.</td> |
|
116 </tr> |
|
117 <tr> |
|
118 <td><a href="#AES.__getSBoxInvert">__getSBoxInvert</a></td> |
|
119 <td>Private method to retrieve a given Inverted S-Box value.</td> |
|
120 </tr> |
|
121 <tr> |
|
122 <td><a href="#AES.__getSBoxValue">__getSBoxValue</a></td> |
|
123 <td>Private method to retrieve a given S-Box value.</td> |
|
124 </tr> |
|
125 <tr> |
|
126 <td><a href="#AES.__mixColumn">__mixColumn</a></td> |
|
127 <td>Private method to perform a galois multiplication of 1 column the 4x4 matrix.</td> |
|
128 </tr> |
|
129 <tr> |
|
130 <td><a href="#AES.__mixColumns">__mixColumns</a></td> |
|
131 <td>Private method to perform a galois multiplication of the 4x4 matrix.</td> |
|
132 </tr> |
|
133 <tr> |
|
134 <td><a href="#AES.__rotate">__rotate</a></td> |
|
135 <td>Private method performing Rijndael's key schedule rotate operation.</td> |
|
136 </tr> |
|
137 <tr> |
|
138 <td><a href="#AES.__shiftRow">__shiftRow</a></td> |
|
139 <td>Private method to shift the bytes of a row to the left.</td> |
|
140 </tr> |
|
141 <tr> |
|
142 <td><a href="#AES.__shiftRows">__shiftRows</a></td> |
|
143 <td>Private method to iterate over the 4 rows and call __shiftRow() with that row.</td> |
|
144 </tr> |
|
145 <tr> |
|
146 <td><a href="#AES.__subBytes">__subBytes</a></td> |
|
147 <td>Private method to substitute all the values from the state with the value in the SBox using the state value as index for the SBox.</td> |
|
148 </tr> |
|
149 <tr> |
|
150 <td><a href="#AES.decrypt">decrypt</a></td> |
|
151 <td>Public method to decrypt a 128 bit input block against the given key of size specified.</td> |
|
152 </tr> |
|
153 <tr> |
|
154 <td><a href="#AES.encrypt">encrypt</a></td> |
|
155 <td>Public method to encrypt a 128 bit input block against the given key of size specified.</td> |
|
156 </tr> |
|
157 </table> |
|
158 |
|
159 <h3>Static Methods</h3> |
|
160 <table> |
|
161 <tr><td>None</td></tr> |
|
162 </table> |
|
163 |
|
164 |
|
165 <a NAME="AES.__addRoundKey" ID="AES.__addRoundKey"></a> |
|
166 <h4>AES.__addRoundKey</h4> |
|
167 <b>__addRoundKey</b>(<i>state, roundKey</i>) |
|
168 <p> |
|
169 Private method to add (XORs) the round key to the state. |
|
170 </p> |
|
171 |
|
172 <dl> |
|
173 |
|
174 <dt><i>state</i> (bytearray)</dt> |
|
175 <dd> |
|
176 state to be changed |
|
177 </dd> |
|
178 <dt><i>roundKey</i> (bytearray)</dt> |
|
179 <dd> |
|
180 key to be used for the modification |
|
181 </dd> |
|
182 </dl> |
|
183 <dl> |
|
184 <dt>Return:</dt> |
|
185 <dd> |
|
186 modified state |
|
187 </dd> |
|
188 </dl> |
|
189 <dl> |
|
190 <dt>Return Type:</dt> |
|
191 <dd> |
|
192 bytearray |
|
193 </dd> |
|
194 </dl> |
|
195 <a NAME="AES.__aes_invMain" ID="AES.__aes_invMain"></a> |
|
196 <h4>AES.__aes_invMain</h4> |
|
197 <b>__aes_invMain</b>(<i>state, expandedKey, nbrRounds</i>) |
|
198 <p> |
|
199 Private method to do the inverse AES encryption for one round. |
|
200 </p> |
|
201 <p> |
|
202 Perform the initial operations, the standard round, and the |
|
203 final operations of the inverse AES, creating a round key for |
|
204 each round. |
|
205 </p> |
|
206 |
|
207 <dl> |
|
208 |
|
209 <dt><i>state</i> (bytearray)</dt> |
|
210 <dd> |
|
211 state to be worked on |
|
212 </dd> |
|
213 <dt><i>expandedKey</i> (bytearray)</dt> |
|
214 <dd> |
|
215 expanded key to be used |
|
216 </dd> |
|
217 <dt><i>nbrRounds</i> (int)</dt> |
|
218 <dd> |
|
219 number of rounds to be done |
|
220 </dd> |
|
221 </dl> |
|
222 <dl> |
|
223 <dt>Return:</dt> |
|
224 <dd> |
|
225 modified state |
|
226 </dd> |
|
227 </dl> |
|
228 <dl> |
|
229 <dt>Return Type:</dt> |
|
230 <dd> |
|
231 bytearray |
|
232 </dd> |
|
233 </dl> |
|
234 <a NAME="AES.__aes_invRound" ID="AES.__aes_invRound"></a> |
|
235 <h4>AES.__aes_invRound</h4> |
|
236 <b>__aes_invRound</b>(<i>state, roundKey</i>) |
|
237 <p> |
|
238 Private method to apply the 4 operations of the inverse round in |
|
239 sequence. |
|
240 </p> |
|
241 |
|
242 <dl> |
|
243 |
|
244 <dt><i>state</i> (bytearray)</dt> |
|
245 <dd> |
|
246 state to be worked on |
|
247 </dd> |
|
248 <dt><i>roundKey</i> (bytearray)</dt> |
|
249 <dd> |
|
250 round key to be used |
|
251 </dd> |
|
252 </dl> |
|
253 <dl> |
|
254 <dt>Return:</dt> |
|
255 <dd> |
|
256 modified state |
|
257 </dd> |
|
258 </dl> |
|
259 <dl> |
|
260 <dt>Return Type:</dt> |
|
261 <dd> |
|
262 bytearray |
|
263 </dd> |
|
264 </dl> |
|
265 <a NAME="AES.__aes_main" ID="AES.__aes_main"></a> |
|
266 <h4>AES.__aes_main</h4> |
|
267 <b>__aes_main</b>(<i>state, expandedKey, nbrRounds</i>) |
|
268 <p> |
|
269 Private method to do the AES encryption for one round. |
|
270 </p> |
|
271 <p> |
|
272 Perform the initial operations, the standard round, and the |
|
273 final operations of the forward AES, creating a round key for |
|
274 each round. |
|
275 </p> |
|
276 |
|
277 <dl> |
|
278 |
|
279 <dt><i>state</i> (bytearray)</dt> |
|
280 <dd> |
|
281 state to be worked on |
|
282 </dd> |
|
283 <dt><i>expandedKey</i> (bytearray)</dt> |
|
284 <dd> |
|
285 expanded key to be used |
|
286 </dd> |
|
287 <dt><i>nbrRounds</i> (int)</dt> |
|
288 <dd> |
|
289 number of rounds to be done |
|
290 </dd> |
|
291 </dl> |
|
292 <dl> |
|
293 <dt>Return:</dt> |
|
294 <dd> |
|
295 modified state |
|
296 </dd> |
|
297 </dl> |
|
298 <dl> |
|
299 <dt>Return Type:</dt> |
|
300 <dd> |
|
301 bytearray |
|
302 </dd> |
|
303 </dl> |
|
304 <a NAME="AES.__aes_round" ID="AES.__aes_round"></a> |
|
305 <h4>AES.__aes_round</h4> |
|
306 <b>__aes_round</b>(<i>state, roundKey</i>) |
|
307 <p> |
|
308 Private method to apply the 4 operations of the forward round in |
|
309 sequence. |
|
310 </p> |
|
311 |
|
312 <dl> |
|
313 |
|
314 <dt><i>state</i> (bytearray)</dt> |
|
315 <dd> |
|
316 state to be worked on |
|
317 </dd> |
|
318 <dt><i>roundKey</i> (bytearray)</dt> |
|
319 <dd> |
|
320 round key to be used |
|
321 </dd> |
|
322 </dl> |
|
323 <dl> |
|
324 <dt>Return:</dt> |
|
325 <dd> |
|
326 modified state |
|
327 </dd> |
|
328 </dl> |
|
329 <dl> |
|
330 <dt>Return Type:</dt> |
|
331 <dd> |
|
332 bytearray |
|
333 </dd> |
|
334 </dl> |
|
335 <a NAME="AES.__core" ID="AES.__core"></a> |
|
336 <h4>AES.__core</h4> |
|
337 <b>__core</b>(<i>data, iteration</i>) |
|
338 <p> |
|
339 Private method performing the key schedule core operation. |
|
340 </p> |
|
341 |
|
342 <dl> |
|
343 |
|
344 <dt><i>data</i> (bytearray)</dt> |
|
345 <dd> |
|
346 data to operate on |
|
347 </dd> |
|
348 <dt><i>iteration</i> (int)</dt> |
|
349 <dd> |
|
350 iteration counter |
|
351 </dd> |
|
352 </dl> |
|
353 <dl> |
|
354 <dt>Return:</dt> |
|
355 <dd> |
|
356 modified data |
|
357 </dd> |
|
358 </dl> |
|
359 <dl> |
|
360 <dt>Return Type:</dt> |
|
361 <dd> |
|
362 bytearray |
|
363 </dd> |
|
364 </dl> |
|
365 <a NAME="AES.__createRoundKey" ID="AES.__createRoundKey"></a> |
|
366 <h4>AES.__createRoundKey</h4> |
|
367 <b>__createRoundKey</b>(<i>expandedKey, roundKeyPointer</i>) |
|
368 <p> |
|
369 Private method to create a round key. |
|
370 </p> |
|
371 |
|
372 <dl> |
|
373 |
|
374 <dt><i>expandedKey</i> (bytearray)</dt> |
|
375 <dd> |
|
376 expanded key to be used |
|
377 </dd> |
|
378 <dt><i>roundKeyPointer</i> (int)</dt> |
|
379 <dd> |
|
380 position within the expanded key |
|
381 </dd> |
|
382 </dl> |
|
383 <dl> |
|
384 <dt>Return:</dt> |
|
385 <dd> |
|
386 round key |
|
387 </dd> |
|
388 </dl> |
|
389 <dl> |
|
390 <dt>Return Type:</dt> |
|
391 <dd> |
|
392 bytearray |
|
393 </dd> |
|
394 </dl> |
|
395 <a NAME="AES.__expandKey" ID="AES.__expandKey"></a> |
|
396 <h4>AES.__expandKey</h4> |
|
397 <b>__expandKey</b>(<i>key, size, expandedKeySize</i>) |
|
398 <p> |
|
399 Private method performing Rijndael's key expansion. |
|
400 </p> |
|
401 <p> |
|
402 Expands a 128, 192 or 256 bit key into a 176, 208 or 240 bit key. |
|
403 </p> |
|
404 |
|
405 <dl> |
|
406 |
|
407 <dt><i>key</i> (bytes or bytearray)</dt> |
|
408 <dd> |
|
409 key to be expanded |
|
410 </dd> |
|
411 <dt><i>size</i> (int)</dt> |
|
412 <dd> |
|
413 size of the key in bytes (16, 24 or 32) |
|
414 </dd> |
|
415 <dt><i>expandedKeySize</i> (int)</dt> |
|
416 <dd> |
|
417 size of the expanded key |
|
418 </dd> |
|
419 </dl> |
|
420 <dl> |
|
421 <dt>Return:</dt> |
|
422 <dd> |
|
423 expanded key |
|
424 </dd> |
|
425 </dl> |
|
426 <dl> |
|
427 <dt>Return Type:</dt> |
|
428 <dd> |
|
429 bytearray |
|
430 </dd> |
|
431 </dl> |
|
432 <a NAME="AES.__galois_multiplication" ID="AES.__galois_multiplication"></a> |
|
433 <h4>AES.__galois_multiplication</h4> |
|
434 <b>__galois_multiplication</b>(<i>a, b</i>) |
|
435 <p> |
|
436 Private method to perform a Galois multiplication of 8 bit characters |
|
437 a and b. |
|
438 </p> |
|
439 |
|
440 <dl> |
|
441 |
|
442 <dt><i>a</i> (bytes)</dt> |
|
443 <dd> |
|
444 first factor |
|
445 </dd> |
|
446 <dt><i>b</i> (bytes)</dt> |
|
447 <dd> |
|
448 second factor |
|
449 </dd> |
|
450 </dl> |
|
451 <dl> |
|
452 <dt>Return:</dt> |
|
453 <dd> |
|
454 result |
|
455 </dd> |
|
456 </dl> |
|
457 <dl> |
|
458 <dt>Return Type:</dt> |
|
459 <dd> |
|
460 bytes |
|
461 </dd> |
|
462 </dl> |
|
463 <a NAME="AES.__getRconValue" ID="AES.__getRconValue"></a> |
|
464 <h4>AES.__getRconValue</h4> |
|
465 <b>__getRconValue</b>(<i>num</i>) |
|
466 <p> |
|
467 Private method to retrieve a given Rcon value. |
|
468 </p> |
|
469 |
|
470 <dl> |
|
471 |
|
472 <dt><i>num</i> (int)</dt> |
|
473 <dd> |
|
474 position of the value |
|
475 </dd> |
|
476 </dl> |
|
477 <dl> |
|
478 <dt>Return:</dt> |
|
479 <dd> |
|
480 Rcon value |
|
481 </dd> |
|
482 </dl> |
|
483 <dl> |
|
484 <dt>Return Type:</dt> |
|
485 <dd> |
|
486 int |
|
487 </dd> |
|
488 </dl> |
|
489 <a NAME="AES.__getSBoxInvert" ID="AES.__getSBoxInvert"></a> |
|
490 <h4>AES.__getSBoxInvert</h4> |
|
491 <b>__getSBoxInvert</b>(<i>num</i>) |
|
492 <p> |
|
493 Private method to retrieve a given Inverted S-Box value. |
|
494 </p> |
|
495 |
|
496 <dl> |
|
497 |
|
498 <dt><i>num</i> (int)</dt> |
|
499 <dd> |
|
500 position of the value |
|
501 </dd> |
|
502 </dl> |
|
503 <dl> |
|
504 <dt>Return:</dt> |
|
505 <dd> |
|
506 value of the Inverted S-Box |
|
507 </dd> |
|
508 </dl> |
|
509 <dl> |
|
510 <dt>Return Type:</dt> |
|
511 <dd> |
|
512 int |
|
513 </dd> |
|
514 </dl> |
|
515 <a NAME="AES.__getSBoxValue" ID="AES.__getSBoxValue"></a> |
|
516 <h4>AES.__getSBoxValue</h4> |
|
517 <b>__getSBoxValue</b>(<i>num</i>) |
|
518 <p> |
|
519 Private method to retrieve a given S-Box value. |
|
520 </p> |
|
521 |
|
522 <dl> |
|
523 |
|
524 <dt><i>num</i> (int)</dt> |
|
525 <dd> |
|
526 position of the value |
|
527 </dd> |
|
528 </dl> |
|
529 <dl> |
|
530 <dt>Return:</dt> |
|
531 <dd> |
|
532 value of the S-Box |
|
533 </dd> |
|
534 </dl> |
|
535 <dl> |
|
536 <dt>Return Type:</dt> |
|
537 <dd> |
|
538 int |
|
539 </dd> |
|
540 </dl> |
|
541 <a NAME="AES.__mixColumn" ID="AES.__mixColumn"></a> |
|
542 <h4>AES.__mixColumn</h4> |
|
543 <b>__mixColumn</b>(<i>column, isInv</i>) |
|
544 <p> |
|
545 Private method to perform a galois multiplication of 1 column the |
|
546 4x4 matrix. |
|
547 </p> |
|
548 |
|
549 <dl> |
|
550 |
|
551 <dt><i>column</i> (bytearray)</dt> |
|
552 <dd> |
|
553 column to be worked on |
|
554 </dd> |
|
555 <dt><i>isInv</i> (bool)</dt> |
|
556 <dd> |
|
557 flag indicating an inverse operation |
|
558 </dd> |
|
559 </dl> |
|
560 <dl> |
|
561 <dt>Return:</dt> |
|
562 <dd> |
|
563 modified column |
|
564 </dd> |
|
565 </dl> |
|
566 <dl> |
|
567 <dt>Return Type:</dt> |
|
568 <dd> |
|
569 bytearray |
|
570 </dd> |
|
571 </dl> |
|
572 <a NAME="AES.__mixColumns" ID="AES.__mixColumns"></a> |
|
573 <h4>AES.__mixColumns</h4> |
|
574 <b>__mixColumns</b>(<i>state, isInv</i>) |
|
575 <p> |
|
576 Private method to perform a galois multiplication of the 4x4 matrix. |
|
577 </p> |
|
578 |
|
579 <dl> |
|
580 |
|
581 <dt><i>state</i> (bytearray)</dt> |
|
582 <dd> |
|
583 state to be worked on |
|
584 </dd> |
|
585 <dt><i>isInv</i> (bool)</dt> |
|
586 <dd> |
|
587 flag indicating an inverse operation |
|
588 </dd> |
|
589 </dl> |
|
590 <dl> |
|
591 <dt>Return:</dt> |
|
592 <dd> |
|
593 modified state |
|
594 </dd> |
|
595 </dl> |
|
596 <dl> |
|
597 <dt>Return Type:</dt> |
|
598 <dd> |
|
599 bytearray |
|
600 </dd> |
|
601 </dl> |
|
602 <a NAME="AES.__rotate" ID="AES.__rotate"></a> |
|
603 <h4>AES.__rotate</h4> |
|
604 <b>__rotate</b>(<i>data</i>) |
|
605 <p> |
|
606 Private method performing Rijndael's key schedule rotate operation. |
|
607 </p> |
|
608 <p> |
|
609 Rotate the data word eight bits to the left: eg, |
|
610 rotate(1d2c3a4f) == 2c3a4f1d. |
|
611 </p> |
|
612 |
|
613 <dl> |
|
614 |
|
615 <dt><i>data</i> (bytearray)</dt> |
|
616 <dd> |
|
617 data of size 4 |
|
618 </dd> |
|
619 </dl> |
|
620 <dl> |
|
621 <dt>Return:</dt> |
|
622 <dd> |
|
623 rotated data |
|
624 </dd> |
|
625 </dl> |
|
626 <dl> |
|
627 <dt>Return Type:</dt> |
|
628 <dd> |
|
629 bytearray |
|
630 </dd> |
|
631 </dl> |
|
632 <a NAME="AES.__shiftRow" ID="AES.__shiftRow"></a> |
|
633 <h4>AES.__shiftRow</h4> |
|
634 <b>__shiftRow</b>(<i>state, statePointer, nbr, isInv</i>) |
|
635 <p> |
|
636 Private method to shift the bytes of a row to the left. |
|
637 </p> |
|
638 |
|
639 <dl> |
|
640 |
|
641 <dt><i>state</i> (bytearray)</dt> |
|
642 <dd> |
|
643 state to be worked on |
|
644 </dd> |
|
645 <dt><i>statePointer</i> (int)</dt> |
|
646 <dd> |
|
647 index into the state |
|
648 </dd> |
|
649 <dt><i>nbr</i> (int)</dt> |
|
650 <dd> |
|
651 number of positions to shift |
|
652 </dd> |
|
653 <dt><i>isInv</i> (bool)</dt> |
|
654 <dd> |
|
655 flag indicating an inverse operation |
|
656 </dd> |
|
657 </dl> |
|
658 <dl> |
|
659 <dt>Return:</dt> |
|
660 <dd> |
|
661 modified state |
|
662 </dd> |
|
663 </dl> |
|
664 <dl> |
|
665 <dt>Return Type:</dt> |
|
666 <dd> |
|
667 bytearray |
|
668 </dd> |
|
669 </dl> |
|
670 <a NAME="AES.__shiftRows" ID="AES.__shiftRows"></a> |
|
671 <h4>AES.__shiftRows</h4> |
|
672 <b>__shiftRows</b>(<i>state, isInv</i>) |
|
673 <p> |
|
674 Private method to iterate over the 4 rows and call __shiftRow() with |
|
675 that row. |
|
676 </p> |
|
677 |
|
678 <dl> |
|
679 |
|
680 <dt><i>state</i> (bytearray)</dt> |
|
681 <dd> |
|
682 state to be worked on |
|
683 </dd> |
|
684 <dt><i>isInv</i> (bool)</dt> |
|
685 <dd> |
|
686 flag indicating an inverse operation |
|
687 </dd> |
|
688 </dl> |
|
689 <dl> |
|
690 <dt>Return:</dt> |
|
691 <dd> |
|
692 modified state |
|
693 </dd> |
|
694 </dl> |
|
695 <dl> |
|
696 <dt>Return Type:</dt> |
|
697 <dd> |
|
698 bytearray |
|
699 </dd> |
|
700 </dl> |
|
701 <a NAME="AES.__subBytes" ID="AES.__subBytes"></a> |
|
702 <h4>AES.__subBytes</h4> |
|
703 <b>__subBytes</b>(<i>state, isInv</i>) |
|
704 <p> |
|
705 Private method to substitute all the values from the state with the |
|
706 value in the SBox using the state value as index for the SBox. |
|
707 </p> |
|
708 |
|
709 <dl> |
|
710 |
|
711 <dt><i>state</i> (bytearray)</dt> |
|
712 <dd> |
|
713 state to be worked on |
|
714 </dd> |
|
715 <dt><i>isInv</i> (bool)</dt> |
|
716 <dd> |
|
717 flag indicating an inverse operation |
|
718 </dd> |
|
719 </dl> |
|
720 <dl> |
|
721 <dt>Return:</dt> |
|
722 <dd> |
|
723 modified state |
|
724 </dd> |
|
725 </dl> |
|
726 <dl> |
|
727 <dt>Return Type:</dt> |
|
728 <dd> |
|
729 bytearray |
|
730 </dd> |
|
731 </dl> |
|
732 <a NAME="AES.decrypt" ID="AES.decrypt"></a> |
|
733 <h4>AES.decrypt</h4> |
|
734 <b>decrypt</b>(<i>iput, key, size</i>) |
|
735 <p> |
|
736 Public method to decrypt a 128 bit input block against the given key |
|
737 of size specified. |
|
738 </p> |
|
739 |
|
740 <dl> |
|
741 |
|
742 <dt><i>iput</i> (bytearray)</dt> |
|
743 <dd> |
|
744 input data |
|
745 </dd> |
|
746 <dt><i>key</i> (bytes or bytearray)</dt> |
|
747 <dd> |
|
748 key to be used |
|
749 </dd> |
|
750 <dt><i>size</i> (int)</dt> |
|
751 <dd> |
|
752 key size (16, 24 or 32) |
|
753 </dd> |
|
754 </dl> |
|
755 <dl> |
|
756 <dt>Return:</dt> |
|
757 <dd> |
|
758 decrypted data |
|
759 </dd> |
|
760 </dl> |
|
761 <dl> |
|
762 <dt>Return Type:</dt> |
|
763 <dd> |
|
764 bytes |
|
765 </dd> |
|
766 </dl> |
|
767 <dl> |
|
768 |
|
769 <dt>Raises <b>ValueError</b>:</dt> |
|
770 <dd> |
|
771 key size is invalid |
|
772 </dd> |
|
773 </dl> |
|
774 <a NAME="AES.encrypt" ID="AES.encrypt"></a> |
|
775 <h4>AES.encrypt</h4> |
|
776 <b>encrypt</b>(<i>iput, key, size</i>) |
|
777 <p> |
|
778 Public method to encrypt a 128 bit input block against the given key |
|
779 of size specified. |
|
780 </p> |
|
781 |
|
782 <dl> |
|
783 |
|
784 <dt><i>iput</i> (bytearray)</dt> |
|
785 <dd> |
|
786 input data |
|
787 </dd> |
|
788 <dt><i>key</i> (bytes or bytearray)</dt> |
|
789 <dd> |
|
790 key to be used |
|
791 </dd> |
|
792 <dt><i>size</i> (int)</dt> |
|
793 <dd> |
|
794 key size (16, 24 or 32) |
|
795 </dd> |
|
796 </dl> |
|
797 <dl> |
|
798 <dt>Return:</dt> |
|
799 <dd> |
|
800 encrypted data |
|
801 </dd> |
|
802 </dl> |
|
803 <dl> |
|
804 <dt>Return Type:</dt> |
|
805 <dd> |
|
806 bytes |
|
807 </dd> |
|
808 </dl> |
|
809 <dl> |
|
810 |
|
811 <dt>Raises <b>ValueError</b>:</dt> |
|
812 <dd> |
|
813 key size is invalid |
|
814 </dd> |
|
815 </dl> |
|
816 <div align="right"><a href="#top">Up</a></div> |
|
817 <hr /> |
|
818 <hr /> |
|
819 <a NAME="AESModeOfOperation" ID="AESModeOfOperation"></a> |
|
820 <h2>AESModeOfOperation</h2> |
|
821 <p> |
|
822 Class implementing the different AES mode of operations. |
|
823 </p> |
|
824 |
|
825 <h3>Derived from</h3> |
|
826 None |
|
827 <h3>Class Attributes</h3> |
|
828 <table> |
|
829 <tr><td>ModeOfOperation</td></tr> |
|
830 <tr><td>aes</td></tr> |
|
831 </table> |
|
832 |
|
833 <h3>Class Methods</h3> |
|
834 <table> |
|
835 <tr><td>None</td></tr> |
|
836 </table> |
|
837 |
|
838 <h3>Methods</h3> |
|
839 <table> |
|
840 <tr> |
|
841 <td><a href="#AESModeOfOperation.__extractBytes">__extractBytes</a></td> |
|
842 <td>Private method to extract a range of bytes from the input.</td> |
|
843 </tr> |
|
844 <tr> |
|
845 <td><a href="#AESModeOfOperation.decrypt">decrypt</a></td> |
|
846 <td>Public method to perform the decryption operation.</td> |
|
847 </tr> |
|
848 <tr> |
|
849 <td><a href="#AESModeOfOperation.encrypt">encrypt</a></td> |
|
850 <td>Public method to perform the encryption operation.</td> |
|
851 </tr> |
|
852 </table> |
|
853 |
|
854 <h3>Static Methods</h3> |
|
855 <table> |
|
856 <tr><td>None</td></tr> |
|
857 </table> |
|
858 |
|
859 |
|
860 <a NAME="AESModeOfOperation.__extractBytes" ID="AESModeOfOperation.__extractBytes"></a> |
|
861 <h4>AESModeOfOperation.__extractBytes</h4> |
|
862 <b>__extractBytes</b>(<i>inputData, start, end, mode</i>) |
|
863 <p> |
|
864 Private method to extract a range of bytes from the input. |
|
865 </p> |
|
866 |
|
867 <dl> |
|
868 |
|
869 <dt><i>inputData</i> (bytes)</dt> |
|
870 <dd> |
|
871 input data |
|
872 </dd> |
|
873 <dt><i>start</i> (int)</dt> |
|
874 <dd> |
|
875 start index |
|
876 </dd> |
|
877 <dt><i>end</i> (int)</dt> |
|
878 <dd> |
|
879 end index |
|
880 </dd> |
|
881 <dt><i>mode</i> (int)</dt> |
|
882 <dd> |
|
883 mode of operation (0, 1, 2) |
|
884 </dd> |
|
885 </dl> |
|
886 <dl> |
|
887 <dt>Return:</dt> |
|
888 <dd> |
|
889 extracted bytes |
|
890 </dd> |
|
891 </dl> |
|
892 <dl> |
|
893 <dt>Return Type:</dt> |
|
894 <dd> |
|
895 bytearray |
|
896 </dd> |
|
897 </dl> |
|
898 <a NAME="AESModeOfOperation.decrypt" ID="AESModeOfOperation.decrypt"></a> |
|
899 <h4>AESModeOfOperation.decrypt</h4> |
|
900 <b>decrypt</b>(<i>cipherIn, originalsize, mode, key, size, IV</i>) |
|
901 <p> |
|
902 Public method to perform the decryption operation. |
|
903 </p> |
|
904 |
|
905 <dl> |
|
906 |
|
907 <dt><i>cipherIn</i> (bytes)</dt> |
|
908 <dd> |
|
909 data to be decrypted |
|
910 </dd> |
|
911 <dt><i>originalsize</i> (int)</dt> |
|
912 <dd> |
|
913 unencrypted string length (required for CBC) |
|
914 </dd> |
|
915 <dt><i>mode</i> (int)</dt> |
|
916 <dd> |
|
917 mode of operation (0, 1 or 2) |
|
918 </dd> |
|
919 <dt><i>key</i> (bytes)</dt> |
|
920 <dd> |
|
921 key to be used |
|
922 </dd> |
|
923 <dt><i>size</i> (int)</dt> |
|
924 <dd> |
|
925 length of the key (16, 24 or 32) |
|
926 </dd> |
|
927 <dt><i>IV</i> (bytearray)</dt> |
|
928 <dd> |
|
929 initialisation vector |
|
930 </dd> |
|
931 </dl> |
|
932 <dl> |
|
933 <dt>Return:</dt> |
|
934 <dd> |
|
935 decrypted data |
|
936 </dd> |
|
937 </dl> |
|
938 <dl> |
|
939 <dt>Return Type:</dt> |
|
940 <dd> |
|
941 bytes |
|
942 </dd> |
|
943 </dl> |
|
944 <dl> |
|
945 |
|
946 <dt>Raises <b>ValueError</b>:</dt> |
|
947 <dd> |
|
948 key size is invalid or decrypted data is invalid |
|
949 </dd> |
|
950 </dl> |
|
951 <a NAME="AESModeOfOperation.encrypt" ID="AESModeOfOperation.encrypt"></a> |
|
952 <h4>AESModeOfOperation.encrypt</h4> |
|
953 <b>encrypt</b>(<i>inputData, mode, key, size, IV</i>) |
|
954 <p> |
|
955 Public method to perform the encryption operation. |
|
956 </p> |
|
957 |
|
958 <dl> |
|
959 |
|
960 <dt><i>inputData</i> (bytes)</dt> |
|
961 <dd> |
|
962 data to be encrypted |
|
963 </dd> |
|
964 <dt><i>mode</i> (int)</dt> |
|
965 <dd> |
|
966 mode of operation (0, 1 or 2) |
|
967 </dd> |
|
968 <dt><i>key</i> (bytes)</dt> |
|
969 <dd> |
|
970 key to be used |
|
971 </dd> |
|
972 <dt><i>size</i> (int)</dt> |
|
973 <dd> |
|
974 length of the key (16, 24 or 32) |
|
975 </dd> |
|
976 <dt><i>IV</i> (bytearray)</dt> |
|
977 <dd> |
|
978 initialisation vector |
|
979 </dd> |
|
980 </dl> |
|
981 <dl> |
|
982 <dt>Return:</dt> |
|
983 <dd> |
|
984 tuple with mode of operation, length of the input data and |
|
985 the encrypted data |
|
986 </dd> |
|
987 </dl> |
|
988 <dl> |
|
989 <dt>Return Type:</dt> |
|
990 <dd> |
|
991 tuple of (int, int, bytes) |
|
992 </dd> |
|
993 </dl> |
|
994 <dl> |
|
995 |
|
996 <dt>Raises <b>ValueError</b>:</dt> |
|
997 <dd> |
|
998 key size is invalid or decrypted data is invalid |
|
999 </dd> |
|
1000 </dl> |
|
1001 <div align="right"><a href="#top">Up</a></div> |
|
1002 <hr /> |
|
1003 <hr /> |
|
1004 <a NAME="append_PKCS7_padding" ID="append_PKCS7_padding"></a> |
|
1005 <h2>append_PKCS7_padding</h2> |
|
1006 <b>append_PKCS7_padding</b>(<i>b</i>) |
|
1007 <p> |
|
1008 Function to pad the given data to a multiple of 16-bytes by PKCS7 padding. |
|
1009 </p> |
|
1010 |
|
1011 <dl> |
|
1012 |
|
1013 <dt><i>b</i> (bytes)</dt> |
|
1014 <dd> |
|
1015 data to be padded |
|
1016 </dd> |
|
1017 </dl> |
|
1018 <dl> |
|
1019 <dt>Return:</dt> |
|
1020 <dd> |
|
1021 padded data |
|
1022 </dd> |
|
1023 </dl> |
|
1024 <dl> |
|
1025 <dt>Return Type:</dt> |
|
1026 <dd> |
|
1027 bytes |
|
1028 </dd> |
|
1029 </dl> |
|
1030 <div align="right"><a href="#top">Up</a></div> |
|
1031 <hr /> |
|
1032 <hr /> |
|
1033 <a NAME="decryptData" ID="decryptData"></a> |
|
1034 <h2>decryptData</h2> |
|
1035 <b>decryptData</b>(<i>key, data, mode=AESModeOfOperation.ModeOfOperation["CBC"]</i>) |
|
1036 <p> |
|
1037 Module function to decrypt the given data with the given key. |
|
1038 </p> |
|
1039 |
|
1040 <dl> |
|
1041 |
|
1042 <dt><i>key</i> (bytes)</dt> |
|
1043 <dd> |
|
1044 key to be used for decryption |
|
1045 </dd> |
|
1046 <dt><i>data</i> (bytes)</dt> |
|
1047 <dd> |
|
1048 data to be decrypted (with initialization vector prepended) |
|
1049 </dd> |
|
1050 <dt><i>mode</i> (int)</dt> |
|
1051 <dd> |
|
1052 mode of operations (0, 1 or 2) |
|
1053 </dd> |
|
1054 </dl> |
|
1055 <dl> |
|
1056 <dt>Return:</dt> |
|
1057 <dd> |
|
1058 decrypted data |
|
1059 </dd> |
|
1060 </dl> |
|
1061 <dl> |
|
1062 <dt>Return Type:</dt> |
|
1063 <dd> |
|
1064 bytes |
|
1065 </dd> |
|
1066 </dl> |
|
1067 <dl> |
|
1068 |
|
1069 <dt>Raises <b>ValueError</b>:</dt> |
|
1070 <dd> |
|
1071 raised to indicate an invalid key size |
|
1072 </dd> |
|
1073 </dl> |
|
1074 <div align="right"><a href="#top">Up</a></div> |
|
1075 <hr /> |
|
1076 <hr /> |
|
1077 <a NAME="encryptData" ID="encryptData"></a> |
|
1078 <h2>encryptData</h2> |
|
1079 <b>encryptData</b>(<i>key, data, mode=AESModeOfOperation.ModeOfOperation["CBC"]</i>) |
|
1080 <p> |
|
1081 Module function to encrypt the given data with the given key. |
|
1082 </p> |
|
1083 |
|
1084 <dl> |
|
1085 |
|
1086 <dt><i>key</i> (bytes)</dt> |
|
1087 <dd> |
|
1088 key to be used for encryption |
|
1089 </dd> |
|
1090 <dt><i>data</i> (bytes)</dt> |
|
1091 <dd> |
|
1092 data to be encrypted |
|
1093 </dd> |
|
1094 <dt><i>mode</i> (int)</dt> |
|
1095 <dd> |
|
1096 mode of operations (0, 1 or 2) |
|
1097 </dd> |
|
1098 </dl> |
|
1099 <dl> |
|
1100 <dt>Return:</dt> |
|
1101 <dd> |
|
1102 encrypted data prepended with the initialization vector |
|
1103 </dd> |
|
1104 </dl> |
|
1105 <dl> |
|
1106 <dt>Return Type:</dt> |
|
1107 <dd> |
|
1108 bytes |
|
1109 </dd> |
|
1110 </dl> |
|
1111 <dl> |
|
1112 |
|
1113 <dt>Raises <b>ValueError</b>:</dt> |
|
1114 <dd> |
|
1115 raised to indicate an invalid key size |
|
1116 </dd> |
|
1117 </dl> |
|
1118 <div align="right"><a href="#top">Up</a></div> |
|
1119 <hr /> |
|
1120 <hr /> |
|
1121 <a NAME="strip_PKCS7_padding" ID="strip_PKCS7_padding"></a> |
|
1122 <h2>strip_PKCS7_padding</h2> |
|
1123 <b>strip_PKCS7_padding</b>(<i>b</i>) |
|
1124 <p> |
|
1125 Function to strip off PKCS7 padding. |
|
1126 </p> |
|
1127 |
|
1128 <dl> |
|
1129 |
|
1130 <dt><i>b</i> (bytes)</dt> |
|
1131 <dd> |
|
1132 data to be stripped |
|
1133 </dd> |
|
1134 </dl> |
|
1135 <dl> |
|
1136 <dt>Return:</dt> |
|
1137 <dd> |
|
1138 stripped data |
|
1139 </dd> |
|
1140 </dl> |
|
1141 <dl> |
|
1142 <dt>Return Type:</dt> |
|
1143 <dd> |
|
1144 bytes |
|
1145 </dd> |
|
1146 </dl> |
|
1147 <dl> |
|
1148 |
|
1149 <dt>Raises <b>ValueError</b>:</dt> |
|
1150 <dd> |
|
1151 data padding is invalid |
|
1152 </dd> |
|
1153 </dl> |
|
1154 <div align="right"><a href="#top">Up</a></div> |
|
1155 <hr /> |
|
1156 </body></html> |