A DES, 3DES, RC4 és Blowfish nulláról, magyarázattal
Egy mondatban: ez a négy titkosító volt az 1990-es évek munkalovai — a DES és a hármas titkosítású kiegészítése, a 3DES, az RC4 folyamtitkosító és a Blowfish — és mindegyik ma már nyugdíjas vagy elavult, csak régi fájlok, régi hardver és olyan régi protokollok tartják életben, amelyeket még olvasni kell.
DES: az 1977-es szabvány, amely mindent elindított
Mi ez. A Data Encryption Standard (FIPS 46, 1977) 16 köres Feistel-titkosító 64 bites blokkokon, 56 bites kulccsal (8 bájtban tárolva, mert minden bájt egyik bitje paritásellenőrzés). Az IBM tervezte az NSA bevonásával, két évtizedig az USA szabványa volt, és 1998-ban a szakpolitika törte meg, amikor az EFF Deep Crack gépe 56 óra alatt, 250 000 dollárnyi hardverrel kényszerített ki egy kulcsot. A NIST 2005-ben visszavonta a titkosításra való használatát.
Miért zavarja össze a paritásbit a kulcshosszakat. Minden 8. bitje egy DES-kulcsnak a másik hétből számítódik, ezért egy 8 bájtos kulcs csak 56 független bitet hordoz — ezért látni „64 bites kulcs” és „56 bites kulcs” megnevezést is ugyanarra a titkosítóra. A 3DES ezt örökli: 24 nyers bájt = 168 nyers bit = 112 hatékony (a találkozz-a-közepen támadás a többit eltünteti).
Hol találkozhat vele még. Banki PIN-blokkoknál (ISO 9564), néhány Kerberos v4 tartományban, régi biztonsági mentési archívumokban és chipkártyákon. Ha egy rendszer ma DES-t követel meg, vagy 1990-es évek hardverével működik együtt, vagy egyszerűen nem biztonságos.
3DES: titkosítás, visszafejtés, titkosítás
A trükk. A hármas DES minden blokkon háromszor futtatja a DES-t: az EDE3 három különböző kulccsal dolgozik (C = Ek3(Dk2(Ek1(P)))); a középső visszafejtő lépés azért van, hogy a 3DES-implementáció a k1=k2 beállítással az egyszeres DES-t is utánozhassa. Az EDE2 csak két kulcsot használ (k1=k3), ami 112 hatékony bitet ad. A konstrukció gyors javítás volt, amely megháromszorozta egy már támadott titkosító biztonságát, anélkül hogy újat tervezett volna.
Miért halt meg mégis. Két probléma: lassú (blokkonként három teljes DES-menet, kb. 1/20-a az AES sebességének), és megtartotta a 64 bites blokkot. Egy kulcs alatt 32 GiB adattal (a 232 blokk születésnapi határa) a blokkütközések elég valószínűvé válnak ahhoz, hogy szivárogtassák a nyílt szöveg szerkezetét — a Sweet32-támadás (2016) ezt 3DES-es TLS-munkamenetekkel mutatta be. A NIST 2023 után tiltotta a 3DES titkosítását (SP 800-131A r2); a PCI DSS a fizetési rendszerekben a kivonását írja elő.
RC4 / ARCFOUR: a korai web folyamtitkosítója
Hogyan működik. Az RC4 (Ron's Code 4, 1987-ben tervezték, 1994-ben szivárgott ki) folyamtitkosító: a kulcs egy 256 bájtos permutációt állít elő (KSA), majd a permutáció pszeudovéletlen bájtfolyamot ad (PRGA), amelyet XOR-ral kapcsolnak az üzenethez. Nincs kitöltés, nincs blokkméret, bármilyen üzenethossz, szoftverben triviálisan gyors — ezért uralta az SSL/TLS-t és a WEP-et az 1990-es években. Az „ARCFOUR” a védjegymentes név, amelyet a legtöbb nyílt forráskódú projekt használ.
Hogyan tört meg. Fluhrer, Mantin és Shamir (2001) megmutatta, hogy a kulcsfolyam első bájtjai torzítottak — végzetes a WEP-ben, ahol a csomagonkénti kulcskonstrukció ezeket a bájtokat a támadóknak adta. A későbbi torzítási támadások (2013, AlFardan és társai) millió kapcsolatból álló RC4-védett TLS-munkamenetekből nyertek vissza nyílt szöveget. Az RFC 7465 (2015) teljes egészében tiltja az RC4-et a TLS-ben.
A klasszikus vektor. A „Key” kulcs (3 bájt), a „Plaintext” üzenet a bbf316e8d940af0ad3 titkos szöveget adja — az RC4 mintával érdemes kipróbálni és összevetni. Az oldal önellenőrzése az RFC 6229 kulcsfolyamát is ellenőrzi a 40 bites 01 02 03 04 05 kulcsra: b2396305f03dc027ccc3524a0a1118a8.
Blowfish: nem törték meg, de blokkmérettel korlátozott
Mi ez. Bruce Schneier 1993-as Feistel-titkosítója: 64 bites blokkok, 32–448 bites (4–56 bájtos) kulcsok, 16 kör, és egy híres kulcsütemezés, amely a Blowfish 521-szer fut le az alkulcsok felépítéséhez — ez lassúvá teszi a kulcsbeállítást, de a brute-force próbálkozásokat is drágává. Gyakorlati kriptoanalízis a teljes körös Blowfish-t nem töri meg.
Miért van mégis az oldalon. A 64 bites blokk a probléma, nem az algoritmus: egy kulcs alatt kb. 32 GiB fölött születésnapi ütközések szivárogtatják az adatot (ugyanaz a határ, mint a 3DES-nél, Sweet32-jellegű). Schneier az utódját, a Twofish-t (AES-döntős) vagy az AES-t ajánlja minden újhoz. A Blowfish a bcrypt-ben tovább él — a jelszóhash kulcsütemezése Blowfish —, ami rendben van, mert a hashelés apró bemeneteket használ, nem gigabájtokat.
A klasszikus vektorok. A csupa nulla kulcs és a csupa nulla nyílt szöveg a 4ef997456198dd78-at adja titkosításkor (a Minta kimenetének első blokkja); a „abcdefghijklmnopqrstuvwxyz” kulcs a „BLOWFISH” szövegen 324ed0fef413a203-at ad. Mindkettő Schneier közzétett vektorfájljából származik, és az önellenőrzés ellenőrzi őket.
Gyakori hibák
- Ezek használata új adatokhoz. Az oldal minden titkosítója elavult, kivéve a Blowfish-t (amely blokkméretben korlátozott). A megfelelő modern választás az AES-GCM — részletek: az AES titkosítás / visszafejtés oldalt.
- DES-kulcs jelszóból. Egy 8 karakteres jelszó nem 56 véletlen bit; karakterenként néhány bit entrópia. A régi rendszerek pontosan ezt tették, és ez a leggyakoribb oka annak, hogy a „DES-szel titkosított” archívumok percek alatt szótártámadás áldozatai lesznek.
- IV újrafelhasználása CBC-ben. Ekkor az első blokk megmutatja, hogy az üzenetek azonos nyílt szövegűek-e ugyanazon kulccsal. A Véletlen IV gomb erre létezik.
- RC4 kulcsfolyam újrafelhasználása. Az RC4 ugyanazt a kulcsfolyamot XOR-olja ugyanarra a kulcsra: két üzenet titkosítása egy kulccsal két-idős pad — a titkos szövegek XOR-olásából mindkét nyílt szöveg kiesik. A WEP végzetes hibája pontosan egy kulcsfolyam-újrafelhasználó konstrukció volt.
- Azt feltételezni, hogy „visszafejtődik, tehát helyes”. Az ECB/CBC itt visszafejtéskor csak a kitöltést ellenőrzi — egy rossz kulcs általában olyan szemetet ad, amely még lehet, hogy kitöltés-ellenőrzésen is átmegy. Egyik örökölt módban sincs integritásellenőrzés; ha kell, AES-GCM szükséges, nem ezek.
- A 3DES „168 bitesnek” számítása. A nyers kulcs 168 bites, de a hatékony erő 112 — a találkozz-a-közepen támadás a hármas titkosítást gyakorlatilag kettősre és egy kicsit többre csökkenti, pontosan úgy, ahogy a 3DES elődkonstrukcióinál is.
GYIK
Miért kell egyáltalán egy törött titkosító-eszköz. Kompatibilitás. A titkosított mentések, az exportált régi formátumú fájlok, a rögzített protokollnyomok, a CTF-feladatok és a nem frissíthető hardverek mind ezeket a titkosítókat beszélik. A régi adatok olvasása jogos; új adatok írása ezekkel nem az.
A DES-kulcsom páratlan paritású / nem ASCII bájtokat tartalmaz. A DES figyelmen kívül hagyja minden kulcsbájt paritásbitjét, ezért a hatékony kulcs mindenképp a másik 56 bit. Ez az oldal bármely 8 bájtot elfogad, és nem kényszeríti ki a páros paritást.
Miért néz ki néha szemétnek a visszafejtett szöveg. Rossz kulcs, rossz mód, rossz IV, vagy az adat nem úgy lett titkosítva, ahogy feltételezi. Hitelesítési címke nélkül nincs tiszta „rossz kulcs” hibaüzenet — csak a kitöltés-ellenőrzés nyújt támpontot, amely szerencsével is átmehet (az esetek 1/256-ában).
A Blowfish biztonságos a fájljaimhoz? Kis fájloknál kriptográfiai értelemben igen (nincs gyakorlati törés). Gigabájtos nagyságrendnél egyetlen kulcs alatt nem — a 64 bites blokk születésnapi határa az adatmennyiségtől függ, nem a kulcs erejétől. A Twofish vagy az AES elkerüli a problémát.
Mi a helyzet a 72 bájtos Blowfish-kulcsokkal, amelyeket láttam valahol? Egyes megvalósítások 72 bájtig fogadnak el, de Schneier referencia-implementációja 56-ot használ, és a 56 bájton túli bájtok a szabványos ütemezésben nem adnak további diffúziót. Az oldal a referenciát követi: 4–56 bájt.