Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° (AES) Rijndael
ΠΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ²ΡΠΌ ΡΡΡΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΡΡΠ° Π² NIST ΠΏΠΎΡΡΡΠΏΠΈΠ»ΠΎ 21 ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, 15 ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π»ΠΈ Π²ΡΠ΄Π²ΠΈΠ½ΡΡΡΠΌ ΠΊΡΠΈΡΠ΅ΡΠΈΡΠΌ. ΠΠ°ΡΠ΅ΠΌ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Ρ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π΄Π΅ΡΠΈΡΡΠΎΠ²ΠΊΠΎΠΉ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΡΠΊΡΠΏΠ΅ΡΡΠ½ΡΠ΅ ΠΎΡΠ΅Π½ΠΊΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ² ΠΏΠΎ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΠΈ. Π Π°Π²Π³ΡΡΡΠ΅ 1999 Π³ΠΎΠ΄Π° NIST ΠΎΠ±ΡΡΠ²ΠΈΠ» ΠΏΡΡΡ ΡΠΈΠ½Π°Π»ΠΈΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΏΡΠ°Π²ΠΎ Π½Π° ΡΡΠ°ΡΡΠΈΠ΅ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΉ… Π§ΠΈΡΠ°ΡΡ Π΅ΡΡ >
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° (AES) Rijndael (ΡΠ΅ΡΠ΅ΡΠ°Ρ, ΠΊΡΡΡΠΎΠ²Π°Ρ, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ)
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° (AES) Rijndael
Π¨ΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ — ΡΠΏΠΎΡΠΎΠ± ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠΊΡΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π² Π·Π°ΠΊΡΡΡΡΡ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ. ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π² Π½Π΅Π½Π°Π΄ΡΠΆΠ½ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°Ρ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΅Ρ ΠΏΠΎ Π½Π΅Π·Π°ΡΠΈΡΡΠ½Π½ΡΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ ΡΠ²ΡΠ·ΠΈ. Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΠΠ‘Π’ 28 147–89, ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΡΡΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°ΡΠΈΡΡΠΎΠ²ΡΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΡΠ²Π°Π½ΠΈΡ.
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ , ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»ΡΡΡΡΡ Π½Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΡΠΈΠΏΡΠΎΡΡΠΎΠΉΠΊΠΎΡΡΠΈ.
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΡΡΠΊΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»ΡΡΡΡΡ Π½Π°
Β· ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΠΎΠ΅ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅: ΠΏΠΎΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌ Π»ΠΈΡΠ°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠ°Ρ ΠΏΠΎΡΡΠΈΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ — ΠΊΠ»ΡΡΠ°, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ;
Β· Π°ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΠΎΠ΅ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅: ΠΏΠΎΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌ Π»ΠΈΡΠ°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ, ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΡΠΊΡΡΡΡΠΉ ΠΊΠ»ΡΡ, Π½ΠΎ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π·Π°ΠΊΡΡΡΡΠΉ ΠΊΠ»ΡΡ, ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ.
ΠΡΡΠΎΡΠΈΡ AES
Π Π΄Π°Π»Π΅ΠΊΠΎΠΌ 1998 Π³ΠΎΠ΄Ρ NIST ΠΎΠ±ΡΡΠ²ΠΈΠ» ΠΊΠΎΠ½ΠΊΡΡΡ Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠ΅Π³ΠΎ Π²ΡΠ΄Π²ΠΈΠ½ΡΡΡΠΌ ΠΈΠ½ΡΡΠΈΡΡΡΠΎΠΌ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌ. ΠΠ½ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» Π²ΡΠ΅ Π½Π΅ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ² Π½Π° ΡΠΎΠ»Ρ AES ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π» ΠΎΡ Π°Π²ΡΠΎΡΠΎΠ² Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΎ Π±Π°Π·ΠΎΠ²ΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π² Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΠΈΡΡΠ°ΡΠΈΠΈ Ρ DES, NIST ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ AES Π½Π΅ ΡΡΠ°Π» ΠΎΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΠΈ, ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Π½ΡΠ΅ ΠΊ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ± ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ²-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ².
Π§ΡΠΎΠ±Ρ Π±ΡΡΡ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½Π½ΡΠΌ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ°, Π°Π»Π³ΠΎΡΠΈΡΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ»:
ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΡΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ;
ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π±Π»ΠΎΡΠ½ΡΠΉ ΡΠΈΡΡ;
ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ 128-ΡΠ°Π·ΡΡΠ΄Π½ΡΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΊΠ»ΡΡΠ°ΠΌΠΈ ΡΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² (128, 192 ΠΈ 256 ΡΠ°Π·ΡΡΠ΄ΠΎΠ²).
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ°ΠΌ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»ΠΎΡΡ:
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π»Π΅Π³ΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌΡΠ΅ ΠΊΠ°ΠΊ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎ (Π² ΠΌΠΈΠΊΡΠΎΡΠΈΠΏΠ°Ρ ), ΡΠ°ΠΊ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎ (Π½Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°Ρ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ );
ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° 32-ΡΠ°Π·ΡΡΠ΄Π½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΡ;
Π½Π΅ ΡΡΠ»ΠΎΠΆΠ½ΡΡΡ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ ΡΠΈΡΡΠ° Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΠΎΡΠΎΠ½Ρ Π±ΡΠ»ΠΈ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΉ ΠΊΡΠΈΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ· Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π² Π½Π΅ΠΌ Π½Π΅ Π·Π°Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π½Π΅Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΠΏΡΠ΅ΡΠ΅Π½Π΄ΡΡΡΠΈΠΉ Π½Π° ΡΠΎΠ»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ°, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ ΠΌΠΈΡΡ Π½Π° Π½Π΅ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΠΈ Π±Π΅Π· ΠΏΠ»Π°ΡΡ Π·Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΠ΅Π½ΡΠΎΠΌ.
ΠΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ²ΡΠΌ ΡΡΡΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΡΡΠ° Π² NIST ΠΏΠΎΡΡΡΠΏΠΈΠ»ΠΎ 21 ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, 15 ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π»ΠΈ Π²ΡΠ΄Π²ΠΈΠ½ΡΡΡΠΌ ΠΊΡΠΈΡΠ΅ΡΠΈΡΠΌ. ΠΠ°ΡΠ΅ΠΌ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Ρ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π΄Π΅ΡΠΈΡΡΠΎΠ²ΠΊΠΎΠΉ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΡΠΊΡΠΏΠ΅ΡΡΠ½ΡΠ΅ ΠΎΡΠ΅Π½ΠΊΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ² ΠΏΠΎ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΠΈ. Π Π°Π²Π³ΡΡΡΠ΅ 1999 Π³ΠΎΠ΄Π° NIST ΠΎΠ±ΡΡΠ²ΠΈΠ» ΠΏΡΡΡ ΡΠΈΠ½Π°Π»ΠΈΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΏΡΠ°Π²ΠΎ Π½Π° ΡΡΠ°ΡΡΠΈΠ΅ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΉ. 2 ΠΎΠΊΡΡΠ±ΡΡ 2000 Π³ΠΎΠ΄Π° NIST ΡΠΎΠΎΠ±ΡΠΈΠ» ΠΎ ΡΠ²ΠΎΠ΅ΠΌ Π²ΡΠ±ΠΎΡΠ΅ — ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΊΠΎΠ½ΠΊΡΡΡΠ° ΡΡΠ°Π» Π°Π»Π³ΠΎΡΠΈΡΠΌ RIJNDAEL (ΠΏΡΠΎΠΈΠ·Π½ΠΎΡΠΈΡΡΡ ΠΊΠ°ΠΊ «ΡΠ°ΠΉΠ½Π΄ΠΎΠ»») Π±Π΅Π»ΡΠ³ΠΈΠΉΡΠΊΠΈΡ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΎΠ² ΠΠΈΠ½ΡΠ΅Π½ΡΠ° Π Π°ΠΉΠΌΠ°Π½Π° ΠΈ ΠΠΎΠ°Π½Π° ΠΠ°ΠΌΠ°Π½Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ° ΠΊΠ°ΠΊ FIPS 197 (Federal Information Processing Standard).
ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΠΎΡΡΠ°Π΅ΡΡΡ Π·Π°Π³Π°Π΄ΠΊΠΎΠΉ, Π·Π°ΡΠ΅ΠΌ Π² ΡΠΎΡΡΠΈΠΉΡΠΊΠΎΠΌ Π²ΡΠ·Π΅ ΠΏΡΠ΅ΠΏΠΎΠ΄Π°ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΡ ΠΈΠ½ΠΎΡΡΡΠ°Π½Π½ΡΡ Π³ΠΎΡΡΠ΄Π°ΡΡΡΠ². ΠΠΈΠ΄ΠΈΠΌΠΎ, ΠΈΡΡ ΠΎΠ΄ΡΡ ΠΈΠ· ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°, ΡΡΠΎ Π²ΡΠ°Π³Π° Π½Π°Π΄ΠΎ Π·Π½Π°ΡΡ Π² Π»ΠΈΡΠΎ:). ΠΠ°Π΄Π½ΠΎ, Π² ΠΎΠ±ΡΠ΅ΠΌ-ΡΠΎ, ΡΡΠΎ Π½Π΅ Π½Π°ΡΠ΅ Π΄Π΅Π»ΠΎ. ΠΠ°ΠΌ Π½Π°Π΄ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ½ΠΎΠ²Ρ Π½Π°ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π‘Π¨Π.
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ AES
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ
Block — ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π±ΠΈΡ, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΡΡΠΎΠΈΡ input, output, State ΠΈ Round Key. Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ Block ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π±Π°ΠΉΡ
Cipher Key — ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΉ, ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠ»ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Key Expansion ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΎΠΉ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π½Π°Π±ΠΎΡ ΠΊΠ»ΡΡΠ΅ΠΉ Π΄Π»Ρ ΡΠ°ΡΠ½Π΄ΠΎΠ² (Round Keys); ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ ΠΊΠ°ΠΊ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Π±Π°ΠΉΡΠΎΠ², ΠΈΠΌΠ΅ΡΡΠΈΠΉ ΡΠ΅ΡΡΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΈ Nk ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ.
Ciphertext — Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ
Key Expansion — ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Round Keys ΠΈΠ· Cipher Key
Round Key — Round Keys ΠΏΠΎΠ»ΡΡΠ°ΡΡΡΡΠΈΠ· Cipher Key ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Key Expansion. ΠΠ½ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΊ State ΠΏΡΠΈ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ
State — ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ ΠΊΠ°ΠΊ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Π±Π°ΠΉΡΠΎΠ² ΠΈΠΌΠ΅ΡΡΠΈΠΉ 4 ΡΡΡΠΎΠΊΠΈ ΠΈ Nb ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ
S-box — Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π·Π°ΠΌΠ΅Π½, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°ΡΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡΡ Π·Π°ΠΌΠ΅Π½Ρ Π±Π°ΠΉΡ ΠΈ Π² ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ Key Expansion Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΠΉ Π·Π°ΠΌΠ΅Π½Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π±Π°ΠΉΡΠ°. ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΡΠΉS-box — ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½ΠΈΠΆΠ΅.
Nb — ΡΠΈΡΠ»ΠΎ ΡΡΠΎΠ»Π±ΡΠΎΠ² (32-ΡΡ Π±ΠΈΡΠ½ΡΡ ΡΠ»ΠΎΠ²), ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΡ State.
ΠΠ»Ρ, AES Nb = 4
Nk — ΡΠΈΡΠ»ΠΎ 32-ΡΡ Π±ΠΈΡΠ½ΡΡ ΡΠ»ΠΎΠ², ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΡ ΡΠΈΡΡΠΎΠΊΠ»ΡΡ.
ΠΠ»Ρ AES, Nk = 4,6, ΠΈΠ»ΠΈ 8
Nr — ΡΠΈΡΠ»ΠΎ ΡΠ°ΡΠ½Π΄ΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Nk ΠΈ Nb. ΠΠ»Ρ AES, Nr = 10, 12, 14
Rcon[] — ΠΌΠ°ΡΡΠΈΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π±ΠΈΡΠΎΠ² 32-Ρ ΡΠ°Π·ΡΡΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° ΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΌ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΡΠ½Π΄Π°. ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΡΠΉ Rcon[] ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½ΠΈΠΆΠ΅.
S-box
Sbox = array (
0x63,0x7c, 0×77,0x7b, 0xf2,0x6b, 0x6f, 0xc5,0×30,0×01,0×67,0x2b, 0xfe, 0xd7,0xab, 0×76,
0xca, 0×82,0xc9,0x7d, 0xfa, 0×59,0×47,0xf0,0xad, 0xd4,0xa2,0xaf, 0x9c, 0xa4,0×72,0xc0,
0xb7,0xfd, 0×93,0×26,0×36,0x3f, 0xf7,0xcc, 0×34,0xa5,0xe5,0xf1,0×71,0xd8,0×31,0×15,
0x04,0xc7,0×23,0xc3,0×18,0×96,0×05,0x9a, 0×07,0×12,0×80,0xe2,0xeb, 0×27,0xb2,0×75,
0x09,0×83,0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,0×52,0x3b, 0xd6,0xb3,0×29,0xe3,0x2f, 0×84,
0x53,0xd1,0×00,0xed, 0×20,0xfc, 0xb1,0x5b, 0x6a, 0xcb, 0xbe, 0×39,0x4a, 0x4c, 0×58,0xcf,
0xd0,0xef, 0xaa, 0xfb, 0×43,0x4d, 0×33,0×85,0×45,0xf9,0×02,0x7f, 0×50,0x3c, 0x9f, 0xa8,
0x51,0xa3,0×40,0x8f, 0×92,0x9d, 0×38,0xf5,0xbc, 0xb6,0xda, 0×21,0×10,0xff, 0xf3,0xd2,
0xcd, 0x0c, 0×13,0xec, 0x5f, 0×97,0×44,0×17,0xc4,0xa7,0x7e, 0x3d, 0×64,0x5d, 0×19,0×73,
0x60,0×81,0x4f, 0xdc, 0×22,0x2a, 0×90,0×88,0×46,0xee, 0xb8,0×14,0xde, 0x5e, 0x0b, 0xdb,
0xe0,0×32,0x3a, 0x0a, 0×49,0×06,0×24,0x5c, 0xc2,0xd3,0xac, 0×62,0×91,0×95,0xe4,0×79,
0xe7,0xc8,0×37,0x6d, 0x8d, 0xd5,0x4e, 0xa9,0x6c, 0×56,0xf4,0xea, 0×65,0x7a, 0xae, 0×08,
0xba, 0×78,0×25,0x2e, 0x1c, 0xa6,0xb4,0xc6,0xe8,0xdd, 0×74,0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70,0x3e, 0xb5,0×66,0×48,0×03,0xf6,0x0e, 0×61,0×35,0×57,0xb9,0×86,0xc1,0x1d, 0x9e,
0xe1,0xf8,0×98,0×11,0×69,0xd9,0x8e, 0×94,0x9b, 0x1e, 0×87,0xe9,0xce, 0×55,0×28,0xdf,
0x8c, 0xa1,0×89,0x0d, 0xbf, 0xe6,0×42,0×68,0×41,0×99,0x2d, 0x0f, 0xb0,0×54,0xbb, 0×16,
);
Rcon[]
Rcon = array (
array (0×00, 0×00, 0×00, 0×00),
array (0×01, 0×00, 0×00, 0×00),
array (0×02, 0×00, 0×00, 0×00),
array (0×04, 0×00, 0×00, 0×00),
array (0×08, 0×00, 0×00, 0×00),
array (0×10, 0×00, 0×00, 0×00),
array (0×20, 0×00, 0×00, 0×00),
array (0×40, 0×00, 0×00, 0×00),
array (0×80, 0×00, 0×00, 0×00),
array (0x1b, 0×00, 0×00, 0×00),
array (0×36, 0×00, 0×00, 0×00),
);
ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ
AddRoundKey () — ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΡΠΈ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ Round Key XOR’ΠΈΡΡΡ c State. ΠΠ»ΠΈΠ½Π° RoundKey ΡΠ°Π²Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΡ State (ΡΠ΅, Π΅ΡΠ»ΠΈ Nb = 4, ΡΠΎ Π΄Π»ΠΈΠ½Π° RoundKey ΡΠ°Π²Π½Π° 128 Π±ΠΈΡ ΠΈΠ»ΠΈ 16 Π±Π°ΠΉΡ)
InvMixColumns () — ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΡΠΈ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ MixColumns ()
InvShiftRows () — ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΡΠΈ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ShiftRows ()
InvSubBytes () — ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΡΠΈ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ SubBytes ()
MixColumns () — ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΡΠΈ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠ°Ρ Π±Π΅ΡΠ΅Ρ Π²ΡΠ΅ ΡΡΠΎΠ»Π±ΡΡ State ΠΈ ΡΠΌΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΈΡ Π΄Π°Π½Π½ΡΠ΅ (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°), ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΡΠΎΠ»Π±ΡΡ
RotWord () — ΡΡΠ½ΠΊΡΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°ΡΡΡ Π² ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ Key Expansion, ΠΊΠΎΡΠΎΡΠ°Ρ Π±Π΅ΡΠ΅Ρ 4-Ρ Π±Π°ΠΉΡΠ½ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ Π½Π°Π΄ Π½ΠΈΠΌ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΡ
ShiftRows () — ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΡΠΈ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ State, ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΌΠ΅ΡΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ State Π½Π° ΡΠ°Π·Π½ΡΠ΅ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ
SubBytes () — ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΡΠΈ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ State ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π±Π°ΠΉΡΠΎΠ² (S-box), ΠΏΡΠΈΠΌΠ΅Π½ΡΡ Π΅Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π±Π°ΠΉΡΡ State
SubWord () — ΡΡΠ½ΠΊΡΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ Π² ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ Key Expansion, ΠΊΠΎΡΠΎΡΠ°Ρ Π±Π΅ΡΠ΅Ρ Π½Π° Π²Ρ ΠΎΠ΄Π΅ ΡΠ΅ΡΡΡΡΡ -Π±Π°ΠΉΡΠ½ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡ S-box ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· ΡΠ΅ΡΡΡΡΡ Π±Π°ΠΉΡΠΎΠ² Π²ΡΠ΄Π°ΡΡ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ
Π¨ΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅
AES ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΌ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅ Rijndael. ΠΠ»Ρ AES Π΄Π»ΠΈΠ½Π° input (Π±Π»ΠΎΠΊΠ° Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ ) ΠΈ State (ΡΠΎΡΡΠΎΡΠ½ΠΈΡ) ΠΏΠΎΡΡΠΎΡΠ½Π½Π° ΠΈ ΡΠ°Π²Π½Π° 128 Π±ΠΈΡ, Π° Π΄Π»ΠΈΠ½Π° ΡΠΈΡΡΠΎΠΊΠ»ΡΡΠ° K ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ 128, 192, ΠΈΠ»ΠΈ 256 Π±ΠΈΡ. ΠΡΠΈ ΡΡΠΎΠΌ, ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Rijndael Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ Π΄Π»ΠΈΠ½Ρ ΠΊΠ»ΡΡΠ° ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ Π±Π»ΠΎΠΊΠ° ΠΎΡ 128 Π΄ΠΎ 256 Π±ΠΈΡ Ρ ΡΠ°Π³ΠΎΠΌ Π² 32 Π±ΠΈΡΠ°. ΠΠ»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ Π΄Π»ΠΈΠ½ input, State ΠΈ Cipher Key Π² Π±Π°ΠΉΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½ΠΎΡΠ°ΡΠΈΡ Nb = 4 Π΄Π»Ρ input ΠΈ State, Nk = 4, 6, 8 Π΄Π»Ρ Cipher Key ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ Π΄Π»ΠΈΠ½ ΠΊΠ»ΡΡΠ΅ΠΉ.
Π Π½Π°ΡΠ°Π»Π΅ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ input ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΡΡ Π² ΠΌΠ°ΡΡΠΈΠ² State ΠΏΠΎ ΠΏΡΠ°Π²ΠΈΠ»Ρ s [r, c] = in [r + 4c], Π΄Π»Ρ ΠΈ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΊ State ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° AddRoundKey () ΠΈ Π·Π°ΡΠ΅ΠΌ State ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ (ΡΠ°ΡΠ½Π΄) 10, 12, ΠΈΠ»ΠΈ 14 ΡΠ°Π· (Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π΄Π»ΠΈΠ½Ρ ΠΊΠ»ΡΡΠ°), ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π°Π΄ΠΎ ΡΡΠ΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ°ΡΠ½Π΄ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ . Π ΠΈΡΠΎΠ³Π΅, ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΠ°ΡΠ½Π΄Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ, State ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΡΡ Π² output ΠΏΠΎ ΠΏΡΠ°Π²ΠΈΠ»Ρ out [r + 4c] = s [r, c], Π΄Π»Ρ ΠΈ.
ΠΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ SubBytes (), ShiftRows (), MixColumns (), ΠΈ AddRoundKey () — ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ State. ΠΠ°ΡΡΠΈΠ² w[] - ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ key schedule.
Cipher (byte in [4*Nb], byte out [4*Nb], word w [Nb*(Nr+1)])
begin
byte state [4, Nb]
state = in
AddRoundKey (state, w [0, Nb-1])
for round = 1 step 1 to Nr-1
SubBytes (state)
ShiftRows (state)
MixColumns (state)
AddRoundKey (state, w [round*Nb, (round+1)*Nb-1])
end for
SubBytes (state)
ShiftRows (state)
AddRoundKey (state, w [Nr*Nb, (Nr+1)*Nb-1])
out = state
end
SubBytes ()
Π ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ SubBytes, ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±Π°ΠΉΡ Π² state Π·Π°ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ Π² ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ 8-Π±ΠΈΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΏΠΎΠΈΡΠΊΠ°, S; bij = S (aij).
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° SubBytes () ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±Π°ΠΉΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Ρ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ Π·Π°ΠΌΠ΅Π½Ρ Π±Π°ΠΉΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π·Π°ΠΌΠ΅Π½ (S-box). Π’Π°ΠΊΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ S-box ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ°Π³ΠΎΠ². ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Π²Π·ΡΡΠΈΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° Π² ΠΏΠΎΠ»Π΅ ΠΠ°Π»ΡΠ°. ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π±Π°ΠΉΡΡ b ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΡΡΠΎΠΈΡ S-box ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ:
Π³Π΄Π΅, ΠΈ Π³Π΄Π΅ bi Π΅ΡΡΡ i-ΡΠΉ Π±ΠΈΡ b, Π° ci — i-ΡΠΉ Π±ΠΈΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ c = 6316 = 9910 = 11 000 112. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ Π·Π°ΡΠΈΡΠ° ΠΎΡ Π°ΡΠ°ΠΊ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΡ Π½Π° ΠΏΡΠΎΡΡΡΡ Π°Π»Π³Π΅Π±ΡΠ°ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°Ρ .
ShiftRows ()
Π ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ ShiftRows, Π±Π°ΠΉΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ state ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π²ΠΈΠ³Π°ΡΡΡΡ Π²Π»Π΅Π²ΠΎ. Π Π°Π·ΠΌΠ΅Ρ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π±Π°ΠΉΡΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π΅Ρ Π½ΠΎΠΌΠ΅ΡΠ°
ShiftRows ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ State. ΠΡΠΈ ΡΡΠΎΠΉ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΡΡΠΎΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π²ΠΈΠ³Π°ΡΡΡΡ Π½Π° r Π±Π°ΠΉΡ ΠΏΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΠΈ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π½ΠΎΠΌΠ΅ΡΠ° ΡΡΡΠΎΠΊΠΈ. ΠΠ»Ρ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ r = 0, Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ r = 1 Π ΠΈ Ρ. Π΄. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ShiftRows ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π±Π°ΠΉΡΠΎΠ² ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ. ΠΠ»Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Rijndael ΠΏΠ°ΡΡΠ΅ΡΠ½ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΡΠΎΠΊ Π΄Π»Ρ 128- ΠΈ 192-Π±ΠΈΡΠ½ΡΡ ΡΡΡΠΎΠΊ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ Π±Π»ΠΎΠΊΠ° ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 256 Π±ΠΈΡ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΡΠ΅ΠΌ, ΡΡΠΎ 2, 3, ΠΈ 4-Π΅ ΡΡΡΠΎΠΊΠΈ ΡΠΌΠ΅ΡΠ°ΡΡΡΡ Π½Π° 1, 3, ΠΈ 4 Π±Π°ΠΉΡΠ°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
MixColumns ()
Π ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ MixColumns, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ½ΠΎΠΆΠ°Π΅ΡΡΡ Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»Π΅Π½ΠΎΠΌ c (x).
Π ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ MixColumns, ΡΠ΅ΡΡΡΠ΅ Π±Π°ΠΉΡΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ State ΡΠΌΠ΅ΡΠΈΠ²Π°ΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΠΌΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ. MixColumns ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°ΠΌ, ΡΡΠ°ΠΊΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΈΠ· Π½ΠΈΡ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌ ΡΠ΅ΡΠ²ΡΡΡΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ. ΠΠ°Π΄ ΡΡΠΈΠΌΠΈ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ°ΠΌΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² GF (28) ΠΏΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ x4 + 1 Π½Π° ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»Π΅Π½ c (x) = 3×3 + x2 + x + 2. ΠΠΌΠ΅ΡΡΠ΅ Ρ ShiftRows, MixColumns Π²Π½ΠΎΡΠΈΡ Π΄ΠΈΡΡΡΠ·ΠΈΡ Π² ΡΠΈΡΡ
AddRoundKey ()
Π ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ AddRoundKey, ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±Π°ΠΉΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΡΡ Ρ RoundKey ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ XOR operation (?).
Π ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ AddRoundKey, RoundKey ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΡΠ½Π΄Π° ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΡΡ ΡΠΎ State. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΡΠ½Π΄Π° Roundkey ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΈΠ· CipherKey ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ KeyExpansion; ΠΊΠ°ΠΆΠ΄ΡΠΉ RoundKey ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΡΡΠΎ ΠΈ State. ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΡΠΉ XOR ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ° State Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ Π±Π°ΠΉΡΠΎΠΌ RoundKey.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠ»ΡΡΠ°
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠ»ΡΡΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ:
Β· ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ°
Β· ΠΠ»Π³ΠΎΡΠΈΡΠΌ Π²ΡΠ±ΠΎΡΠ° ΡΠ°ΡΠ½Π΄ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° (ΠΊΠ»ΡΡΠ° ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ)
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ°
AES Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ KeyExpansion () ΠΈ ΠΏΠΎΠ΄Π°Π²Π°Ρ Π² Π½Π΅Ρ Cipher Key, K, ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΊΠ»ΡΡΠΈ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠ°ΡΠ½Π΄ΠΎΠ². ΠΡΠ΅Π³ΠΎ ΠΎΠ½Π° ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Nb*(Nr + 1) ΡΠ»ΠΎΠ²: ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°Π±ΠΎΡ ΠΈΠ· Nb ΡΠ»ΠΎΠ², ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· Nr ΡΠ°ΡΠ½Π΄ΠΎΠ² ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Nb ΠΊΠ»ΡΡΠ΅Π²ΡΡ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ . ΠΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΊΠ»ΡΡΠ΅ΠΉ Π΄Π»Ρ ΡΠ°ΡΠ½Π΄ΠΎΠ² ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ,. ΠΠ»Π³ΠΎΡΠΈΡΠΌ KeyExpansion () ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² ΠΏΡΠ΅Π²Π΄ΠΎ ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅.
Π€ΡΠ½ΠΊΡΠΈΡ SubWord () Π±Π΅ΡΠ΅Ρ ΡΠ΅ΡΡΡΡΡ Π±Π°ΠΉΡΠΎΠ²ΠΎΠ΅ Π²Ρ ΠΎΠ΄Π½ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ S-box ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· ΡΠ΅ΡΡΡΡΡ Π±Π°ΠΉΡΠΎΠ² ΡΠΎ, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ ΠΏΠΎΠ΄Π°Π΅ΡΡΡ Π½Π° Π²ΡΡ ΠΎΠ΄. ΠΠ° Π²Ρ ΠΎΠ΄ RotWord () ΠΏΠΎΠ΄Π°Π΅ΡΡΡ ΡΠ»ΠΎΠ²ΠΎ [a0, a1, a2, a3] ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½Π° ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ [a1, a2, a3, a0]. ΠΠ°ΡΡΠΈΠ² ΡΠ»ΠΎΠ², ΡΠ»ΠΎΠ² ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΉ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΡΠ½Π΄Π°, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ [xi? 1,00,00,00], Π³Π΄Π΅ x = {02}, Π° xi? 1 ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ΅ΠΏΠ΅Π½ΡΡ x Π² (i Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ 1).
ΠΠ· ΡΠΈΡΡΠ½ΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ²ΡΠ΅ Nk ΡΠ»ΠΎΠ² ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ Cipher Key. Π ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΡΠ»ΠΎΠ²ΠΎ, w[i], ΠΊΠ»Π°Π΄ΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ XOR w [i? 1] ΠΈ, ΡΠ΅ XOR’Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΈ Π½Π° Nk ΠΏΠΎΠ·ΠΈΡΠΈΠΉ ΡΠ°Π½ΡΡΠ΅ ΡΠ»ΠΎΠ². ΠΠ»Ρ ΡΠ»ΠΎΠ², ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΊΠΎΡΠΎΡΡΡ ΠΊΡΠ°ΡΠ½Π° Nk, ΠΏΠ΅ΡΠ΅Π΄ XOR’ΠΎΠΌ ΠΊ w [i-1] ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΡΠ°ΡΡΠΎΡΠΌΠ°ΡΠΈΡ, Π·Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ XOR Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ ΡΠ°ΡΠ½Π΄Π° Rcon[i]. Π£ΠΊΠ°Π·Π°Π½Π½Π°Ρ Π²ΡΡΠ΅ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ΄Π²ΠΈΠ³Π° Π±Π°ΠΉΡΠΎΠ² Π² ΡΠ»ΠΎΠ²Π΅ (RotWord ()), Π·Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° SubWord () — ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ SubBytes (), ΡΠΎΠ»ΡΠΊΠΎ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ ΠΈ Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ Π² ΡΠ»ΠΎΠ²ΠΎ.
ΠΠ°ΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° KeyExpansion () Π΄Π»Ρ 256 Π±ΠΈΡΠ½ΠΎΠ³ΠΎ Cipher Key Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΡΠ΅Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ 128 ΠΈ 192 Π±ΠΈΡΠ½ΡΡ ΡΠΈΡΡΠΎΠΊΠ»ΡΡΠ΅ΠΉ. ΠΡΠ»ΠΈ Nk = 8 ΠΈ i? 4 ΠΊΡΠ°ΡΠ½ΠΎ Nk, ΡΠΎ SubWord () ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ w [i? 1] Π΄ΠΎ XOR’Π°.
KeyExpansion (byte key [4*Nk], word w [Nb*(Nr+1)], Nk)
ΠΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ Π΄Π»Ρ Key Expansion
begin
word temp
i = 0;
while (i < Nk)
w[i] = word (key[4*i], key [4*i+1], key [4*i+2], key [4*i+3])
i = i+1
end while
i = Nk
while (i < Nb * (Nr+1))
temp = w [i-1]
if (i mod Nk = 0)
temp = SubWord (RotWord (temp)) xor Rcon [i/Nk]
else if (Nk > 6 and i mod Nk = 4)
temp = SubWord (temp)
end if
w[i] = w [i-Nk] xor temp
i = i + 1
end while
end
ΠΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ Π΄Π»Ρ Key Expansion
Π Π°ΡΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄Π΄Π»Ρ Inverse Cipher
InvCipher (byte in [4*Nb], byte out [4*Nb], word w [Nb*(Nr+1)])
begin
byte state [4, Nb]
state = in
AddRoundKey (state, w [Nr*Nb, (Nr+1)*Nb-1])
for round = Nr-1 step -1 downto 1
InvShiftRows (state)
InvSubBytes (state)
AddRoundKey (state, w [round*Nb, (round+1)*Nb-1])
InvMixColumns (state)
end for
InvShiftRows (state)
InvSubBytes (state)
AddRoundKey (state, w [Nr*Nb, (Nr+1)*Nb-1])
out = state
end
ΠΠ»Π³ΠΎΡΠΈΡΠΌ Π²ΡΠ±ΠΎΡΠ° ΡΠ°ΡΠ½Π΄ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°
ΠΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ i ΡΠ°ΡΠ½Π΄ΠΎΠ²ΡΠΉ ΠΊΠ»ΡΡ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ AddRoundKey Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°Π΄ΠΎ.
ΠΠ°ΡΠΈΠ°Π½ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°
ΠΠ° Π±Π°Π·Π΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Rijndael, Π»Π΅ΠΆΠ°ΡΠ΅Π³ΠΎ Π² ΠΎΡΠ½ΠΎΠ²Π΅ AES, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠ΅ ΠΊΡΠΈΠΏΡΠΎΠ°Π»Π³ΠΎΡΠΈΡΠΌΡ. Π‘ΡΠ΅Π΄ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ — ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΊΠΎΠ½ΠΊΡΡΡΠ° Nessie: Anubis Π½Π° ΠΈΠ½Π²ΠΎΠ»ΡΡΠΈΡΡ , Π°Π²ΡΠΎΡΠΎΠΌ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΠΈΠ½ΡΠ΅Π½Ρ Π ΡΠΉΠΌΠ΅Π½ ΠΈ ΡΡΠΈΠ»Π΅Π½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠΈΡΡΠ° — Grand Cru ΠΠΎΡ Π°Π½Π° ΠΠΎΡΡΡΠ°.
ΠΡΠΈΠΏΡΠΎΡΡΠΎΠΉΠΊΠΎΡΡΡ
Π ΠΈΡΠ½Π΅ 2003 Π³ΠΎΠ΄Π° ΠΠ³Π΅Π½ΡΡΡΠ²ΠΎ Π½Π°ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π‘Π¨Π ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΎ, ΡΡΠΎ ΡΠΈΡΡ AES ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π°Π΄ΡΠΆΠ½ΡΠΌ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΡΠ²Π΅Π΄Π΅Π½ΠΈΠΉ, ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΡ Π³ΠΎΡΡΠ΄Π°ΡΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ°ΠΉΠ½Ρ (Π°Π½Π³Π». classified information). ΠΠΏΠ»ΠΎΡΡ Π΄ΠΎ ΡΡΠΎΠ²Π½Ρ SECRET Π±ΡΠ»ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠΈ Π΄Π»ΠΈΠ½ΠΎΠΉ 128 Π±ΠΈΡ, Π΄Π»Ρ ΡΡΠΎΠ²Π½Ρ TOP SECRET ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΈΡΡ ΠΊΠ»ΡΡΠΈ Π΄Π»ΠΈΠ½ΠΎΠΉ 192 ΠΈ 256 Π±ΠΈΡ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° AES
ΠΡΠΈΠΌΠ΅Ρ 1
ΠΡΠ±Π΅ΡΠ΅ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ «Π¨ΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅», Π·Π°ΡΠ΅ΠΌ Π²ΡΠ±Π΅ΡΠ΅ΠΌ ΡΠ°ΠΉΠ» Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ. txt, Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ «Π¨ΠΈΡΡΠΎΠ²Π°ΡΡ» (ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ»Π΅Π²Π° Π² ΠΏΠΎΠ»Π΅ «ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°»). ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ» EncodedFile. txtΡΡΠ΄ΠΎΠΌ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ.
Π ΠΈΡΡΠ½ΠΎΠΊ 1. Π¨ΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅Ρ 2
ΠΡΠΏΠΎΠ»Π½ΠΈΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. Π ΠΏΠΎΠ»Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ°ΠΉΠ» Π²ΡΠ±Π΅ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΡΠ°Π½Π΅Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ ΡΠ°ΠΉΠ» EncodedFile. txt, Π²ΡΠ±Π΅ΡΠ΅ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ «ΠΠ΅ΡΠΈΡΡΠΎΠ²Π°ΡΡ». ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ» DecodedFile. txtΡΡΠ΄ΠΎΠΌ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ.
ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ Π ΠΈΡΡΠ½ΠΎΠΊ 2. ΠΠ΅ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠΈΡΡΠΈΠ½Π³ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Math, Buttons, ExtCtrls, Menus, jpeg, pngimage;
type
EAESError = class (Exception);
PInteger = ^Integer;
TAESBuffer = array [0.15] of byte;
TAESKey128 = array [0.15] of byte;
TAESExpandedKey128 = array [0.43] of longword;
PAESBuffer =^TAESBuffer;
PAESKey128 =^TAESKey128;
PAESExpandedKey128 =^TAESExpandedKey128;
TForm1 = class (TForm)
Label1: TLabel;
Edit1: TEdit;
OpenDialog1: TOpenDialog;
Button1: TButton;
Button2: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Edit2: TEdit;
Label_Time: TLabel;
Label9: TLabel;
Label_Status: TLabel;
MemoOut: TMemo;
ButtonStop: TButton;
Panel1: TPanel;
MemoIn: TMemo;
EditDelay: TEdit;
RadioGroup1: TRadioGroup;
CBOpt: TComboBox;
Label6: TLabel;
LName: TLabel;
LPath: TLabel;
Label10: TLabel;
MainMenu1: TMainMenu;
MFile: TMenuItem;
MFChoose: TMenuItem;
MHelp: TMenuItem;
MHHelp: TMenuItem;
MFExit: TMenuItem;
Label7: TLabel;
Label8: TLabel;
Image1: TImage;
Label11: TLabel;
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
procedure ButtonStopClick (Sender: TObject);
procedure CBOptChange (Sender: TObject);
procedure FormActivate (Sender: TObject);
procedure RadioGroup1Click (Sender: TObject);
procedure MFExitClick (Sender: TObject);
procedure MFChooseClick (Sender: TObject);
procedure FormCreate (Sender: TObject);
procedure MHHelpClick (Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1: TForm1;
EncryptedText, Fpath: string;
flag: boolean;
// Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° Π΄Π»Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ
procedure ExpandAESKeyForEncryption (const Key: TAESKey128;
var ExpandedKey: TAESExpandedKey128); overload;
// ΠΠ»ΠΎΡΠ½ΠΎΠ΅ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅
procedure EncryptAES (const InBuf: TAESBuffer; const Key: TAESExpandedKey128;
var OutBuf: TAESBuffer);
// Π¨ΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΏΠΎΡΠΎΠΊΠ° (ECB mode)
procedure EncryptAESStreamECB (Source: TStream; Count: cardinal;
const Key: TAESKey128; Dest: TStream); overload;
procedure EncryptAESStreamECB (Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; Dest: TStream); overload;
// Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΊΠ»ΡΡΠ°Π΄Π»ΡΠ΄Π΅ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ
procedure ExpandAESKeyForDecryption (var ExpandedKey: TAESExpandedKey128); overload;
procedure ExpandAESKeyForDecryption (const Key: TAESKey128;
var ExpandedKey: TAESExpandedKey128); overload;
// ΠΠ΅ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎΠ±Π»ΠΎΠΊΠ°
procedure DecryptAES (const InBuf: TAESBuffer; const Key: TAESExpandedKey128;
var OutBuf: TAESBuffer);
// ΠΠ΅ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° (ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ±Π»ΠΎΡΠ½ΠΎ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠ° ΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΈΠ· Π±Π»ΠΎΠΊΠΎΠ² ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ DecryptAES)
procedure DecryptAESStreamECB (Source: TStream; Count: cardinal;
const Key: TAESKey128; Dest: TStream); overload;
proedure DecryptAESStreamECB (Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; Dest: TStream); overload;
resourcestring
SInvalidInBufSize = 'ΠΠ΅Π²Π΅ΡΠ½ΡΠΉΡΠ°Π·ΠΌΠ΅ΡΠ±ΡΡΠ΅ΡΠ°Π΄Π»ΡΠ΄Π΅ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ';
SReadError = 'ΠΡΠΈΠ±ΠΊΠ° ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠ°';
SWriteError = 'ΠΡΠΈΠ±ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ Π² ΠΏΠΎΡΠΎΠΊ';
implementation
uses UnStop;
{$R *.DFM}
type
PLongWord = ^LongWord;
function Min (A, B: integer): integer; // ΠΠ°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎΠΈΠ·Π΄Π²ΡΡ ΡΠΈΡΠ΅Π»
begin
if A < B then
Result:= A
else
Result:= B;
end;
const
Rcon: array [1.30] of longword = (
$ 1, $ 2, $ 4, $ 8, $ 10, $ 20,
$ 40, $ 80, $ 01B, $ 36, $ 06C, $ 00D8,
$ 00AB, $ 04D, $ 09A, $2 °F, $ 05E, $ 00BC,
$ 63, $ 00C6, $ 97, $ 35, $ 06A, $ 00D4,
$ 00B3, $ 07D, $ 00FA, $ 00EF, $ 00C5, $ 91
);
// ΠΡΡΠΌΠ°ΡΡΠ°Π±Π»ΠΈΡΠ°
ForwardTable: array [0.255] of longword = (
$A56363C6, $ 847C7CF8, $ 99 7777EE, $ 8D7B7BF6, $ 0DF2F2FF, $BD6B6BD6, $B16F6FDE, $ 54C5C591,
$ 50 303 060, $ 3 010 102, $A96767CE, $ 7D2B2B56, $ 19FEFEE7, $ 62D7D7B5, $E6ABAB4D, $ 9A7676EC,
$ 45CACA8 °F, $ 9D82 821 °F, $ 40C9C989, $ 877D7DFA, $ 15FAFAEF, $EB5959B2, $C947478E, $ 0BF0F0FB,
$ECADAD41, $ 67D4D4B3, $FDA2A25 °F, $EAAFAF45, $BF9C9C23, $F7A4A453, $ 96 7272E4, $ 5BC0C09B,
$C2B7B775, $ 1CFDFDE1, $AE93933D, $ 6A26264C, $ 5A36366C, $ 413F3F7E, $ 02F7F7F5, $ 4FCCCC83,
$ 5C343468, $F4A5A551, $ 34E5E5D1, $ 08F1F1F9, $ 93 7171E2, $ 73D8D8AB, $ 53 313 162, $ 3F15152A,
$ 0C040408, $ 52C7C795, $ 65 232 346, $ 5EC3C39D, $ 28 181 830, $A1969637, $ 0F05050A, $B59A9A2 °F,
$ 90 7070E, $ 36 121 224, $ 9B80801B, $ 3DE2E2DF, $ 26EBEBCD, $ 692 7274E, $CDB2B27 °F, $ 9F7575EA,
$ 1B090912, $ 9E83831D, $ 742C2C58, $ 2E1A1A34, $ 2D1B1B36, $B26E6EDC, $EE5A5AB4, $FBA0A05B,
$F65252A4, $ 4D3B3B76, $ 61D6D6B7, $CEB3B37D, $ 7B292952, $ 3EE3E3DD, $ 712F2F5E, $ 97 848 413,
$F55353A6, $ 68D1D1B9, $ 0, $ 2CEDEDC1, $ 60 202 040, $ 1FFCFCE3, $C8B1B179, $ED5B5BB6,
$BE6A6AD4, $ 46CBCB8D, $D9BEBE67, $ 4B393972, $DE4A4A94, $D44C4C98, $E85858B0, $ 4ACFCF85,
$ 6BD0D0BB, $ 2AEFEFC5, $E5AAAA4 °F, $ 16FBFBED, $C5434386, $D74D4D9A, $ 55 333 366, $ 94 858 511,
$CF45458A, $ 10F9F9E9, $ 6 020 204, $ 817F7FFE, $F05050A0, $ 443C3C78, $BA9F9F25, $E3A8A84B,
$F35151A2, $FEA3A35D, $C0404080, $ 8A8F8F05, $AD92 923 °F, $BC9D9D21, $ 48 383 870, $ 04F5F5F1,
$DFBCBC63, $C1B6B677, $ 75DADAAF, $ 63 212 142, $ 30 101 020, $ 1AFFFFE5, $ 0EF3F3FD, $ 6DD2D2BF,
$ 4CCDCD81, $ 140C0C18, $ 35 131 326, $ 2FECECC3, $E15F5FBE, $A2979735, $CC444488, $ 391 7172E,
$ 57C4C493, $F2A7A755, $ 827E7EFC, $ 473D3D7A, $AC6464C8, $E75D5DBA, $ 2B191932, $ 95 7373E6,
$A06060C0, $ 98 818 119, $D14F4F9E, $ 7FDCDCA3, $ 66 222 244, $ 7E2A2A54, $AB90903B, $ 838 8880B,
$CA46468C, $ 29EEEEC7, $D3B8B86B, $ 3C141428, $ 79DEDEA7, $E25E5EBC, $ 1D0B0B16, $ 76DBDBAD,
$ 3BE0E0DB, $ 56 323 264, $ 4E3A3A74, $ 1E0A0A14, $DB494992, $ 0A06060C, $ 6C242448, $E45C5CB8,
$ 5DC2C29 °F, $ 6ED3D3BD, $EFACAC43, $A66262C4, $A8919139, $A4959531, $ 37E4E4D3, $ 8B7979F2,
$ 32E7E7D5, $ 43C8C88B, $ 593 7376E, $B76D6DDA, $ 8C8D8D01, $ 64D5D5B1, $D24E4E9C, $E0A9A949,
$B46C6CD8, $FA5656AC, $ 07F4F4F3, $ 25EAEACF, $AF6565CA, $ 8E7A7AF4, $E9AEAE47, $ 18 080 810,
$D5BABA6 °F, $ 88 7878F0, $ 6F25254A, $ 722E2E5C, $ 241C1C38, $F1A6A657, $C7B4B473, $ 51C6C697,
$ 23E8E8CB, $ 7CDDDDA1, $ 9C7474E8, $ 211F1F3E, $DD4B4B96, $DCBDBD61, $ 868B8B0D, $ 858A8A0 °F,
$ 90 7070E0, $ 423E3E7C, $C4B5B571, $AA6666CC, $D8484890, $ 5 030 306, $ 01F6F6F7, $ 120E0E1C,
$A36161C2, $ 5F35356A, $F95757AE, $D0B9B969, $ 91 868 617, $ 58C1C199, $ 271D1D3A, $B99E9E27,
$ 38E1E1D9, $ 13F8F8EB, $B398982B, $ 33 111 122, $BB6969D2, $ 70D9D9A9, $ 898E8E07, $A7949433,
$B69B9B2D, $ 221E1E3C, $ 92 878 715, $ 20E9E9C9, $ 49CECE87, $FF5555AA, $ 78 282 850, $ 7ADFDFA5,
$ 8F8C8C03, $F8A1A159, $ 80 898 909, $ 170D0D1A, $DABFBF65, $ 31E6E6D7, $C6424284, $B86868D0,
$C3414182, $B0999929, $ 772D2D5A, $ 110F0F1E, $CBB0B07B, $FC5454A8, $D6BBBB6D, $ 3A16162C
);
// ΠΠΎΡΠ»Π΅Π΄Π½ΡΡΠΏΡΡΠΌΠ°ΡΡΠ°Π±Π»ΠΈΡΠ°
LastForwardTable: array [0.255] of longword = (
$ 63, $ 07C, $ 77, $ 07B, $ 00F2, $ 06B, $6 °F, $ 00C5,
$ 30, $ 1, $ 67, $ 02B, $ 00FE, $ 00D7, $ 00AB, $ 76,
$ 00CA, $ 82, $ 00C9, $ 07D, $ 00FA, $ 59, $ 47, $ 00F0,
$ 00AD, $ 00D4, $ 00A2, $ 00AF, $ 09C, $ 00A4, $ 72, $ 00C0,
$ 00B7, $ 00FD, $ 93, $ 26, $ 36, $3 °F, $ 00F7, $ 00CC,
$ 34, $ 00A5, $ 00E5, $ 00F1, $ 71, $ 00D8, $ 31, $ 15,
$ 4, $ 00C7, $ 23, $ 00C3, $ 18, $ 96, $ 5, $ 09A,
$ 7, $ 12, $ 80, $ 00E2, $ 00EB, $ 27, $ 00B2, $ 75,
$ 9, $ 83, $ 02C, $ 01A, $ 01B, $ 06E, $ 05A, $ 00A0,
$ 52, $ 03B, $ 00D6, $ 00B3, $ 29, $ 00E3, $2 °F, $ 84,
$ 53, $ 00D1, $ 0, $ 00ED, $ 20, $ 00FC, $ 00B1, $ 05B,
$ 06A, $ 00CB, $ 00BE, $ 39, $ 04A, $ 04C, $ 58, $ 00CF,
$ 00D0, $ 00EF, $ 00AA, $ 00FB, $ 43, $ 04D, $ 33, $ 85,
$ 45, $ 00F9, $ 2, $7 °F, $ 50, $ 03C, $9 °F, $ 00A8,
$ 51, $ 00A3, $ 40, $8 °F, $ 92, $ 09D, $ 38, $ 00F5,
$ 00BC, $ 00B6, $ 00DA, $ 21, $ 10, $ 00FF, $ 00F3, $ 00D2,
$ 00CD, $ 00C, $ 13, $ 00EC, $5 °F, $ 97, $ 44, $ 17,
$ 00C4, $ 00A7, $ 07E, $ 03D, $ 64, $ 05D, $ 19, $ 73,
$ 60, $ 81, $4 °F, $ 00DC, $ 22, $ 02A, $ 90, $ 88,
$ 46, $ 00EE, $ 00B8, $ 14, $ 00DE, $ 05E, $ 00B, $ 00DB,
$ 00E0, $ 32, $ 03A, $ 00A, $ 49, $ 6, $ 24, $ 05C,
$ 00C2, $ 00D3, $ 00AC, $ 62, $ 91, $ 95, $ 00E4, $ 79,
$ 00E7, $ 00C8, $ 37, $ 06D, $ 08D, $ 00D5, $ 04E, $ 00A9,
$ 06C, $ 56, $ 00F4, $ 00EA, $ 65, $ 07A, $ 00AE, $ 8,
$ 00BA, $ 78, $ 25, $ 02E, $ 01C, $ 00A6, $ 00B4, $ 00C6,
$ 00E8, $ 00DD, $ 74, $1 °F, $ 04B, $ 00BD, $ 08B, $ 08A,
$ 70, $ 03E, $ 00B5, $ 66, $ 48, $ 3, $ 00F6, $ 00E,
$ 61, $ 35, $ 57, $ 00B9, $ 86, $ 00C1, $ 01D, $ 09E,
$ 00E1, $ 00F8, $ 98, $ 11, $ 69, $ 00D9, $ 08E, $ 94,
$ 09B, $ 01E, $ 87, $ 00E9, $ 00CE, $ 55, $ 28, $ 00DF,
$ 08C, $ 00A1, $ 89, $ 00D, $ 00BF, $ 00E6, $ 42, $ 68,
$ 41, $ 99, $ 02D, $0 °F, $ 00B0, $ 54, $ 00BB, $ 16
);
// ΠΠ½Π²Π΅ΡΡΠ½Π°ΡΡΠ°Π±Π»ΠΈΡΠ°
InverseTable: array [0.255] of longword = (
$ 50A7F451, $ 536 5417E, $C3A4171A, $ 965E273A, $CB6BAB3B, $F1459D1 °F, $AB58FAAC, $ 9303E34B,
$ 55FA3020, $F66D76AD, $ 9176CC88, $ 254C02F5, $FCD7E54 °F, $D7CB2AC5, $ 80 443 526, $ 8FA362B5,
$ 495AB1DE, $ 671BBA25, $ 980EEA45, $E1C0FE5D, $ 02752FC3, $ 12F04C81, $A397468D, $C6F9D36B,
$E75F8F03, $ 959C9215, $EB7A6DBF, $DA595295, $ 2D83BED4, $D3217458, $ 2969E049, $ 44C8C98E,
$ 6A89C275, $ 78798EF4, $ 6B3E5899, $DD71B927, $B64FE1BE, $ 17AD88F0, $ 66AC20C9, $B43ACE7D,
$ 184ADF63, $ 82311AE5, $ 60 335 197, $ 457F5362, $E07764B1, $ 84AE6BBB, $ 1CA081FE, $ 942B08F9,
$ 58 684 870, $ 19FD458 °F, $ 876CDE94, $B7F87B52, $ 23D373AB, $E2024B72, $ 578F1FE3, $ 2AAB5566,
$ 0728EBB2, $ 03C2B52 °F, $ 9A7BC586, $A50837D3, $F2872830, $B2A5BF23, $BA6A0302, $ 5C8216ED,
$ 2B1CCF8A, $ 92B479A7, $F0F207F3, $A1E2694E, $CDF4DA65, $D5BE0506, $ 1F6234D1, $ 8AFEA6C4,
$ 9D532E34, $A055F3A2, $ 32E18A05, $ 75EBF6A4, $ 39EC830B, $AAEF6040, $ 069F715E, $ 51106EBD,
$F98A213E, $ 3D06DD96, $AE053EDD, $ 46BDE64D, $B58D5491, $ 055DC471, $ 6FD40604, $FF155060,
$ 24FB9819, $ 97E9BDD6, $CC434089, $ 779ED967, $BD42E8B0, $ 888B8907, $ 385B19E7, $DBEEC879,
$ 470A7CA1, $E90F427C, $C91E84F8, $ 0, $ 83 868 009, $ 48ED2B32, $AC70111E, $ 4E725A6C,
$FBFF0EFD, $5 638 850 °F, $ 1ED5AE3D, $ 27392D36, $ 64D90F0A, $ 21A65C68, $D1545B9B, $ 3A2E3624,
$B1670A0C, $ 0FE75793, $D296EEB4, $ 9E919B1B, $ 4FC5C080, $A220DC61, $ 694B775A, $ 161A121C,
$ 0ABA93E2, $E52AA0C0, $ 43E0223C, $ 1D171B12, $ 0B0D090E, $ADC78BF2, $B9A8B62D, $C8A91E14,
$ 8519F157, $ 4C0775AF, $BBDD99EE, $FD607FA3, $ 9F2601F7, $BCF5725C, $C53B6644, $ 347EFB5B,
$ 762 9438B, $DCC623CB, $ 68FCEDB6, $ 63F1E4B8, $CADC31D7, $ 10 856 342, $ 40 229 713, $ 2011C684,
$ 7D244A85, $F83DBBD2, $ 1132F9AE, $ 6DA129C7, $ 4B2F9E1D, $F330B2DC, $EC52860D, $D0E3C177,
$ 6C16B32B, $ 99B970A9, $FA489411, $ 2264E947, $C48CFCA8, $ 1A3FF0A0, $D82C7D56, $EF903322,
$C74E4987, $C1D138D9, $FEA2CA8C, $ 360BD498, $CF81F5A6, $ 28DE7AA5, $ 268EB7DA, $A4BFAD3 °F,
$E49D3A2C, $ 0D927850, $ 9BCC5F6A, $ 62467E54, $C2138DF6, $E8B8D890, $ 5EF7392E, $F5AFC382,
$BE805D9 °F, $ 7C93D069, $A92DD56 °F, $B31225CF, $ 3B99ACC8, $A77D1810, $ 6E639CE8, $ 7BBB3BDB,
$ 9 7826CD, $F418596E, $ 01B79AEC, $A89A4F83, $ 656E95E6, $ 7EE6FFAA, $ 08CFBC21, $E6E815EF,
$D99BE7BA, $CE366F4A, $D4099FEA, $D67CB029, $AFB2A431, $ 31233F2A, $ 3094A5C6, $C066A235,
$ 37BC4E74, $A6CA82FC, $B0D090E0, $ 15D8A733, $ 4A9804F1, $F7DAEC41, $ 0E50CD7 °F, $ 2FF69117,
$ 8DD64D76, $ 4DB0EF43, $ 544DAACC, $DF0496E4, $E3B5D19E, $ 1B886A4C, $B81F2CC1, $ 7F516546,
$ 04EA5E9D, $ 5D358C01, $ 73 7487FA, $ 2E410BFB, $ 5A1D67B3, $ 52D2DB92, $ 33 5610E9, $ 1347D66D,
$ 8C61D79A, $ 7A0CA137, $ 8E14F859, $ 893C13EB, $EE27A9CE, $ 35C961B7, $EDE51CE1, $ 3CB1477A,
$ 59DFD29C, $ 3F73F255, $ 79CE1418, $BF37C773, $EACDF753, $ 5BAAFD5 °F, $ 146F3DDF, $ 86DB4478,
$ 81F3AFCA, $ 3EC468B9, $ 2C342438, $ 5F40A3C2, $ 72C31D16, $ 0C25E2BC, $ 8B493C28, $ 41950DFF,
$ 7101A839, $DEB30C08, $ 9CE4B4D8, $ 90C15664, $ 6184CB7B, $ 70B632D5, $ 745C6C48, $ 4257B8D0
);
// ΠΠΎΡΠ»Π΅Π΄Π½ΡΡΠΈΠ½Π²Π΅ΡΡΠ½Π°ΡΡΠ°Π±Π»ΠΈΡΠ°
LastInverseTable: array [0.255] of longword = (
$ 52, $ 9, $ 06A, $ 00D5, $ 30, $ 36, $ 00A5, $ 38,
$ 00BF, $ 40, $ 00A3, $ 09E, $ 81, $ 00F3, $ 00D7, $ 00FB,
$ 07C, $ 00E3, $ 39, $ 82, $ 09B, $2 °F, $ 00FF, $ 87,
$ 34, $ 08E, $ 43, $ 44, $ 00C4, $ 00DE, $ 00E9, $ 00CB,
$ 54, $ 07B, $ 94, $ 32, $ 00A6, $ 00C2, $ 23, $ 03D,
$ 00EE, $ 04C, $ 95, $ 00B, $ 42, $ 00FA, $ 00C3, $ 04E,
$ 8, $ 02E, $ 00A1, $ 66, $ 28, $ 00D9, $ 24, $ 00B2,
$ 76, $ 05B, $ 00A2, $ 49, $ 06D, $ 08B, $ 00D1, $ 25,
$ 72, $ 00F8, $ 00F6, $ 64, $ 86, $ 68, $ 98, $ 16,
$ 00D4, $ 00A4, $ 05C, $ 00CC, $ 05D, $ 65, $ 00B6, $ 92,
$ 06C, $ 70, $ 48, $ 50, $ 00FD, $ 00ED, $ 00B9, $ 00DA,
$ 05E, $ 15, $ 46, $ 57, $ 00A7, $ 08D, $ 09D, $ 84,
$ 90, $ 00D8, $ 00AB, $ 0, $ 08C, $ 00BC, $ 00D3, $ 00A,
$ 00F7, $ 00E4, $ 58, $ 5, $ 00B8, $ 00B3, $ 45, $ 6,
$ 00D0, $ 02C, $ 01E, $8 °F, $ 00CA, $3 °F, $0 °F, $ 2,
$ 00C1, $ 00AF, $ 00BD, $ 3, $ 1, $ 13, $ 08A, $ 06B,
$ 03A, $ 91, $ 11, $ 41, $4 °F, $ 67, $ 00DC, $ 00EA,
$ 97, $ 00F2, $ 00CF, $ 00CE, $ 00F0, $ 00B4, $ 00E6, $ 73,
$ 96, $ 00AC, $ 74, $ 22, $ 00E7, $ 00AD, $ 35, $ 85,
$ 00E2, $ 00F9, $ 37, $ 00E8, $ 01C, $ 75, $ 00DF, $ 06E,
$ 47, $ 00F1, $ 01A, $ 71, $ 01D, $ 29, $ 00C5, $ 89,
$6 °F, $ 00B7, $ 62, $ 00E, $ 00AA, $ 18, $ 00BE, $ 01B,
$ 00FC, $ 56, $ 03E, $ 04B, $ 00C6, $ 00D2, $ 79, $ 20,
$ 09A, $ 00DB, $ 00C0, $ 00FE, $ 78, $ 00CD, $ 05A, $ 00F4,
$1 °F, $ 00DD, $ 00A8, $ 33, $ 88, $ 7, $ 00C7, $ 31,
$ 00B1, $ 12, $ 10, $ 59, $ 27, $ 80, $ 00EC, $5 °F,
$ 60, $ 51, $7 °F, $ 00A9, $ 19, $ 00B5, $ 04A, $ 00D,
$ 02D, $ 00E5, $ 07A, $9 °F, $ 93, $ 00C9, $ 09C, $ 00EF,
$ 00A0, $ 00E0, $ 03B, $ 04D, $ 00AE, $ 02A, $ 00F5, $ 00B0,
$ 00C8, $ 00EB, $ 00BB, $ 03C, $ 83, $ 53, $ 99, $ 61,
$ 17, $ 02B, $ 4, $ 07E, $ 00BA, $ 77, $ 00D6, $ 26,
$ 00E1, $ 69, $ 14, $ 63, $ 55, $ 21, $ 00C, $ 07D
);
// Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° Π΄Π»Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ
procedure ExpandAESKeyForEncryption (const Key: TAESKey128; var ExpandedKey: TAESExpandedKey128);
var
I, J: integer;
T: longword;
W0, W1, W2, W3: longword;
begin
ExpandedKey[0]: = PLongWord (@Key[0])^;
ExpandedKey[1]: = PLongWord (@Key[4])^;
ExpandedKey[2]: = PLongWord (@Key[8])^;
ExpandedKey[3]: = PLongWord (@Key[12])^;
I:= 0; J:= 1;
repeat
T:= (ExpandedKey [I + 3] shl 24) or (ExpandedKey [I + 3] shr 8);
W0:= LastForwardTable [Byte (T)]; W1:= LastForwardTable [Byte (T shr 8)];
W2:= LastForwardTable [Byte (T shr 16)]; W3:= LastForwardTable [Byte (T shr 24)];
ExpandedKey [I + 4]: = ExpandedKey[I] xor
(W0 xor ((W1 shl 8) or (W1 shr 24)) xor
((W2 shl 16) or (W2 shr 16)) xor ((W3 shl 24) or (W3 shr 8))) xor Rcon[J];
Inc (J);
ExpandedKey [I + 5]: = ExpandedKey [I + 1] xor ExpandedKey [I + 4];
ExpandedKey [I + 6]: = ExpandedKey [I + 2] xor ExpandedKey [I + 5];
ExpandedKey [I + 7]: = ExpandedKey [I + 3] xor ExpandedKey [I + 6];
Inc (I, 4);
until I >= 40;
end;
procedure EncryptAES (const InBuf: TAESBuffer; const Key: TAESExpandedKey128;
var OutBuf: TAESBuffer);
var
T0, T1: array [0.3] of longword;
W0, W1, W2, W3: longword;
begin
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
T0 [0]: = PLongWord (@InBuf[0])^ xor Key[0];
T0 [1]: = PLongWord (@InBuf[4])^ xor Key[1];
T0 [2]: = PLongWord (@InBuf[8])^ xor Key[2];
T0 [3]: = PLongWord (@InBuf[12])^ xor Key[3];
// ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ 10 ΡΠ°Π·
// ΡΠ°ΡΠ½Π΄ 1
W0:= ForwardTable [Byte (T0 [0])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[4];
W0:= ForwardTable [Byte (T0 [1])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[5];
W0:= ForwardTable [Byte (T0 [2])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[6];
W0:= ForwardTable [Byte (T0 [3])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[7];
// ΡΠ°ΡΠ½Π΄ 2
W0:= ForwardTable [Byte (T1 [0])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[8];
W0:= ForwardTable [Byte (T1 [1])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[9];
W0:= ForwardTable [Byte (T1 [2])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[10];
W0:= ForwardTable [Byte (T1 [3])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[11];
// ΡΠ°ΡΠ½Π΄ 3
W0:= ForwardTable [Byte (T0 [0])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[12];
W0:= ForwardTable [Byte (T0 [1])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[13];
W0:= ForwardTable [Byte (T0 [2])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[14];
W0:= ForwardTable [Byte (T0 [3])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[15];
// ΡΠ°ΡΠ½Π΄ 4
W0:= ForwardTable [Byte (T1 [0])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[16];
W0:= ForwardTable [Byte (T1 [1])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[17];
W0:= ForwardTable [Byte (T1 [2])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[18];
W0:= ForwardTable [Byte (T1 [3])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[19];
// ΡΠ°ΡΠ½Π΄ 5
W0:= ForwardTable [Byte (T0 [0])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[20];
W0:= ForwardTable [Byte (T0 [1])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[21];
W0:= ForwardTable [Byte (T0 [2])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[22];
W0:= ForwardTable [Byte (T0 [3])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[23];
// ΡΠ°ΡΠ½Π΄ 6
W0:= ForwardTable [Byte (T1 [0])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[24];
W0:= ForwardTable [Byte (T1 [1])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[25];
W0:= ForwardTable [Byte (T1 [2])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[26];
W0:= ForwardTable [Byte (T1 [3])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[27];
// ΡΠ°ΡΠ½Π΄ 7
W0:= ForwardTable [Byte (T0 [0])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[28];
W0:= ForwardTable [Byte (T0 [1])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[29];
W0:= ForwardTable [Byte (T0 [2])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[30];
W0:= ForwardTable [Byte (T0 [3])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[31];
// ΡΠ°ΡΠ½Π΄ 8
W0:= ForwardTable [Byte (T1 [0])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[32];
W0:= ForwardTable [Byte (T1 [1])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[33];
W0:= ForwardTable [Byte (T1 [2])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[34];
W0:= ForwardTable [Byte (T1 [3])]; W1:= ForwardTable [Byte (T1 shr 8)];
W2:= ForwardTable [Byte (T1 shr 16)]; W3:= ForwardTable [Byte (T1 shr 24)];
T0 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[35];
// ΡΠ°ΡΠ½Π΄ 9
W0:= ForwardTable [Byte (T0 [0])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[36];
W0:= ForwardTable [Byte (T0 [1])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[37];
W0:= ForwardTable [Byte (T0 [2])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[38];
W0:= ForwardTable [Byte (T0 [3])]; W1:= ForwardTable [Byte (T0 shr 8)];
W2:= ForwardTable [Byte (T0 shr 16)]; W3:= ForwardTable [Byte (T0 shr 24)];
T1 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[39];
// ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉΡΠ°ΡΠ½Π΄ΠΏΡΠ΅ΠΎΠ±ΡΠ°ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ
W0:= LastForwardTable [Byte (T1 [0])]; W1:= LastForwardTable [Byte (T1 shr 8)];
W2:= LastForwardTable [Byte (T1 shr 16)]; W3:= LastForwardTable [Byte (T1 shr 24)];
T0 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[40];
W0:= LastForwardTable [Byte (T1 [1])]; W1:= LastForwardTable [Byte (T1 shr 8)];
W2:= LastForwardTable [Byte (T1 shr 16)]; W3:= LastForwardTable [Byte (T1 shr 24)];
T0 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[41];
W0:= LastForwardTable [Byte (T1 [2])]; W1:= LastForwardTable [Byte (T1 shr 8)];
W2:= LastForwardTable [Byte (T1 shr 16)]; W3:= LastForwardTable [Byte (T1 shr 24)];
T0 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[42];
W0:= LastForwardTable [Byte (T1 [3])]; W1:= LastForwardTable [Byte (T1 shr 8)];
W2:= LastForwardTable [Byte (T1 shr 16)]; W3:= LastForwardTable [Byte (T1 shr 24)];
T0 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[43];
// ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅
PLongWord (@OutBuf[0])^:= T0 [0]; PLongWord (@OutBuf[4])^:= T0 [1];
PLongWord (@OutBuf[8])^:= T0 [2]; PLongWord (@OutBuf[12])^:= T0 [3];
end;
procedure ExpandAESKeyForDecryption (var ExpandedKey: TAESExpandedKey128);
var
I: integer;
U, F2, F4, F8, F9: longword;
begin
for I:= 1 to 9 do
begin
// ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ°
F9:= ExpandedKey [I * 4];
U:= F9 and $ 80 808 080;
F2:= ((F9 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
U:= F2 and $ 80 808 080;
F4:= ((F2 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
U:= F4 and $ 80 808 080;
F8:= ((F4 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
F9:= F9 xor F8;
ExpandedKey [I * 4]: = F2 xor F4 xor F8 xor
(((F2 xor F9) shl 24) or ((F2 xor F9) shr 8)) xor
(((F4 xor F9) shl 16) or ((F4 xor F9) shr 16)) xor ((F9 shl 8) or (F9 shr 24));
F9:= ExpandedKey [I * 4 + 1];
U:= F9 and $ 80 808 080;
F2:= ((F9 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
U:= F2 and $ 80 808 080;
F4:= ((F2 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
U:= F4 and $ 80 808 080;
F8:= ((F4 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
F9:= F9 xor F8;
ExpandedKey [I * 4 + 1]: = F2 xor F4 xor F8 xor
(((F2 xor F9) shl 24) or ((F2 xor F9) shr 8)) xor
(((F4 xor F9) shl 16) or ((F4 xor F9) shr 16)) xor ((F9 shl 8) or (F9 shr 24));
F9:= ExpandedKey [I * 4 + 2];
U:= F9 and $ 80 808 080;
F2:= ((F9 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
U:= F2 and $ 80 808 080;
F4:= ((F2 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
U:= F4 and $ 80 808 080;
F8:= ((F4 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
F9:= F9 xor F8;
ExpandedKey [I * 4 + 2]: = F2 xor F4 xor F8 xor
(((F2 xor F9) shl 24) or ((F2 xor F9) shr 8)) xor
(((F4 xor F9) shl 16) or ((F4 xor F9) shr 16)) xor ((F9 shl 8) or (F9 shr 24));
F9:= ExpandedKey [I * 4 + 3];
U:= F9 and $ 80 808 080;
F2:= ((F9 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
U:= F2 and $ 80 808 080;
F4:= ((F2 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
U:= F4 and $ 80 808 080;
F8:= ((F4 and $ 7F7F7F7F) shl 1) xor ((U — (U shr 7)) and $ 1B1B1B1B);
F9:= F9 xor F8;
ExpandedKey [I * 4 + 3]: = F2 xor F4 xor F8 xor
(((F2 xor F9) shl 24) or ((F2 xor F9) shr 8)) xor
(((F4 xor F9) shl 16) or ((F4 xor F9) shr 16)) xor ((F9 shl 8) or (F9 shr 24));
end;
end;
procedure ExpandAESKeyForDecryption (const Key: TAESKey128; var ExpandedKey: TAESExpandedKey128);
begin
ExpandAESKeyForEncryption (Key, ExpandedKey);
// ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊΠ»ΡΡΠ° (ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅)
ExpandAESKeyForDecryption (ExpandedKey);
// Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° Π΄Π»Ρ Π΄Π΅ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ
end;
procedure DecryptAES (const InBuf: TAESBuffer; const Key: TAESExpandedKey128;
var OutBuf: TAESBuffer);
var
T0, T1: array [0.3] of longword;
W0, W1, W2, W3: longword;
begin
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
T0 [0]: = PLongWord (@InBuf[0])^ xor Key[40];
T0 [1]: = PLongWord (@InBuf[4])^ xor Key[41];
T0 [2]: = PLongWord (@InBuf[8])^ xor Key[42];
T0 [3]: = PLongWord (@InBuf[12])^ xor Key[43];
// ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡΠ²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ 10 ΡΠ°Π·
// ΡΠ°ΡΠ½Π΄ 1
W0:= InverseTable [Byte (T0 [0])]; W1:= InverseTable [Byte (T0 shr 8)];
W2:= InverseTable [Byte (T0 shr 16)]; W3:= InverseTable [Byte (T0 shr 24)];
T1 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[36];
W0:= InverseTable [Byte (T0 [1])]; W1:= InverseTable [Byte (T0 shr 8)];
W2:= InverseTable [Byte (T0 shr 16)]; W3:= InverseTable [Byte (T0 shr 24)];
T1 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[37];
W0:= InverseTable [Byte (T0 [2])]; W1:= InverseTable [Byte (T0 shr 8)];
W2:= InverseTable [Byte (T0 shr 16)]; W3:= InverseTable [Byte (T0 shr 24)];
T1 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[38];
W0:= InverseTable [Byte (T0 [3])]; W1:= InverseTable [Byte (T0 shr 8)];
W2:= InverseTable [Byte (T0 shr 16)]; W3:= InverseTable [Byte (T0 shr 24)];
T1 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[39];
// ΡΠ°ΡΠ½Π΄ 2
W0:= InverseTable [Byte (T1 [0])]; W1:= InverseTable [Byte (T1 shr 8)];
W2:= InverseTable [Byte (T1 shr 16)]; W3:= InverseTable [Byte (T1 shr 24)];
T0 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[32];
W0:= InverseTable [Byte (T1 [1])]; W1:= InverseTable [Byte (T1 shr 8)];
W2:= InverseTable [Byte (T1 shr 16)]; W3:= InverseTable [Byte (T1 shr 24)];
T0 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[33];
W0:= InverseTable [Byte (T1 [2])]; W1:= InverseTable [Byte (T1 shr 8)];
W2:= InverseTable [Byte (T1 shr 16)]; W3:= InverseTable [Byte (T1 shr 24)];
T0 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[34];
W0:= InverseTable [Byte (T1 [3])]; W1:= InverseTable [Byte (T1 shr 8)];
W2:= InverseTable [Byte (T1 shr 16)]; W3:= InverseTable [Byte (T1 shr 24)];
T0 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[35];
// ΡΠ°ΡΠ½Π΄ 3
W0:= InverseTable [Byte (T0 [0])]; W1:= InverseTable [Byte (T0 shr 8)];
W2:= InverseTable [Byte (T0 shr 16)]; W3:= InverseTable [Byte (T0 shr 24)];
T1 [0]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[28];
W0:= InverseTable [Byte (T0 [1])]; W1:= InverseTable [Byte (T0 shr 8)];
W2:= InverseTable [Byte (T0 shr 16)]; W3:= InverseTable [Byte (T0 shr 24)];
T1 [1]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[29];
W0:= InverseTable [Byte (T0 [2])]; W1:= InverseTable [Byte (T0 shr 8)];
W2:= InverseTable [Byte (T0 shr 16)]; W3:= InverseTable [Byte (T0 shr 24)];
T1 [2]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))
xor ((W3 shl 24) or (W3 shr 8))) xor Key[30];
W0:= InverseTable [Byte (T0 [3])]; W1:= InverseTable [Byte (T0 shr 8)];
W2:= InverseTable [Byte (T0 shr 16)]; W3:= InverseTable [Byte (T0 shr 24)];
T1 [3]: = (W0 xor ((W1 shl 8) or (W1 shr 24)) xor ((W2 shl 16) or (W2 shr 16))