Алгоритм шифрования AES для самых маленьких

Алгоритм шифрования AES для самых маленьких

Всем привет, сегодня мы немного поговорим о криптографии, разберемся с работой алгоритма шифрования AES, также реализуем его на языке C# (Почему именно C# будет описано ниже).

Небольшое введение.

Итак, очень коротко об алгоритмах шифрования. Выделим следующие типы:

  1. Симметричные алгоритмы шифрования (DES, AES, ГОСТ 28147-89)
  2. Ассиметричные алгоритмы шифрования или с алгоритмы открытым ключом (RSA, ГОСТ 34.10-2001)

В первом случае для шифрования и расшифровывания используется один и тот же ключ, такой ключ должен сохраняться в секрете.

Во втором случае используется пара ключей: закрытый и открытый. Открытый используется для шифрования, а закрытый ключ для расшифровки сообщения.

Мы будем говорить о симметричном шифре, поэтому выделим разновидности симметричных шифров:

  1. Блочные шифры
  2. Поточные шифры

Блочные шифры – работают блоками, блок – совокупность бит фиксированной длины. Таким образом, сообщение разбивается на блоки, затем эти блоки каким-то образом шифруются. Употребил слово «каким-то», т.к существуют различные режимы работы.

Например, самый простой и самый очевидный режим – ECB (Electronic Codebook): каждый блок шифруется, а затем все блоки складываются (имеется ввиду сложение строк). Рисунок ниже, демонстрирует этот режим работы. Существуют следующие режимы: CBC, PCBC, CFB, OFB, CTR.

Алгоритм шифрования AES для самых маленьких
Режим ECB

Поточные шифры – такой вид шифра, в котором отдельный символ открытого сообщения переходит в символ(ы) шифротекста, причем результат шифра (речь идет о отдельно взятом символе) зависит от ключа и расположения символа в открытом сообщение.

Простейший случай: открытый текст складывается с гаммой (XOR) и т.д. Отметим, что гамма- случайная последовательность символов (чисел)

Алгоритм шифрования AES для самых маленьких
Поточное шифрование

Стоит отметить, что при определенных условиях блочные шифры можно представить в виде потокового шифра (См. различные режимы шифрования).

Замечу, что представленная выше информация нацелена на (хотя бы небольшое) понимание работы алгоритма, который мы сейчас рассмотрим.

Краткое введении в AES (Advanced Encryption Standard).

Является симметричным блочным алгоритмом шифрования. Оперирует блоком в 128 бит, ключом размера 128/192/256 бит.

Собрались с мыслями, переходим к определениям, которые нам нужны:

  • State (форма)– матрица (двумерный массив) байтов, расположенных следующем образом :
    Алгоритм шифрования AES для самых маленьких
  • Round (раунд) – итерация цикла преобразования над State (формой). Количество итераций зависит от длины ключа, чем больше длина ключа, тем больше итераций.
  • Round key (раундовый ключ) ― уникальный ключ, который применяется в каждом отдельном в раунде.
  • S-Box (таблица подстановок) –таблица, которая задает отображение одного байта в другой (биективное отображение):
    Алгоритм шифрования AES для самых маленьких
  • Обратная таблица подстановок ― аналогично S-Box, задает обратное отображение:
    Алгоритм шифрования AES для самых маленьких

Как происходит шифрование.

Шифрование состоит из следующих функций преобразования:

  1. ExpandKey — Функция для вычисления всех раундовых ключей;
  2. SubBytes — Функция для подстановки байтов, использующая таблицу подстановок;
  3. ShiftRows — Функция, обеспечивающая циклический сдвиг в форме на различные величины;
  4. MixColumns — Функция, которая смешивает данные внутри каждого столбца формы;
  5. AddRoundKey — Сложение ключа раунда с формой.

    Алгоритм шифрования AES для самых маленьких
    В виде блок-схемы

Где Nr – количество раундов.

Расшифрование происходит аналогичным образом, только в обратном порядке. Не будем вдаваться в подробности функций, которые описаны выше. Они хоть и простые, но описание займет время, которого у нас и так мало. Кому все же интересно прошу посетить эту ссылку.

Переходи к кодингу

Реализация алгоритма AES на C#. Почему C#? За нас уже потрудились и создали класс AES, в котором уже реализованы все методы, которые описаны выше. Поэтому все делается легко и непринужденно.

Поехали. (Используем MSDN)

Метод Main выглядит следующим образом :

Шифрование осуществляется следующим методом:

За расшифрование отвечает метод:

На этом все, если я где-то ошибся или у вас есть какие-то предложения, прошу оставить об этом комментарий. Всем удачного дня 🙂