RC2 это блочный шифр с ключом переменной длины созданный Роном Ривестом для RSA. "RC" расшифровывается как "Ron's Code" или "Rivest Cipher ". RC2 быстрее чем DES и был спецально разработан для замены DES. Он может быть реализован более или менее защищенным чем DES, в зависимости от длины ключа. RC2 алгоритм конфиденциален и является собственностью RSA. RC2 может использоваться там, где используется DES.

В США длина ключа для использования внутри страны рекомендуется равной 128 битов, но соглашение, заключенное между Software Publishers Association (SPA) и правительством США дает RC2 специальный статус, который означает, что разрешено экспортировать шифры длинной ключа до 40 бит. 56-битные ключи разрешено использовать заграничным отделениям американских компаний.

RC2 с ключами 128 бит обеспечивает такой же уровень безопастности как и IDEA или тройной DES. RC2 используется широко разработчиками, чьи продукты экспортируются за пределы США, поскольку экспортировать DES запрещено.

RC2 состоит из трех частей: агоритм расширения ключа, алгоритм шифрования, алгоритм расшифровки.

В тексте алгоритма используются следующие обозначения:
  1. Поразрядное исключающее ИЛИ, обозначенно " ^ ".
  2. Поразрядное И, обозначенно " & "
  3. Поразрядное НЕ, обозначенно " ~ ".
  4. Операция >>> - циклический сдвиг вправо x на y
  5. Операция <<< - циклический сдвиг влево 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

Назад

mersedes e