Алгоритм AES

В данной статье предлагаю разобрать алгоритм кодирования AES

Алгоритм AES-256(Advanced Encryption Standard, где длина ключа = 256 бит, длиной блока = 128 бит), являющийся стандартом в США – блочный алгоритм шифрования. Описание данного шифра можно найти в стандарте FIPS-197 "Announcing the Advanced Encryption Standard"

Согласно данному стандарту алгоритм возможно описать так

  1. Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1 )])
  2. begin
  3. byte state[4,Nb]
  4. state = in
  5. AddRoundKey(state, w[0, Nb-1])
  6. for round = 1 step 1 to Nr–1
  7. SubBytes(state)
  8. ShiftRows(state)
  9. MixColumns(state)
  10. AddRoundKey(state, w[round*Nb, (round+1 )*Nb-1])
  11. end for
  12. SubBytes(state)
  13. ShiftRows(state)
  14. AddRoundKey(state, w[Nr*Nb, (Nr+1 )*Nb-1])
  15. out = state
  16. end

This code was highlighted with code.xnim.ru

Давайте разберемся, что происходит в данном алгоритме – На вход подается два массива – входных данных и раундовых ключей.

Раундовые ключи получают из пользовательского (введенного ключа) длина массивы раундовых ключей для AES-256 = 60

Раундовые ключи получаются по следующему алгоритму

  1. KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1 )], Nk)
  2. begin
  3. word temp
  4. i = 0
  5. while (i < Nk)
  6. w[i] = word(key[4*i], key[4*i+1 ], key[4*i+2 ], key[4*i+3 ])
  7. i = i+1
  8. end while
  9. i = Nk
  10. while (i < Nb * (Nr+1 )]
  11. temp = w[i-1]
  12. if (i mod Nk = 0 )
  13. temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
  14. else if (Nk > 6 and i mod Nk = 4 )
  15. temp = SubWord(temp)
  16. end if
  17. w[i] = w[i-Nk] xor temp
  18. i = i + 1
  19. end while
  20. en

This code was highlighted with code.xnim.ru


Кодирование информации происходит в Nr раундов(данная константа, согласно AES-256, равна 14)

На каждом раунде происходит добавление раундового ключа к сообщению, добавление происходит при помощи операции XOR (исключающее-ИЛИ), затем функция SubBytes заменяет каждый элемент массива state (он же in) на определенный байт в таблице замены.





ShiftRows – производит циклический сдвиг трех последних строк.



Последняя нерасмотренная функция это MixColumns. Данная функция производит представление каждого столбца state как многочлена над полем GF(2^8) – поле задается как x^8+x^4+x^3+x^2+1 - и умножается на многочлен по модулю x^4+1 (он определен в стандарте). Данная операция была бы очень сложной и чуть-ли не самой непонятной в стандарте, если бы стандарт не описывал, что это сделать можно следующим способом – Производится умножение столбца на матрицу, определяющую многочлен по модулю x^4+1


Реализацию данного алгоритма в этой статье приводить не будем в виде «громоздкости» полученных функций.

Вместо этого опишем, что в .NET 3.5 и выше появился класс AES его использование можно посмотреть здесь


И да, кстати, программа CryptoWorker основывается на алгоритме AES-256. Скачать программу можно здесь.
2012-03-30