ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

РСализация криптографичСского Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° (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))

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ