
16.10 Gifford
Дэвид Джиффорд (David Gifford) изобрел потоковый шифр и использовал его для шифрования сводок нов о-стей в районе Бостона с 1984 по 1988 год [608, 607, 609]. Алгоритм использует единственный 8-байтовый регистр: bo, b\, . . . , b-i. Ключом является начальное состояние регистра. Алгоритм работает в режиме OFB, открытый текст абсолютно не влияет на работу алгоритма. (См. -1-й).
Сдвиг
вправо
на
приклеива
нием
зво
\
/13двиг
влево на
1 бит )
1 Бит "с
Сброс
Рис. 16-17. Gifford.
Для генерации байта ключа kt объединим Ьо и Ъ\, а также объединим ла, получая 32-битовое число. Третьим слева байтом и будет kt.
и ^- Перемножим полученные чис-
Для обновления регистра возьмем Ъ\ и сдвинем вправо "с приклеиванием" на 1 бит следующим образом: крайний левый бит одновременно и сдвигается, и остается на месте . Возьмем bj и сдвинем его на один бит влево, в крайней правой позиции должен появиться 0. Выполним XOR измененного Ь\, измененного bj и Ь$. Сдвинем первоначальный байт регистра на 1 бит вправо и поместим этот байт в крайнюю левую позицию .
В течение всего времени использования этот алгоритм оставался безопасным, но он был взломан в 1994 году [287]. Оказалось, что многочлен обратной связи не был примитивным и, таким образом, мог быть вскрыт .
16.11 Алгоритм м
Это название дано Кнутом [863]. Алгоритм представляет собой способ объединить несколько псевдослучайных потоков, увеличивая их безопасность. Выход одного генератора используется для выбора отстающего в ы-хода другого генератора [996, 1003]. На языке С:
tdefine ARR_SIZE (8192) /* например - чем больше, тем лучше */ static unsigned char delay[ ARRSIZE ] ; unsigned char prngA( void ) long prngB( void ) ; void init_algM( void ) {
long i ;
for ( i = 0 ; i < ARR_SIZE ; i++ )
delay [i] = prngAO ; } /* lnlt_algM */ unsigned char alglM( void ) {
long j,v ;
j = prngBO % ARR_SIZE ; /* получить индекс delay[]*/
v = delay[j] ; /* получить возвращаемое значение */
delay[j] = prngAO ; /* заменить его */
return ( v ) ;
} /* algM */
Смысл состоит в том, что если prngA - действительно случайно, невозможно ничего узнать о prngB (и, следовательно, невозможно выполнить криптоанализ). Если prngA имеет такой вид, что его криптоанализ может быть выполнен только, если его выход доступен в свою очередь (т.е., только если сначала был выполнен крип-
тоанализ prngB), а в противном случае оно по сути действительно случайно, то эта комбинация должна быть безопасной.
16.12 Pkzip
Алгоритм шифрования, встроенный в программу сжатия данных PKZIP, был разработан Роджером Шлафлы (Roger Schlafly). Это потоковый шифр, шифрующий данные побайтно. По крайней мере этот алгоритм используется в версии 2.04g. Я не могу ничего сказать о более поздних версиях, но если не было сделано никаких з а-явлений об обратном, можно считать с большой вероятностью, что алгоритм не изменился . Алгоритм использует три 32-битовых переменных, инициализированных следующим образом :
Ко = 305419896
^1 = 591751049
К2 = 878082192
Используется 8-битовый ключ К3, полученный из К2. Вот этот алгоритм (в стандартной нотации С):
Q=Pi*K3
Ко= сгс32 (Ко, Р,)
Ki= Ki+ (Ko & OxOOOOOOff)
Ki=Ki* 134775813+1
K2 = crc32 (K2, Ki » 24)
К3 = ((К2\2)*((К2\2Г1))»%
Функция crc32 берет свое предыдущее значение и байт, выполняет их XOR и вьгаисляет следующее значение с помощью многочлена CRC, определенного 0xedb88320. На практике 256-элементная таблица может быть рассчитана заранее, и вычисление сгс32 превращается в:
сгс32 (а, Ь) = (а » 8) л table [(a & Oxfi) ® Ъ ]
Таблица рассчитывается в соответствии с первоначальным определением сгс32:
table [i] = crc32 (i, 0)
Для шифрования потока открытого текста сначала для обновления ключей зациклим байты ключа в алг о-ритме шифрования. Полученный шифротекст на этом этапе игнорируется. Затем побайтно зашифруем открытый текст. Открытому тексту предшествуют двенадцать случайных байтов, но это на самом деле неважно . Дешифрирование похоже на шифрование за исключением того, что во втором действии алгоритма вместо Р,- используется С,.
Безопасность PKZIP
К сожалению она не слишком велика. Для вскрытия нужно от 40 до 2000 байтов известного открытого те к-ста, временная сложность вскрытия составит около 227 [166]. На вашем персональном компьютере это можно сделать за несколько часов. Если в сжатом файле используются какие-нибудь стандартные заголовки, получ е-ние известного открытого текста не представляет собой проблемы . Не используйте встроенное в PKZIP шифрование.