Описание SAFER K-64
Блок открытого текста делится на восемь байтовых подблоков: B1, B2, . . . , B7, B8. Затем подблоки обрабатываются в ходе r этапов. Наконец подблоки подвергаются заключительному преобразованию. На каждом этапе используется два подключа: K2r-1 и K2r.
На Рис. 14-4 показан один этап SAFER K-64. Сначала над подблоками выполняется либо операция XOR, либо сложени с байтами подключа K2r-1. Затем восемь подблоков подвергаются одному из двух нелинейных преобразований:
y = 45x mod 257. (Если x = 0, то y = 0.)
y = log45 x. (Если x = 0, то y = 0.)
Рис. 14-4. Один этап SAFER.
Это операции в конечном поле GF(257), а 45 - элемент поля, являющийся примитивом. В реализациях SAFER K-64 быстрее выполнять поиск в таблице, чем все время рассчитывать новые результаты.
Затем подблоки либо подвергаются XOR, либо складываются с байтами подключа K2r. Результат этого действия проходит через три уровня линейных операций, целью которых является увеличение лавинного эффекта. Каждая операция называется псевдоадамаровым преобразованием (Pseudo-Hadamard Transform, PHT). Если на входе PHT a1 и a2, то на выходе:
b1 = (2a1 + a2) mod 256
b2 = (a1 + a2) mod 256
После r этапов выполняется заключительное преобразование. Оно совпадает с преобразованием, являющимся первым действием каждого этапа. Над B1, B4, B5 и B8 выполняется XOR с соответствующими байтами последнего подключа, а B2, B3, B6 и B7 складываются с соответствующими байтами последнего подключа. В результате и получается шифротекст.
Дешифрирование представляет собой обратный процесс: сначала заключительное преобразование (с вычитанием вместо сложения), затем r инвертированных этапов. Обратное PHT (Inverse PHT, IPHT) - это:
a1 = (b1 - b2) mod 256
a2 = (-b1 + 2b2) mod 256
Массей рекомендует использовать 6 этапов, но для большей безопасности количество этапов можно увеличить.
Генерировать подключи совсем не трудно. Первый подключ, K1, - это просто ключ пользователя. Последующие ключи генерируются в соответствии со следующей процедурой:
Ki+1 = (Ki <<<3i) + ci
Символ "<<<" обозначает циклический сдвиг налево. Сдвиг выполняется побайтно, а ci является константой этапа. Если cij - это j-ый байт константы i-го этапа, то можно рассчитать все константы этапов по следующей формуле
cij = 4545^((9i+j) mod 256) mod 257 mod 257
Обычно эти значения хранятся в таблице.