|
RC2 состоит из трех частей: агоритм расширения ключа, алгоритм шифрования,
алгоритм расшифровки. В тексте алгоритма используются следующие обозначения:
- Поразрядное исключающее ИЛИ, обозначенно " ^ ".
- Поразрядное И, обозначенно " & "
- Поразрядное НЕ, обозначенно " ~ ".
- Операция >>> - циклический сдвиг вправо x на y
- Операция <<< - циклический сдвиг влево x на y
Расширение ключа.
Сначала создается 256-байтовый S-блок каждый i-й элемент которого получается
так: Sbox[i]=Beale[i] mod 256 XOR pad[i], где Beale[i] - элемент из шифра
Beal (кода), pad[i] - элемент из шифра pad (кода) . Далее происходит расширение
ключа к 128 байтам, ключ расширяется так, чтобы заполнить 128 байтов (64 слова).
При расширении берут сумму первого и последнего байта ключа, ищут сумму (mod
256) в S-блоке и добавляют результат в ключ. Операция повторяется со вторым и
последним новым байтом пока ключ не будет сформирован до 128.
Первоначально i=0, а j=lengh(K) (длинне ключа K) for j = 0 to length-1 do
S[ j ] = K[ j ]
for j = length to 127 do s[ j ] = sBox[ ( S[ j-length ] + S[ j-1 ] ) mod 256 ];Последним
шагом меняют первый байт ключа и байтом выбранным из S-блока. S[ 0 ] = sBox[ S[ 0 ] ]
Шифрование.
Шифрование представляет собой добавление к тексту сформированного ключа и
циклического сдвига этой суммы. Шифр имеет 16 полных раундов, каждый разделенный
в 4 подраунда. Два из полных раундов выполняют дополнительное преобразование
данных. for i = 0 to 15 do j = i * 4;
word0 = ( word0 + ( word1 & ~word3 ) + ( word2 & word3 ) + S[ j+0 ] ) <<< 1
word1 = ( word1 + ( word2 & ~word0 ) + ( word3 & word0 ) + S[ j+1 ] ) <<< 2
word2 = ( word2 + ( word3 & ~word1 ) + ( word0 & word1 ) + S[ j+2 ] ) <<< 3
word3 = ( word3 + ( word0 & ~word2 ) + ( word1 & word2 ) + S[ j+3 ] ) <<< 5
Кроме того пятые и одиннадцатые раунды добавляют содержание S-блока,
индексированного одним из слов данных к другому после четырех подраундов
следующим образом: word0 = word0 + S[ word3 & 63 ];
word1 = word1 + S[ word0 & 63 ];
word2 = word2 + S[ word1 & 63 ];
word3 = word3 + S[ word2 & 63 ];
Расшифровка.
Операция расшифровки - просто инверсия операции шифрования. for i = 15 downto 0 do j = i * 4;
word3 = ( word3 >>> 5 ) - ( word0 & ~word2 ) - ( word1& word2 ) - S[ j+3 ]
word2 = ( word2 >>> 3 ) - ( word3 & ~word1 ) - ( word0 & word1 ) - S[ j+2 ]
word1 = ( word1 >>> 2 ) - ( word2 & ~word0 ) - ( word3 & word0 ) - S[ j+1 ]
word0 = ( word0 >>> 1 ) - ( word1 & ~word3 ) - ( word2 & word3 ) - S[ j+0 ]
Кроме того пятые и одиннадцатые раунды вычитают содержание S-блока,
индексированного одним из слов данных из другого после четырех подраундов
следующим образом: word3 = word3 - S[ word2 & 63 ]
word2 = word2 - S[ word1 & 63 ]
word1 = word1 - S[ word0 & 63 ]
word0 = word0 - S[ word3 & 63 ]
В данном алгоритме возможны неточности в виду конфиденциальности этого
алгоритма. Информация была взята из источика: pgut01@cs.auckland.ac.nz (Peter
Gutmann), posting to sci.crypt
Назад
|