DES, 3DES, RC4 и Blowfish с нуля
Одним предложением: эти четыре шифра были рабочими лошадками 1990-х: DES и его обход тройным шифрованием 3DES, поточный шифр RC4 и Blowfish. Каждый из них теперь выведен из употребления или признан устаревшим и сохраняется только благодаря старым файлам, старому оборудованию и старым протоколам, которые всё ещё нужно читать.
DES: стандарт 1977 года, с которого всё началось
Что это. Data Encryption Standard (FIPS 46, 1977) — шифр Фейстеля с 16 раундами на блоках по 64 бита и ключом 56 бит (хранится в 8 байтах, потому что один бит каждого байта — бит контроля чётности). Его разработала IBM при участии NSA; два десятилетия он был стандартом США, а в 1998 году был взломан практически: машина EFF Deep Crack перебрала ключ за 56 часов, потратив около 250 000 долларов на оборудование. NIST вывел его из употребления для шифрования в 2005 году.
Почему бит чётности путает длины ключей. Каждый восьмой бит ключа DES вычисляется из остальных семи, поэтому 8-байтовый ключ содержит только 56 независимых бит — отсюда и «64-битный ключ», и «56-битный ключ» для одного и того же шифра. 3DES наследует это: 24 байта сырого ключа = 168 сырых бит = 112 эффективных (атака «встреча посередине» отнимает остальное).
Где его ещё встречают. PIN-блоки в банках (ISO 9564), некоторые области Kerberos v4, старые архивы резервных копий и смарт-карты. Если сегодня система требует DES, она либо взаимодействует с оборудованием 1990-х, либо попросту небезопасна.
3DES: зашифровать, расшифровать, зашифровать
Трюк. Triple-DES выполняет DES трижды над каждым блоком: EDE3 использует три разных ключа (C = Ek3(Dk2(Ek1(P)))); шаг расшифровки посередине нужен, чтобы реализация 3DES могла эмулировать одиночный DES при k1=k2. EDE2 использует только два ключа (k1=k3), давая 112 эффективных бит. Конструкция была быстрым исправлением, которое утроило стойкость уже атакованного шифра, не изобретая нового.
Почему он всё равно умер. Две проблемы: он медленный (три полных прохода DES на блок, примерно 1/20 скорости AES) и сохранил 64-битный блок. При 32 ГиБ данных под одним ключом (граница дня рождения 232 блоков) коллизии блоков становятся достаточно вероятными, чтобы раскрыть структуру открытого текста: атака Sweet32 (2016) показала это на сессиях TLS с 3DES. NIST запретил шифрование 3DES после 2023 года (SP 800-131A r2); PCI DSS требует вывода его из употребления в платёжных системах.
RC4 / ARCFOUR: поточный шифр раннего веба
Как работает. RC4 (Ron's Code 4, разработан в 1987, утёк в 1994) — поточный шифр: ключ задаёт перестановку из 256 байт (KSA), затем перестановка выдаёт псевдослучайный поток байтов (PRGA), который складывается по XOR с сообщением. Без дополнения, без размера блока, любая длина сообщения, очень быстрый в программах — поэтому он доминировал в SSL/TLS и WEP в 1990-х. «ARCFOUR» — безымянное название, которое используют большинство проектов с открытым кодом.
Как его взломали. Fluhrer, Mantin и Shamir (2001) показали, что первые байты поточного ключа смещены, — фатально для WEP, где построение ключа на каждый пакет передавало эти байты атакующим. Позднейшие атаки на смещение (2013, AlFardan и др.) восстанавливали открытый текст из сессий TLS с RC4 по миллионам соединений. RFC 7465 (2015) полностью запрещает RC4 в TLS.
Классический вектор. Ключ «Key» (3 байта), сообщение «Plaintext» даёт шифротекст bbf316e8d940af0ad3: попробуйте пример RC4 и сравните. Самопроверка этой страницы также проверяет поток ключа RFC 6229 для 40-битного ключа 01 02 03 04 05: b2396305f03dc027ccc3524a0a1118a8.
Blowfish: не взломан, но ограничен блоком
Что это. Шифр Фейстеля Брюса Шнайера 1993 года: блоки по 64 бита, ключи от 32 до 448 бит (4..56 байт), 16 раундов и знаменитое расписание ключей, которое запускает сам Blowfish 521 раз для построения подключей. Поэтому настройка ключа медленная, но попытки перебора тоже дорогие. Ни один практический криптоанализ не ломает Blowfish с полным числом раундов.
Почему он всё же здесь. Проблема в 64-битном блоке, а не в алгоритме: после примерно 32 ГиБ данных под одним ключом коллизии дня рождения раскрывают данные (та же граница, что у 3DES, в духе Sweet32). Сам Шнайер рекомендует для всего нового его преемника Twofish (финалиста AES) или AES. Blowfish живёт внутри bcrypt: расписание ключей хеша паролей и есть Blowfish. Это нормально, потому что хеширование работает с крошечными входами, а не с гигабайтами.
Классические векторы. Нулевой ключ и нулевой открытый текст шифруются в 4ef997456198dd78 (первый блок выхода примера); ключ «abcdefghijklmnopqrstuvwxyz» на «BLOWFISH» даёт 324ed0fef413a203. Оба взяты из опубликованного файла векторов Шнайера и проверяются самопроверкой.
Распространённые ошибки
- Использование этих шифров для новых данных. Каждый шифр на этой странице устарел, кроме Blowfish (который ограничен размером блока). Правильный современный выбор — AES-GCM: см. Шифрование и расшифровка AES.
- Ключ DES из пароля. Пароль из 8 символов — это не 56 случайных бит; это несколько бит энтропии на символ. Старые системы делали именно так, и это самая частая причина, по которой архивы, зашифрованные DES, сдаются атаке по словарю за минуты.
- Повторное использование IV в CBC. Тогда первый блок раскрывает совпадение открытых текстов разных сообщений под одним ключом. Кнопка «Случайный IV» существует не просто так.
- Повторное использование поточного ключа RC4. RC4 складывает по XOR один и тот же поток для одного ключа: шифрование двух сообщений одним ключом — это одноразовый блокнот, использованный дважды; XOR шифротекстов выдаёт оба открытых текста. Фатальный изъян WEP был ровно такой конструкцией с повторным поточным ключом.
- Предположение «расшифровалось — значит, правильно». ECB и CBC здесь проверяют при расшифровке только дополнение: неверный ключ обычно даёт мусор, который всё же может сняться с дополнения. В устаревших режимах нет проверки целостности; если она нужна, нужен AES-GCM, а не эти шифры.
- Считать 3DES «168-битным». Сырой ключ — 168 бит, но эффективная стойкость — 112: атака «встреча посередине» сводит тройное шифрование к двойному с небольшой добавкой, как и для предков 3DES.
Вопросы и ответы
Зачем вообще хранить инструмент для взломанного шифра? Совместимость. Зашифрованные резервные копии, экспортированные файлы старых форматов, перехваченные трассы протоколов, задачи CTF и оборудование, которое нельзя обновить, — всё это по-прежнему говорит на этих шифрах. Читать старые данные законно; писать новые данные с их помощью — нет.
У моего ключа DES нечётная чётность или байты вне ASCII. DES игнорирует бит чётности каждого байта ключа, поэтому эффективный ключ в любом случае — остальные 56 бит. Эта страница принимает любые 8 байт и не требует чётной чётности.
Почему расшифрованный текст иногда выглядит как мусор? Неверный ключ, неверный режим, неверный IV или данные были зашифрованы не так, как вы думаете. Без тега аутентификации нет чистой ошибки «неверный ключ»: единственная подсказка — проверка дополнения, и она может пройти случайно (в 1 из 256 случаев).
Безопасен ли Blowfish для моих файлов? Для небольших файлов — криптографически да (практического взлома нет). Для всего объёмом в гигабайты под одним ключом — нет: граница дня рождения для 64-битного блока связана с объёмом данных, а не со стойкостью ключа. Twofish или AES обходят эту проблему.
А 72-байтные ключи Blowfish, которые я где-то видел? Некоторые реализации принимают до 72 байт, но эталон Шнайера использует 56, а байты сверх этого в стандартном расписании не дают дополнительной диффузии. Эта страница следует эталону: 4..56 байт.