DES, 3DES, RC4 і Blowfish пояснено з нуля
Коротко: ці чотири шифри були робочими конями 1990-х — DES і його потрійне обхідне рішення 3DES, потоковий шифр RC4 і Blowfish; кожен із них зараз виведений з ужитку або визнаний застарілим, і лишається живим лише завдяки старим файлам, старому обладнанню та старим протоколам, які ще мусять читатися.
DES: стандарт 1977 року, з якого все почалося
Що це. Стандарт шифрування даних (DES, FIPS 46, 1977) — 16-раундовий шифр Фейстеля на блоках по 64 біти з 56-бітним ключем (зберігається у 8 байтах, бо один біт кожного байта є бітом парності). Його розробила IBM за участі NSA, він був стандартом США два десятиліття, а в 1998 році його «зламала» політика: машина Deep Crack від EFF перебрала ключ за 56 годин за $250 000 апаратного забезпечення. NIST відкликав його для шифрування у 2005 році.
Чому біт парності плутає довжини ключів. Кожен восьмий біт ключа DES обчислюється з решти семи, тож 8-байтовий ключ містить лише 56 незалежних біт — тому для одного шифру ви побачите і "64-бітний ключ", і "56-бітний ключ". 3DES успадковує це: 24 байти = 168 біт сирих = 112 ефективних (атака «зустріч посередині» прибирає решту).
Де його досі зустрічають. Блоки PIN-кодів банків (ISO 9564), деякі домени Kerberos v4, старі резервні архіви та смарт-картки. Якщо система вимагає DES сьогодні, вона або взаємодіє з обладнанням 1990-х, або просто небезпечна.
3DES: шифрувати, розшифрувати, шифрувати
Трюк. Потрійний 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» — це назва без торгових марок, яку використовує більшість проєктів з відкритим кодом.
Як він зламався. Флюрер, Мантін і Шамір (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.
Часті запитання (FAQ)
Навіщо тримати інструмент для зламаних шифрів? Сумісність. Зашифровані резервні копії, експортовані файли старих форматів, перехоплені сліди протоколів, завдання CTF і обладнання, яке не можна оновити, досі розуміють ці шифри. Читати старі дані законно; записувати нові даними цими шифрами — ні.
Мій ключ DES має непарний біт парності / байти поза ASCII. DES ігнорує біт парності кожного байта ключа, тож ефективний ключ — це інші 56 біт незалежно від цього. Ця сторінка приймає будь-які 8 байтів і не вимагає парної парності.
Чому розшифрований текст іноді схожий на сміття? Неправильний ключ, неправильний режим, неправильний IV або дані зашифровані не так, як ви припускаєте. Без тега автентифікації немає чіткої помилки «неправильний ключ» — перевірка доповнення є єдиною підказкою, і вона може пройти випадково (в 1 із 256 випадків).
Чи безпечний Blowfish для моїх файлів? Для малих файлів криптографічно так (практичного зламу немає). Для гігабайтних обсягів під одним ключем — ні: межа днів народження 64-бітного блоку стосується обсягу даних, а не сили ключа. Twofish або AES уникають цієї проблеми.
Що з 72-байтовими ключами Blowfish, які я десь бачив? Деякі реалізації приймають до 72 байтів, але еталонна реалізація Шнаєра використовує 56, і байти понад це не додають дифузії в стандартній схемі ключів. Ця сторінка слідує еталону: 4..56 байтів.