Анимация
JavaScript
|
Главная Библионтека 32 бита 8 битов 8 битов 8 битов 8 битов S-блок 1 З-блок 2 S-блок 3 З-блок 4 i 32 бита Рис. 14-3. Функция F. Функция F представляет собой следующее (см. Рис. 14-3): Разделить xL на четыре 8-битовых части: a, b, c и d F(Xi) = ((S1,a + S2,b mod 232) e S3,c)+ S4,d mod 232 Дешифрирование выполняется точно также, как и шифрование, но P1, P2, . . P18 используются в обратном порядке. В реализациях Blowfish, для которых требуется очень большая скорость, цикл должен быть развернут, а все ключи должны храниться в кэше. Подробности приведены в [568]. Подключи рассчитываются с помощью специального алгоритма. Вот какова точная последовательность де й-ствий. (1) Сначала P-массив, а затем четыре S-блока по порядку инициализируются фиксированной строкой. Эта строка состоит из шестнадцатиричных цифр п. (2) Выполняется XOR P1 с первыми 32 битами ключа, XOR P2 со вторыми 32 битами ключа, и так далее для всех битов ключа (до P18). Используется циклически, пока для всего P-массива не будет выполнена опер а-ция XOR с битами ключа. (3) Используя подключи, полученные на этапах (1) и (2), алгоритмом Blowfish шифруется строка из одних нулей. (4) P1 и P2 заменяются результатом этапа (3). (5) Результат этапа (3) шифруется с помощью алгоритма Blowfish и измененных подключей. (6) P3 и P4 заменяются результатом этапа (5). (7) Далее в ходе процесса все элементы P-массива и затем по порядку все четыре S-блока заменяются вых о-дом постоянно меняющегося алгоритма Blowfish. Всего для генерации всех необходимых подключей требуется 521 итерация. Приложения могут сохранять подключи - нет необходимости выполнять процесс их получения многократно. Безопасность Blowfish Серж Воденэ (Serge Vaudenay) исследовал Blowfish с известными S-блоками и r этапами, дифференциал ь-ный криптоанализ может раскрыть P-массив с помощью 2 8r+1 выбранных открытых текстов [1568]. Для некоторых слабых ключей, которые генерируют плохие S-блоки (вероятность выбора такого ключа составляет 1 к 2 14), это же вскрытие раскрывает P-массив с помощью всего 24r+1. При неизвестных S-блоках это вскрытие может обнаружить использование слабого ключа, но не может определит сам ключ (ни S-блоки, ни P-массив). Это вскрытие эффективно только против вариантов с уменьшенным числом этапов и совершенно бесполезно против 16-этапного Blowfish. Конечно, важно и раскрытие слабых ключей, даже хотя они скорее всего не будут использоваться. Слабым является ключ, для которого два элемента данного S-блока идентичны. До выполнения развертывания ключа невозможно определить, является ли он слабым. Если вы беспокоитесь об этом, вам придется выполнить ра з- вертывание ключа и проверить, нет ли в S-одинаковых элементов. Хотя я не думаю, что это так уж необходимо. Мне неизвестно об успешном криптоанализе Blowfish. Для безопасности не реализуйте Blowfish с умен ь-шенным числом этапов. Kent Marsh Ltd. встроила Blowfish в свой продукт обеспечения безопасности FolderBolt, предназначенный для Microsoft Windows и Macintosh. Алгоритм также входит в Nautilus и PGPfone. 14.4 SAFER SAFER K-64 означает Secure And Fast Encryption Routine with a Key of 64 bits - Безопасная и быстрая проц е-дура шифрования с 64-битовым ключом [1009]. Этот не являющийся частной собственностью алгоритм, разр а-ботанный Джеймсом Массеем (James Massey) для Cylink Corp., используется в некоторых из продуктов этой компании. Правительство Сингапура собирается использовать этот алгоритм - с 128-битовым ключом [1010] -для широкого спектра приложений. Его использование не ограничено патентом, авторскими правами или др у-гими ограничениями. Алгоритм работает с 64-битовым блоком и 64-битовым ключом. В отличие от DES он является не сетью Фейстела (см. раздел 14.10), а итеративным блочным шифром: для некоторого количества этапов применяется одна и та же функция. На каждом этапе используются два 64-битовых подключа. Алгоритм оперирует только байтами. Описание SAFER K-64 Блок открытого текста делится на восемь байтовых подблоков: В1, В2, . . . , В7, В8. Затем подблоки обрабатываются в ходе 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.) Вход этапа (8 байтов) 1 2 3 4 5 6 7 8 45() log45 log45 45() 45() log45 xor add add xor xor add add xor log45 45() 1 2 3 4 5 6 7 8 Выход этапа (8 байтов) Рис. 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 этапов выполняется заключительное преобразование. 0но совпадает с преобразованием, являющи м-ся первым действием каждого этапа. Над В1, В4, В5 и В8 выполняется XOR с соответствующими байтами последнего подключа, а В2, В3, В6 и В7 складываются с соответствующими байтами последнего подключа. В р е-зультате и получается шифротекст. Дешифрирование представляет собой обратный процесс: сначала заключительное преобразование (с выч и-танием вместо сложения), затем r инвертированных этапов. 0братное PHT (Inverse PHT, IPHT) - это: a1 = (b1 - b2) mod 256 a2 = (-b1 + 2b2) mod 256 Массей рекомендует использовать 6 этапов, но для большей безопасности количество этапов можно увел и-чить. Генерировать подключи совсем не трудно. Первый подключ, K1, - это просто ключ пользователя. Последующие ключи генерируются в соответствии со следующей процедурой: = (Ki «<3i) + Ci Символ "<<<" обозначает циклический сдвиг налево. Сдвиг выполняется побайтно, а ci является константой этапа. Если с,, - это у-ый байт константы i-го этапа, то можно рассчитать все константы этапов по следующей 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [ 26 ] 27 28 29 30 |