Аддитивные генераторы
Аддитивные генераторы (иногда называемые запаздывающими генераторами Фиббоначи) очень эффективны, так как их результатом являются случайные слова, а не случайные биты [863]. Сами по себе они не безопасны, но их можно использовать в качестве составных блоков для безопасных генераторов.
Начальное состояние генератора представляет собой массив n-битовых слов: 8-битовых слов, 16-битовых слов, 32-битовых слов, и т.д.: X1, X2, X3, ..., Xm. Это первоначальное состояние и является ключом. i-ое слово генератора получается как
Xi= (Xi-a + Xi-b+ Xi-c+ + Xi-m) mod 2n
При правильном выборе коэффициентов a, b, c, . . . , mпериод этого генератора не меньше 2n-1. Одним из требований к коэффициентам является то, что младший значащий бит образует LFSR максимальной длины.
Например, (55,24,0) - это примитивный многочлен mod 2 из Табл. 16-2. Это означает, что длина следующего аддитивного генератора максимальна.
Xi= (Xi-55 +Xi-24) mod 2n
Это работает, так как у примитивного многочлена три коэффициента. Если бы их было больше, для получения максимальной длины потребовались бы дополнительные условия. Подробности можно найти в [249].
Fish
Fish - это аддитивный генератор, основанный на методах, используемых в прореживаемом генераторе [190]. Он выдает поток 32-битовых слов, которые могут быть использованы (с помощью XOR) с потоком открытого текста для получения шифротекста или с потоком шифротекста для получения открытого текста. Название алгоритма представляет собой сокращение от Fibonacci shrinking generator - прореживаемый генератор Фиббоначи.
Во первых используйте два следующих аддитивных генератора. Ключом является начальные состояния этих генераторов.
Ai= (Ai-55 +Ai-24) mod 232
Bi= (Bi-52 +Bi-19) mod 232
Эти последовательности прореживаются попарно в зависимости от младшего значащего бита Bi: если его значение равно 1, то пара используется, если 0 - игнорируется. Cj - это последовательность используемых слов Ai, а Dj - это последовательность используемых слов Bi. Для генерации двух 32-битовых слов-результатов K2jи K2j+1 эти слова используются парами - C2j, C2j+1, D2j, D2j+1.
E2j = C2j Å (D2j, Ù D2j+1)
F2j = D2j+1 Ù (Ej, Ù C2j+1)
K2j = E2j Å F2j
K2j+1 = C2j+1 Å F2j
Этот алгоритм быстр. на процессоре i486/33 реализация Fish на языке C шифрует данные со скоростью 15‑Мбит/с. К сожалению он также не безопасен, порядок вскрытия составляет около 240 [45].
Pike
Pike - это обедненная и урезанная версия Fish, предложенная Россом Андерсоном, тем, кто взломал Fish [45]. Он использует три аддитивных генератора. Например:
Ai= (Ai-55 +Ai-24) mod 232
Bi= (Bi-57 +Bi-7 ) mod 232
Ci= (Ci-58 +Ci-19) mod 232
Для генерации слова потока ключей взгляните на биты переноса при сложении. Если все три одинаковы (все нули или все единицы), то тактируются все три генератора. Если нет, то тактируются только два совпадающих генератора. Сохраните биты переноса для следующего раза. Окончательным выходом является XOR выходов трех генераторов.
Pike быстрее Fish, так как в среднем для получения результата нужно 2.75 действия, а не 3. Он также слишком нов, чтобы ему доверять, но выглядит очень неплохо.
Mush
Mush представляет собой взаимно прореживающий генератор. Его работу объяснить легко [1590]. Возьмем два аддитивных генератора: Aи B. Если бит переноса Aустановлен, тактируется B. Если бит переноса B установлен, тактируется A. Тактируем Aи при переполнении устанавливаем бит переноса. Тактируем B и при переполнении устанавливаем бит переноса. Окончательным выходом является XOR выходов Aи B. Проще всего использовать те же генераторы, что и в Fish:
Ai= (Ai-55 +Ai-24) mod 232
Bi= (Bi-52 +Bi-19) mod 232
В среднем для генерации одного выходного слова нужно три итерации генератора. И если коэффициенты аддитивного генератора выбраны правильно и являются взаимно простыми, длина выходной последовательности будет максимальна. Мне неизвестно об успешных вскрытиях, но не забывайте, что этот алгоритм очень нов.
Gifford
Дэвид Джиффорд (David Gifford) изобрел потоковый шифр и использовал его для шифрования сводок новостей в районе Бостона с 1984 по 1988 год [608, 607, 609]. Алгоритм использует единственный 8-байтовый регистр: b0, b1, . . . , b7. Ключом является начальное состояние регистра. Алгоритм работает в режиме OFB, открытый текст абсолютно не влияет на работу алгоритма. (См.
Рис. 16-17).
Рис. 16-17. Gifford.
Для генерации байта ключа kiобъединим b0 и b1, а также объединим b4 и b7. Перемножим полученные числа, получая 32-битовое число. Третьим слева байтом и будет ki.
Для обновления регистра возьмем b1 и сдвинем вправо "с приклеиванием" на 1 бит следующим образом: крайний левый бит одновременно и сдвигается, и остается на месте. Возьмем b7 и сдвинем его на один бит влево, в крайней правой позиции должен появиться 0. Выполним XOR измененного b1, измененного b7 и b0. Сдвинем первоначальный байт регистра на 1 бит вправо и поместим этот байт в крайнюю левую позицию.
В течение всего времени использования этот алгоритм оставался безопасным, но он был взломан в 1994 году [287]. Оказалось, что многочлен обратной связи не был примитивным и, таким образом, мог быть вскрыт.
Алгоритм M
Это название дано Кнутом [863]. Алгоритм представляет собой способ объединить несколько псевдослучайных потоков, увеличивая их безопасность. Выход одного генератора используется для выбора отстающего выхода другого генератора [996, 1003]. На языке C:
#define 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] = prngA() ;
} /* lnlt_algM */
unsigned char alglM( void ) {
long j,v ;
j = prngB() % ARR_SIZE ; /* получить индекс delay[]*/
v = delay[j] ; /* получить возвращаемое значение */
delay[j] = prngA() ; /* заменить его */
return ( v ) ;
} /* algM */
Смысл состоит в том, что если prngA - действительно случайно, невозможно ничего узнать о prngB (и, следовательно, невозможно выполнить криптоанализ). Если prngA имеет такой вид, что его криптоанализ может быть выполнен только, если его выход доступен в свою очередь (т.е., только если сначала был выполнен криптоанализ prngB), а в противном случае оно по сути действительно случайно, то эта комбинация должна быть безопасной.
PKZIP
Алгоритм шифрования, встроенный в программу сжатия данных PKZIP, был разработан Роджером Щлафлы (Roger Schlafly). Это потоковый шифр, шифрующий данные побайтно. По крайней мере этот алгоритм используется в версии 2.04g. Я не могу ничего сказать о более поздних версиях, но если не было сделано никаких заявлений об обратном, можно считать с большой вероятностью, что алгоритм не изменился. Алгоритм использует три 32-битовых переменных, инициализированных следующим образом:
K0= 305419896
K1= 591751049
K2= 878082192
Используется 8-битовый ключ K3, полученный из K2. Вот этот алгоритм (в стандартной нотации C):
Ci=Pi ^ K3
K0= crc32 (K0, Pi)
K1= K1+ (K0& 0x000000ff)
K1= K1*134775813 + 1
K2= crc32 (K2, K1>>24)
K3= ((K2| 2)* ((K2| 2)^1)) >> 8
Функция crc32 берет свое предыдущее значение и байт, выполняет их XOR и вычисляет следующее значение с помощью многочлена CRC, определенного 0xedb88320. На практике 256-элементная таблица может быть рассчитана заранее, и вычисление crc32 превращается в:
crc32 (a, b) = (a >> 8) ^table [(a & 0xff) Å b ]
Таблица рассчитывается в соответствии с первоначальным определением crc32:
table [i] = crc32 (i, 0)
Для шифрования потока открытого текста сначала для обновления ключей зациклим байты ключа в алгоритме шифрования. Полученный шифротекст на этом этапе игнорируется. Затем побайтно зашифруем открытый текст. Открытому тексту предшествуют двенадцать случайных байтов, но это на самом деле неважно. Дешифрирование похоже на шифрование за исключением того, что во втором действии алгоритма вместо Pi используется Ci.
Безопасность PKZIP
К сожалению она не слишком велика. Для вскрытия нужно от 40 до 2000 байтов известного открытого текста, временная сложность вскрытия составит около 227 [166]. На вашем персональном компьютере это можно сделать за несколько часов. Если в сжатом файле используются какие-нибудь стандартные заголовки, получение известного открытого текста не представляет собой проблемы. Не используйте встроенное в PKZIP шифрование.
Дата добавления: 2021-01-26; просмотров: 709;