Общий | |
---|---|
Дизайнеры | Рон Ривест ( RSA Security ) |
Впервые опубликовано | Утечка в 1994 году (разработан в 1987 году) |
Детали шифра | |
Размеры клавиш | 40–2048 бит |
Размер штата | 2064 бит (1684 эффективно) |
Раунды | 1 |
Скорость | 7 циклов на байт на оригинальном Pentium [1] Модифицированный предполагаемый RC4 на Intel Core 2: 13,9 циклов на байт [2] |
В криптографии RC4 (Rivest Cipher 4, также известный как ARC4 или ARCFOUR , что означает предполагаемый RC4, см. ниже) — это потоковый шифр . Хотя он отличается простотой и скоростью в программном обеспечении, в RC4 было обнаружено множество уязвимостей, делающих его небезопасным. [3] [4] Он особенно уязвим, когда начало выходного потока ключей не отбрасывается или когда используются неслучайные или связанные ключи. Особенно проблемное использование RC4 привело к появлению очень небезопасных протоколов, таких как WEP . [5]
По состоянию на 2015 год [обновлять]существуют предположения, что некоторые государственные криптографические агентства могут обладать способностью взломать RC4 при использовании в протоколе TLS . [6] IETF опубликовала RFC 7465, чтобы запретить использование RC4 в TLS; [3] Mozilla и Microsoft выпустили аналогичные рекомендации. [7] [8]
Было предпринято несколько попыток усилить RC4, в частности Spritz, RC4A, VMPC и RC4 + .
RC4 был разработан Роном Ривестом из RSA Security в 1987 году. Хотя официально он называется «Rivest Cipher 4», аббревиатуру RC также можно расшифровать как «Ron's Code» [9] (см. также RC2 , RC5 и RC6 ).
Первоначально RC4 был коммерческой тайной , но в сентябре 1994 года его описание было анонимно опубликовано в списке рассылки Cypherpunks . [10] Вскоре он был опубликован в группе новостей sci.crypt , где был взломан в течение нескольких дней Бобом Дженкинсом . [11] Оттуда он распространился на многие сайты в Интернете. Утечка кода была подтверждена как подлинная, поскольку было обнаружено, что его вывод совпадает с выводом проприетарного программного обеспечения, использующего лицензированный RC4. Поскольку алгоритм известен, он больше не является коммерческой тайной. Название RC4 является торговой маркой, поэтому RC4 часто называют ARCFOUR или ARC4 (что означает предполагаемый RC4 ) [12] , чтобы избежать проблем с торговой маркой. RSA Security никогда официально не публиковала алгоритм; однако Ривест сослался на статью английской Википедии о RC4 в своих собственных курсовых заметках в 2008 году [13] и подтвердил историю RC4 и его кода в своей статье 2014 года. [14]
RC4 стал частью некоторых широко используемых протоколов и стандартов шифрования, таких как WEP в 1997 году и WPA в 2003/2004 годах для беспроводных карт; и SSL в 1995 году и его преемник TLS в 1999 году, пока он не был запрещен для всех версий TLS RFC 7465 в 2015 году из-за атак RC4, ослабляющих или разрушающих RC4, используемый в SSL/TLS. Главными факторами успеха RC4 в таком широком спектре приложений были его скорость и простота: эффективные реализации как в программном обеспечении, так и в оборудовании было очень легко разрабатывать.
RC4 генерирует псевдослучайный поток битов ( keystream ). Как и в случае с любым потоковым шифром, их можно использовать для шифрования, комбинируя их с открытым текстом с помощью побитового исключающего или ; расшифровка выполняется таким же образом (поскольку исключающее или с заданными данными является инволюцией ) . Это похоже на одноразовый блокнот , за исключением того, что используются сгенерированные псевдослучайные биты , а не подготовленный поток.
Для генерации ключевого потока шифр использует секретное внутреннее состояние, которое состоит из двух частей:
Перестановка инициализируется ключом переменной длины , обычно от 40 до 2048 бит, с использованием алгоритма планирования ключей (KSA). После завершения этого процесса поток битов генерируется с использованием алгоритма псевдослучайной генерации (PRGA).
Алгоритм планирования ключей используется для инициализации перестановки в массиве «S». «длина ключа» определяется как количество байтов в ключе и может находиться в диапазоне 1 ≤ длина ключа ≤ 256, обычно от 5 до 16, что соответствует длине ключа 40–128 бит. Сначала массив «S» инициализируется для перестановки идентичности . Затем S обрабатывается в течение 256 итераций аналогично основному PRGA, но также одновременно подмешивает байты ключа.
для i от 0 до 255 S[i] := iконецдляj := 0для i от 0 до 255 j := (j + S[i] + key[i mod keylength]) mod 256 поменять местами значения S[i] и S[j]конецдля
Для стольких итераций, сколько необходимо, PRGA изменяет состояние и выводит байт ключевого потока. В каждой итерации PRGA:
Каждый элемент S меняется местами с другим элементом не реже одного раза в 256 итераций.
я := 0j := 0при генерации выходных данных: я := (я + 1) mod 256 j := (j + S[i]) mod 256 поменять местами значения S[i] и S[j] т := (S[i] + S[j]) mod 256 К := С[т] выход Кокончательный
Таким образом, это создает поток K[0], K[1], ... , которые подвергаются операции XOR с открытым текстом для получения зашифрованного текста . Таким образом, ciphertext[ l ] = plaintext[ l ] ⊕ K[ l ] .
Несколько операционных систем включают arc4random
, API, происходящий из OpenBSD , предоставляющий доступ к генератору случайных чисел, изначально основанному на RC4. API не допускает заполнения, поскольку функция инициализирует себя с помощью /dev/random . Использование RC4 было постепенно прекращено в большинстве систем, реализующих этот API. Страницы руководства для нового arc4random включают бэкроним "A Replacement Call for Random" для ARC4 в качестве мнемоники, поскольку он предоставляет лучшие случайные данные, чем rand() . [15]
arc4random
был изменен для использования ChaCha20 . [16] [17] Реализации arc4random в FreeBSD , NetBSD [18] [19] также используют ChaCha20.Предлагаемые новые генераторы случайных чисел часто сравнивают с генератором случайных чисел RC4. [22] [23]
Несколько атак на RC4 способны отличить его вывод от случайной последовательности . [24]
Многие потоковые шифры основаны на регистрах сдвига с линейной обратной связью (LFSR), которые, хотя и эффективны в аппаратном обеспечении, менее эффективны в программном обеспечении. Конструкция RC4 избегает использования LFSR и идеальна для программной реализации, поскольку требует только манипуляций с байтами. Он использует 256 байт памяти для массива состояний, S[0] через S[255], k байт памяти для ключа, key[0] через key[k−1], и целочисленные переменные, i, j и K. Выполнение модульного сокращения некоторого значения по модулю 256 может быть выполнено с помощью побитового И с 255 (что эквивалентно взятию младшего байта рассматриваемого значения).
Эти тестовые векторы не являются официальными, но удобны для тех, кто тестирует собственную программу RC4. Ключи и открытый текст — ASCII , ключевой поток и шифротекст — в шестнадцатеричном формате .
Ключ | Ключевой поток | Открытый текст | Шифротекст |
---|---|---|---|
Ключ | EB9F7781B734CA72A719 … | Открытый текст | BBF316E8D940AF0AD3 |
Вики | 6044DB6D41B7 … | педиа | 1021BF0420 |
Секрет | 04D46B053CA87B59 … | Атака на рассвете | 45A01F645FC35B383552544B9BF5 |
В отличие от современных потоковых шифров (таких как те, что в eSTREAM ), RC4 не принимает отдельный одноразовый номер вместе с ключом. Это означает, что если один долгосрочный ключ должен использоваться для безопасного шифрования нескольких потоков, протокол должен указать, как объединить одноразовый номер и долгосрочный ключ, чтобы сгенерировать потоковый ключ для RC4. Одним из подходов к решению этой проблемы является генерация «свежего» ключа RC4 путем хэширования долгосрочного ключа с одноразовым номером . Однако многие приложения, использующие RC4, просто объединяют ключ и одноразовый номер; слабый график ключей RC4 затем приводит к атакам со связанными ключами , таким как атака Флюрера, Мантина и Шамира (которая известна тем, что нарушает стандарт WEP ). [25]
Поскольку RC4 является потоковым шифром , он более пластичен , чем обычные блочные шифры . Если не использовать его вместе с сильным кодом аутентификации сообщений (MAC), то шифрование уязвимо для атаки с переворачиванием битов . Шифр также уязвим для атаки потокового шифра, если он реализован неправильно. [26]
Однако следует отметить, что RC4, будучи потоковым шифром, в течение некоторого времени был единственным распространенным шифром, который был устойчив [27] к атаке BEAST 2011 года на TLS 1.0 . Атака использует известную слабость в способе использования режима цепочки шифров-блоков со всеми другими шифрами, поддерживаемыми TLS 1.0, которые все являются блочными шифрами.
В марте 2013 года появились новые сценарии атак, предложенные Исобе, Охигаши, Ватанабе и Мории [28] , а также Аль-Фарданом, Бернстайном, Патерсоном, Пёттерингом и Шульдтом, которые используют новые статистические смещения в таблице ключей RC4 [29] для восстановления открытого текста с большим количеством шифрований TLS. [30] [31]
Использование RC4 в TLS запрещено RFC 7465, опубликованным в феврале 2015 года.
В 1995 году Эндрю Рус экспериментально обнаружил, что первый байт потока ключей коррелирует с первыми тремя байтами ключа, а первые несколько байтов перестановки после KSA коррелируют с некоторой линейной комбинацией байтов ключа. [32] Эти смещения оставались необъясненными до 2007 года, когда Гаутам Пол, Сиддхешвар Рати и Субхамой Майтра [33] доказали корреляцию потока ключей и ключа, а в другой работе Гаутам Пол и Субхамой Майтра [34] доказали корреляции перестановки и ключа. Последняя работа также использовала корреляции перестановки и ключа для разработки первого алгоритма для полной реконструкции ключа из финальной перестановки после KSA, без каких-либо предположений о ключе или векторе инициализации . Этот алгоритм имеет постоянную вероятность успеха за время, которая является квадратным корнем из исчерпывающей сложности поиска ключа. Впоследствии было выполнено много других работ по реконструкции ключа из внутренних состояний RC4. [35] [36] [37] Субхамой Майтра и Гаутам Пол [38] также показали, что смещения типа Рооса сохраняются даже при рассмотрении вложенных индексов перестановки, таких как S[S[i]] или S[S[S[i]]] . Эти типы смещений используются в некоторых более поздних ключевых методах реконструкции для увеличения вероятности успеха.
Ключевой поток, генерируемый RC4, смещен в разной степени в сторону определенных последовательностей, что делает его уязвимым для различающих атак . Лучшая такая атака принадлежит Ицику Мантину и Ади Шамиру , которые показали, что второй выходной байт шифра смещен в сторону нуля с вероятностью 1/128 (вместо 1/256). Это связано с тем, что если третий байт исходного состояния равен нулю, а второй байт не равен 2, то второй выходной байт всегда равен нулю. Такое смещение можно обнаружить, наблюдая только 256 байтов. [24]
Соурадьюти Пол и Барт Пренел из COSIC показали, что первый и второй байты RC4 также были смещены. Количество требуемых образцов для обнаружения этого смещения составляет 2 25 байт. [39]
Скотт Флурер и Дэвид МакГрю также продемонстрировали атаки, которые отличали ключевой поток RC4 от случайного потока, учитывая гигабайт выходных данных. [40]
Полная характеристика одного шага RC4 PRGA была выполнена Риддхипратимом Басу, Ширшенду Гангули, Субхамоем Майтрой и Гаутамом Полом. [41] Рассмотрев все перестановки, они доказали, что распределение выходных данных не является равномерным при заданных i и j, и, как следствие, информация о j всегда просачивается в выходные данные.
В 2001 году Флурер, Мантин и Шамир сделали новое и удивительное открытие : среди всех возможных ключей RC4 статистика для первых нескольких байтов выходного потока ключей является строго неслучайной, что приводит к утечке информации о ключе. Если одноразовый код и долгосрочный ключ просто объединяются для генерации ключа RC4, этот долгосрочный ключ может быть обнаружен путем анализа большого количества сообщений, зашифрованных этим ключом. [42] Этот и связанные с ним эффекты затем использовались для взлома шифрования WEP («проводной эквивалент конфиденциальности»), используемого в беспроводных сетях 802.11 . Это вызвало борьбу за замену WEP на основе стандартов на рынке 802.11 и привело к усилиям IEEE 802.11i и WPA . [43]
Протоколы могут защищаться от этой атаки, отбрасывая начальную часть потока ключей. Такой модифицированный алгоритм традиционно называется "RC4-drop[ n ]", где n — это количество начальных байтов потока ключей, которые отбрасываются. Значение SCAN по умолчанию n = 768 байт, но консервативное значение будет n = 3072 байта. [44]
Атака Флюрера, Мантина и Шамира не применима к SSL на основе RC4, поскольку SSL генерирует ключи шифрования, используемые для RC4, путем хеширования, что означает, что разные сеансы SSL имеют несвязанные ключи. [45]
В 2005 году Андреас Кляйн представил анализ потокового шифра RC4, показав больше корреляций между потоком ключей RC4 и ключом. [46] Эрик Тьюс, Ральф-Филипп Вайнманн и Андрей Пычкин использовали этот анализ для создания aircrack-ptw, инструмента, который взламывает 104-битный RC4, используемый в 128-битном WEP, менее чем за минуту. [47] В то время как атака Флюрера, Мантина и Шамира использовала около 10 миллионов сообщений, aircrack-ptw может взломать 104-битные ключи за 40 000 кадров с вероятностью 50% или за 85 000 кадров с вероятностью 95%.
Комбинаторная проблема, связанная с числом входов и выходов шифра RC4, была впервые предложена Ициком Мантином и Ади Шамиром в 2001 году, согласно которой из 256 элементов в типичном состоянии RC4, если известны только x элементов ( x ≤ 256) (все остальные элементы можно считать пустыми), то максимальное число элементов, которые могут быть получены детерминированно, также равно x в следующих 256 раундах. Эта гипотеза была опровергнута в 2004 году формальным доказательством, данным Соурадьюти Полом и Бартом Пренелем . [48]
В 2013 году группа исследователей безопасности из Группы информационной безопасности в Royal Holloway, Лондонский университет, сообщила об атаке, которая может стать эффективной, используя всего 2 34 зашифрованных сообщения. [49] [50] [51] Хотя этот результат пока не является практической атакой для большинства целей, он достаточно близок к таковому, что это привело к предположению о том, что некоторые государственные криптологические агентства, возможно, уже имеют лучшие атаки, которые делают RC4 небезопасным. [6] Учитывая, что по состоянию на 2013 год [обновлять]большой объем трафика TLS использует RC4 для предотвращения атак на блочные шифры, которые используют цепочку блоков шифра , если эти гипотетические лучшие атаки существуют, то это сделало бы комбинацию TLS с RC4 небезопасной против таких злоумышленников в большом количестве практических сценариев. [6]
В марте 2015 года исследователь из Royal Holloway объявил об усовершенствовании своей атаки, предоставив атаку 2 26 против паролей, зашифрованных с помощью RC4, как это используется в TLS. [52]
На конференции Black Hat Asia 2015 Ицик Мантин представил еще одну атаку на SSL с использованием шифра RC4. [53] [54]
В 2015 году исследователи безопасности из KU Leuven представили новые атаки против RC4 как в TLS , так и в WPA-TKIP . [55] Названная атакой Numerous Occurrence MOnitoring & Recovery Exploit (NOMORE), это первая атака такого рода, которая была продемонстрирована на практике. Их атака против TLS может расшифровать защищенный HTTP cookie в течение 75 часов. Атака против WPA-TKIP может быть завершена в течение часа и позволяет злоумышленнику расшифровывать и внедрять произвольные пакеты.
Как упоминалось выше, самая важная слабость RC4 исходит из недостаточного расписания ключей; первые байты вывода раскрывают информацию о ключе. Это можно исправить, просто отбросив некоторую начальную часть выходного потока. [56] Это известно как RC4-drop N , где N обычно кратно 256, например, 768 или 1024.
Было предпринято несколько попыток усилить RC4, в частности Spritz, RC4A, VMPC и RC4 + .
Соурадьюти Пол и Барт Пренел предложили вариант RC4, который они назвали RC4A. [57]
RC4A использует два массива состояний S1 и S2 и два индекса j1 и j2 . Каждый раз, когда i увеличивается, генерируются два байта:
Итак, алгоритм такой:
Вся арифметика выполняется по модулю 256.я := 0j1 := 0j2 := 0при генерации выходных данных: я := я + 1 j1 := j1 + S1[i] поменять местами значения S1[i] и S1[j1] вывод S2[S1[i] + S1[j1]] j2 := j2 + S2[i] поменять местами значения S2[i] и S2[j2] вывод S1[S2[i] + S2[j2]] endwhile
Хотя алгоритм требует одинакового количества операций на выходной байт, он обеспечивает большую параллельность, чем RC4, что обеспечивает возможное улучшение скорости.
Хотя этот алгоритм и сильнее RC4, он также подвергся атаке, когда Александр Максимов [58] и команда из NEC [59] разработали способы отличить его вывод от действительно случайной последовательности.
Variably Modified Permutation Composition (VMPC) — еще один вариант RC4. [60] Он использует похожее расписание ключей, что и RC4, с j := S[(j + S[i] + key[i mod keylength]) mod 256], итерирующим 3 × 256 = 768 раз вместо 256, и с дополнительными 768 итерациями для включения начального вектора. Функция генерации выходных данных работает следующим образом:
Все арифметические действия выполняются по модулю 256.я := 0при генерации выходных данных: а := S[i] j := S[j + а] выход S[S[S[j] + 1]] Поменять местами S[i] и S[j] ( b := S[j]; S[i] := b; S[j] := a) ) я := я + 1окончательный
Это было атаковано в тех же работах, что и RC4A, и может быть различимо в пределах 2 38 выходных байтов. [61] [59]
RC4 + — это модифицированная версия RC4 с более сложным трехфазным графиком ключа (занимающим примерно в три раза больше времени, чем RC4, или столько же, сколько RC4-drop512), и более сложной функцией вывода, которая выполняет четыре дополнительных поиска в массиве S для каждого выходного байта, занимая примерно в 1,7 раза больше времени, чем базовый RC4. [62]
Все арифметические действия по модулю 256. << и >> — сдвиг влево и вправо, ⊕ — исключающее ИЛИ при GeneratingOutput: я := я + 1 а := S[i] j := j + а Поменять местами S[i] и S[j] ( b := S[j]; S[j] := S[i]; S[i] := b; ) с := S[i<<5 ⊕ j>>3] + S[j<<5 ⊕ i>>3] вывод (S[a+b] + S[c⊕0xAA]) ⊕ S[j+b] endwhile
Этот алгоритм не подвергался существенному анализу.
В 2014 году Рональд Ривест выступил с докладом и стал соавтором статьи [14] об обновленном редизайне под названием Spritz. Аппаратный ускоритель Spritz был опубликован в Secrypt, 2016 [63] и показывает, что из-за множественных вложенных вызовов, необходимых для создания выходных байтов, Spritz работает довольно медленно по сравнению с другими хеш-функциями, такими как SHA-3 и самая известная аппаратная реализация RC4.
Как и другие функции губки , Spritz можно использовать для построения криптографической хеш-функции, детерминированного генератора случайных битов ( DRBG ), алгоритма шифрования, который поддерживает аутентифицированное шифрование со связанными данными (AEAD) и т. д. [14]
В 2016 году Баник и Исобе предложили атаку, которая может отличить Spritz от случайного шума. [64] В 2017 году Баник, Исобе и Мори предложили простое исправление, которое удаляет отличительный признак в первых двух байтах ключевого потока, требуя только одного дополнительного доступа к памяти без существенного снижения производительности программного обеспечения. [65]
Если протокол помечен как «(опционально)», RC4 — это один из нескольких шифров, на использование которых может быть настроена система.
случайных чисел на основе ChaCha для OpenBSD.
API arc4random(3) из OpenBSD, переработанный с использованием ChaCha20 PRF, с состоянием для каждого потока.