В конце 1996 г. Национальным институтом стандартов США (NIST) был объявлен конкурс на создание нового общенационального стандарта шифрования, который должен прийти на замену DES. Разрабатываемому стандарту было присвоено рабочее наименование AES (Advanced Encryption Standard). Отбор проходил в два этапа, после первого среди претендентов осталось 15 кандидатов, после второго - 5.
2 октября 2000 года было принято окончательное решение. В качестве предлагаемого стандарта был выбран алгоритм Rijndael (произносится "Рейн-дал"). Этот алгоритм был разработан Винсентом Райманом (Vincent Rijman) и Йоан Дамен (Joan Daemen) и представляет собой алгоритм, не использующий сети Фейштеля.
При описании алгоритма используется поле Галуа GF(28), построенное как расширение поля GF(2) по корням многочлена m(x) = x^8 + x^4 + х^3 + х + 1. Данный многочлен выбран из соображений эффективности представления элементов поля. Элементарные операции, использующиеся в алгоритме, выполняются в указанном поле.
Алгоритм Rijndael представляет собой блочный шифр с переменной длиной блока и переменной длиной ключа Длины блока и ключа могут быть выбраны независимо равными 128, 192 или 256 бит. Шифр является последовательностью итераций, выполняемых над некоторой промежуточной структурой, называемой состоянием. (Эта терминология заимствована из теории конечных автоматов.) Состояние может быть представлено в виде прямоугольного массива байтов. В массиве 4 строки, а число столбцов, обозначаемое как Nb, равно длине блока, деленной на 32. Ключ шифрования аналогичным образом представляется в виде прямоугольного байтового массива с 4 строками. Количество столбцов, обозначаемое Nk, равно длине ключа, деленной на 32. Входные и выходные значения алгоритма представляются в виде одномерных байтовых массивов соответствующей длины. Состояние и ключевой массив заполняются из этих массивов вначале по столбцам, а затем по строкам. Количество итераций обозначается Nr зависит от Nb и Nk в соответствии со следующей таблицей:
![Стандарт AES. Алгоритм Rijndael](http://codingrus.ru/images/delphi/986.JPG)
Итерационное преобразование состоит из четырех различных преобразований. На С-подобном псевдокоде это выглядит так:
Round (State, RoundKey) {
ByteSub(State);
ShiftRow(State);
MixColumn(State);
AddRoundKey(State, RoundKey);
}
Последняя итерация несколько отличается от всех остальных:
FinalRound (State, RoundKey) {
ByteSub(State);
ShiftRow(State);
AddRoundKey(State, RoundKey);
}
Отдельные преобразования описываются ниже.
Уникальный самый тонкий ноутбук macbook air 2012 - http://gagetstore.ru/catalog/macbook_air специально для программистов. |