Алгоритм шифрования Rijndael

Заглавие: Алгоритм шифрования Rijndael

Язык: C

Автор: Филипп Дж. Эрдельский

Дата: Сентябрь 3, 2002

Использование: Всеобщее достояние; нет ограничений по использованию

Портативность: Любая среда C, также обобщаются как C++

Ключевые слова: rijndael, криптография

Аннотация: Пакет C для алгоритма шифрования Rijndael

Исходный код: rijndael.txt

Алгоритм шифрования Rijndael был разработан, чтобы заменить стареющий алгоритм DES. Как DES, это блочный шифр. Он использует 128-битные, 192-битные или 256-битные ключи. Эта реализация в зашифрованном виде представляет собой 128-битные блоки. (DES используется 56-битные ключи и 64-битные блоки.)

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

Исходный код был размещен в виде rijndael.zip.

Измененный код проще в использовании, чем оригинал, и компилируется в виде С или C ++.

Модифицированный код находится в файлах rijndael.h и rijndael.c, которые были объединены в один файл rijndael.txt. Скачайте этот файл, а затем воспользуйтесь текстовым редактором, чтобы отделить две составляющие. Тогда #включите файл rijndael.h в любой модуль, который использует шифрование Rijndael, и скомпилируйте и свяжите файл rijndael.c с приложением.

Для выполнения шифрования Rijndael или дешифрования, сначала настройте буфер на шифрование или расшифровку:

     nrounds = rijndaelSetupEncrypt(rk, key, keybits);  для шифрования

     nrounds = rijndaelSetupDecrypt(rk, key, keybits);  для дешифровки

 неподписанный длинный *rk; указатель на кодирование / расшифровку буфера, занимаемая площадь:

                            keybits  32-битные слова необходимы

                            128      44

                            192      52

                            256      60


     Неизменный неподписанный символ *key; ключ, где длина в байтах:

                                  keybits  кол-во байт

                                  128      16

                                  192      24

                                  256      32

 целочисленные keybit; количество битов в ключе, должны быть 128, 192 или

                           256

     Целочисленные кол-во раундов; кол-во раундов:

                            keybits  nrounds

                            128      10

                            192      12

                            256      14

Пакет предоставляет три макроса для конвертирования значения keybits в тесно связанные значения:

     KEYLENGTH(keybits) количество байт в ключевом [] массиве

     RKLENGTH(keybits)  кол-во 32-bit слов в rk[] массиве

     NROUNDS(keybits)   число раундов

Шифрование и дешифрование выполняется, блок за один раз, со следующими двумя функциями:

     rijndaelEncrypt(rk, nrounds, plaintext, ciphertext);

     rijndaelDecrypt(rk, nrounds, ciphertext, plaintext);

     const unsigned long *rk;

                          указатель на кодирование / расшифровку буфера, который был заполнен rijndaelSetupEncrypt() или

                          rijndaelSetupDecrypt()

     int nrounds;         число раундов, как вычислено

                          rijndaelSetupEncrypt(),

                          rijndaelSetupDecrypt() или NROUNDS

 

     [const] unsigned char plaintext[16];

     [const] unsigned char ciphertext[16];

                          указатели на 16-байт буфера должен быть зашифрован

                          или расшифрован; буфер источника имеет константный

                          спецификатор

Чтобы удовлетворить поистине параноидального пользователя, то, вероятно, целесообразно очистить и удалить буферы после завершения процесса.

В файле rijndael.c, препроцессор макросов FULL_UNROLL был определен. Это заставляет компилятор генерировать встроенный код вместо петли в некоторых местах. Это производит код быстрее, но больше. Вы можете удалить это определение, если вы программируете для окружающей среды, где необходим код меньше, но более медленный.

Загруженный исходный код также включает в себя простую программу шифрования файлов и его соответствующую программу дешифрования.

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

     encrypt  password  cryptofile

Он шифрует стандартный ввод (обивка его с пробелами, если необходимо), и записывает результат в указанный cryptofile.

Программа дешифрования вызывается следующим образом:

    decrypt  password  cryptofile

Это расшифровывает содержимое файлов cryptofile и отправляет результат (дополняется пробелами, если необходимо) на стандартный вывод.

Эти программы должны быть использованы только для демонстрационных целей, поскольку использование пароля в качестве ключа дает эффективную длину ключа намного короче, чем ключ 256 бит, который передается в пакете кодирования Rijndael.

Программа также имеет еще один недостаток, по поводу которого некоторые пользователи могут возражать. Они зашифровывают и расшифровывают каждый 128-битный блок отдельно. Если исходный текст содержит идентичные 128-байтные блоки, как многие текстовые файлы делают, блоки будут зашифрованы одинаково. Это делает некоторые из открытого текста структуры видимыми в зашифрованном тексте, даже для тех, кто не имеет ключа. Обычная практика заключается в объединении каждого блока после первого с предыдущими блоками (обычно с помощью какой-то работы XOR) перед шифрованием. Это скрывает повторяющиеся блоки очень эффективно, но это может нанести ущерб, если даже один блок шифротекста поврежден. Поврежденные блоки и все последующие блоки станут нечитаемыми.

Перевод выполнен с оригинала