В криптографии RC5 — это блочный шифр с симметричным ключом, отличающийся своей простотой. Разработанный Рональдом Ривестом в 1994 году, [2] RC означает «шифр Ривеста» или, альтернативно, «код Рона» (сравните RC2 и RC4 ). Кандидат RC6 для расширенного стандарта шифрования (AES) был основан на RC5.
В отличие от многих схем, RC5 имеет переменный размер блока (32, 64 или 128 бит ), размер ключа (от 0 до 2040 бит) и количество раундов (от 0 до 255). Первоначально предложенный выбор параметров включал размер блока 64 бита, 128-битный ключ и 12 раундов.
Ключевой особенностью RC5 является использование ротации в зависимости от данных; Одной из целей RC5 было стимулирование изучения и оценки таких операций как криптографических примитивов . [ нужна цитация ] RC5 также состоит из ряда модульных дополнений и исключительных ИЛИ (XOR) . Общая структура алгоритма представляет собой сеть типа Фейстеля , аналогичную RC2. Процедуры шифрования и дешифрования можно указать в нескольких строках кода. Расписание ключей, однако, более сложное: расширение ключа осуществляется с использованием, по сути, односторонней функции с двоичными разложениями как e , так и золотого сечения в качестве источников « ничего в запасе ». Дразнящая простота алгоритма вместе с новизной вращения, зависящего от данных, сделали RC5 привлекательным объектом изучения для криптоаналитиков. [ по мнению кого? ] RC5 в основном обозначается как RC5-w/r/b, где w = размер слова в битах, r = количество раундов, b = количество байтов в ключе.
Шифрование и дешифрование RC5 расширяют случайный ключ до 2 (r+1) слов, которые будут использоваться последовательно (и только один раз каждое) во время процессов шифрования и дешифрования. Все нижеизложенное взято из пересмотренной статьи Ривеста по RC5. [3]
Алгоритм расширения ключа показан ниже, сначала в псевдокоде , затем в примере кода C , скопированного непосредственно из приложения к справочному документу.
Следуя схеме именования, приведенной в статье, используются следующие имена переменных:
# Разбиваем K на слова # u = w / 8 c = потолок ( max ( b , 1 ) / u ) # L изначально представляет собой список длиной c 0-значных слов длины w для i = b - 1 до 0 делать : L [ я / ты ] = ( L [ я / ты ] <<< 8 ) + K [ я ] # Инициализация независимого от ключа псевдослучайного массива S # Первоначально S представляет собой список неопределенных слов длины w = 2(r+1) S [ 0 ] = P_w for i = 1 до t - 1 do : S [ i ] = S [ я - 1 ] + Q_w # Цикл планирования основного ключа i = j = 0 A = B = 0 do 3 * max ( t , c ) раз : A = S [ i ] = ( S [ i ] + A + B ) <<< 3 B = L [ j ] знак равно ( L [ j ] + A + B ) <<< ( A + B ) я знак равно ( я + 1 ) % t j = ( j + 1 ) % c# возврат С
Пример исходного кода взят из приложения к статье Ривеста о RC5. Реализация предназначена для работы с w = 32, r = 12 и b = 16.
void RC5_SETUP ( unsigned char * K ) { // w = 32, r = 12, b = 16 // c = max(1, ceil(8 * b/w)) // t = 2 * (r+1) СЛОВО я , j , k , ты знак равно ш / 8 , А , B , L [ c ]; для ( я знак равно б -1 , L [ c -1 ] = 0 ; я != -1 ; я -- ) L [ я / ты ] = ( L [ я / ты ] << 8 ) + K [ я ] ; для ( S [ 0 ] знак равно п , я знак равно 1 ; я < т ; я ++ ) S [ я ] знак равно S [ я -1 ] + Q ; for ( A = B = я = j = k = 0 ; k < 3 * t ; k ++ , я = ( i + 1 ) % t , j = ( j + 1 ) % c ) { A = S [ я ] = ROTL ( S [ я ] + ( А + B ), 3 ); B = L [ j ] = ROTL ( L [ j ] + ( A + B ), ( A + B )); } }
Шифрование включало несколько раундов простой функции, из которых, по-видимому, рекомендуется 12 или 20 раундов, в зависимости от требований безопасности и соображений времени. Помимо переменных, использованных выше, в этом алгоритме используются следующие переменные:
A = A + S [ 0 ] B = B + S [ 1 ] для i = 1 до r сделайте : A = (( A ^ B ) <<< B ) + S [ 2 * i ] B = (( B ^ А ) <<< А ) + S [ 2 * я + 1 ]# Блок зашифрованного текста состоит из блока из двух слов, состоящего из A и B в указанном порядке. вернуть А , Б
Пример кода C, предоставленный Ривестом, таков.
void RC5_ENCRYPT ( WORD * pt , WORD * ct ) { WORD i , A = pt [ 0 ] + S [ 0 ], B = pt [ 1 ] + S [ 1 ]; для ( я знак равно 1 ; я <= р ; я ++ ) { A = ROTL ( A ^ B , B ) + S [ 2 * я ]; B = ROTL ( B ^ A , A ) + S [ 2 * я + 1 ]; } ct [ 0 ] знак равно А ; ct [ 1 ] знак равно B ; }
Дешифрование представляет собой довольно простой процесс обращения процесса шифрования. Приведенный ниже псевдокод показывает процесс.
для i = r до 1 сделайте : B = (( B - S [ 2 * i + 1 ]) >>> A ) ^ A A = (( A - S [ 2 * i ] ) >>> B ) ^ B B знак равно B - S [ 1 ] А = А - S [ 0 ] вернуть А , Б
Пример кода C, предоставленный Ривестом, таков.
void RC5_DECRYPT ( WORD * ct , WORD * pt ) { WORD i , B = ct [ 1 ], A = ct [ 0 ]; для ( я знак равно р ; я > 0 ; я -- ) { B = ROTR ( B - S [ 2 * я + 1 ], A ) ^ A ; А знак равно ROTR ( А - S [ 2 * я ], B ) ^ B ; } пт [ 1 ] = B - S [ 1 ]; пт [ 0 ] = А - S [ 0 ]; }
Двенадцатираундовый RC5 (с 64-битными блоками) подвержен дифференциальной атаке с использованием 244 выбранных открытых текстов. [1] В качестве достаточной защиты предлагается 18–20 патронов.
Ряд этих проблем был решен с помощью распределенных вычислений , организованных Distributed.net . Distributed.net использует брутфорсированные сообщения RC5, зашифрованные с помощью 56-битных и 64-битных ключей, и работает над взломом 72-битного ключа с 3 ноября 2002 года. [4] По состоянию на 26 июля 2023 года 10,409% пространство ключей было исследовано, и, судя по скорости, зарегистрированной в тот день, для заполнения 100% пространства ключей потребуется чуть больше 59 лет. [5] Эта задача вдохновила на множество новых и нестандартных разработок в области кластерных вычислений. [6]
RSA Security , у которой был патент на алгоритм (сейчас срок действия которого истек), [7] предложила серию призов в размере 10 000 долларов США за взлом зашифрованных текстов, зашифрованных с помощью RC5, но эти конкурсы были прекращены в мае 2007 года. [4] В результате были распространены .net решил профинансировать денежный приз. Человек, обнаруживший выигрышный ключ, получит 1000 долларов США, его команда (если применимо) получит 1000 долларов США, а Фонд свободного программного обеспечения получит 2000 долларов США. [8]