4.5. Современные блочные шифры
79
Существует интересный прием программной реализации шифра Serpent.
Обычная реализация “в лоб” работала бы слишком медленно, потому что
в каждом раунде необходимо выполнять поиск соответствий в 32 S-матрицах,
а таких раундов тоже 32. В сумме необходимо 1024 раза проделать поиск со-
ответствий, а проводить операции поиска одну за другой было бы слишком
медленно. Вместо этого S-матрицы представляют в виде булевых функций.
Каждый из четырех выходных битов представляется как результат выпол-
нения булевой
функции от четырех входных битов. После этого процессор
непосредственно вычисляет значение булевой функции, используя команды
AND, OR и XOR. Хитрость заключается в том, что 32-разрядный процессор
может одновременно подсчитывать значения 32 таких функций, поскольку
каждая позиция двоичного разряда в регистрах процессора вычисляет значе-
ние одной и той же функции, хотя и с разными входными данными. Такой тип
реализации называется
разрядно-модульным (bitslice)
. Шифр Serpent специ-
ально спроектирован в
расчете на разрядно-модульную архитектуру. Помимо
S-матриц, она позволяет относительно легко вычислять значения функций
перемешивания.
Если бы Serpent был таким же быстрым, как Rijndael (теперешний AES),
он бы практически наверняка выиграл конкурс благодаря своей консерватив-
ной структуре. Но скорость —
понятие относительное. В перерасчете на за-
шифрованный байт Serpent оказывается почти таким же быстрым, как DES,
и намного быстрее, чем 3DES. Он кажется медленным только по сравнению
с другими финалистами конкурса AES.
4.5.4
Twofish
Алгоритм Twofish также вошел в число финалистов AES. Он представля-
ет собой некий компромисс между AES и Serpent — практически такой же
быстрый, как и AES, но обладающий гораздо б´ольшим “запасом прочности”.
Но что еще важнее, он не имеет простого алгебраического представления.
Наилучшая известная нам атака
способна взломать лишь 8 раундов из 16.
Основным недостатком Twofish является относительная дороговизна смены
ключа шифрования. Это объясняется тем, что реализация алгоритма Twofish
требует выполнения целого ряда предварительных операций над ключом.
Подобно DES, алгоритм Twofish основан на шифре Файстеля. Структура
Twofish представлена на рис. 4.3
6
. На вход алгоритма подается 128-битовый
текст. Он разбивается на четыре 32-битовых значения, и большинство опе-
раций выполняются над 32-битовыми значениями. Как видно из рисунка,
6
Не удивляйтесь, что этот рисунок намного больше и подробнее предыдущих. Так уж
получилось, что мы принадлежим к числу разработчиков Twofish, поэтому без всяких за-
зрений совести взяли этот рисунок прямо из нашей книги, посвященной Twofish [85].