DES, 3DES, RC4 și Blowfish explicate de la zero
Într-o propoziție: aceste patru cifruri au fost caii de povară ai anilor 1990 — DES și soluția lui de criptare triplă 3DES, cifrul de flux RC4 și Blowfish — iar astăzi toate sunt retrase sau depreciate, menținute în viață doar de fișiere vechi, hardware vechi și protocoale vechi care trebuie încă citite.
DES: standardul din 1977 care a deschis drumul
Ce este. Standardul de criptare a datelor (FIPS 46, 1977) este un cifru Feistel cu 16 runde, pe blocuri de 64 de biți, cu o cheie de 56 de biți (stocată în 8 octeți, deoarece un bit din fiecare octet este un bit de paritate). A fost proiectat de IBM cu contribuția NSA, a devenit standardul SUA timp de două decenii și a fost spart prin decizie politică în 1998, când mașina Deep Crack a EFF a găsit prin forță brută o cheie în 56 de ore, cu 250.000 de dolari în hardware. NIST l-a retras pentru criptare în 2005.
De ce bitul de paritate încurcă lungimile cheilor. Fiecare al 8-lea bit dintr-o cheie DES este calculat din ceilalți șapte, deci o cheie de 8 octeți conține doar 56 de biți independenți — de aceea apar atât „cheie de 64 de biți”, cât și „cheie de 56 de biți” pentru același cifru. 3DES moștenește aceasta: 24 de octeți brut = 168 de biți brut = 112 efectivi (atacul întâlnire la mijloc elimină restul).
Unde mai apare. Blocurile PIN bancare (ISO 9564), unele domenii Kerberos v4, arhive vechi de copii de siguranță și cardurile inteligente. Dacă un sistem cere DES astăzi, fie interoperează cu hardware din anii 1990, fie este pur și simplu nesigur.
3DES: criptare, decriptare, criptare
Trucul. Triple-DES rulează DES de trei ori pe fiecare bloc: EDE3 folosește trei chei diferite (C = Ek3(Dk2(Ek1(P)))); pasul de decriptare din mijloc există pentru ca o implementare 3DES să poată emula DES simplu, setând k1=k2. EDE2 folosește doar două chei (k1=k3), ceea ce dă 112 biți efectivi. Construcția a fost o soluție rapidă care a triplat securitatea unui cifru deja atacat, fără a inventa unul nou.
De ce a murit oricum. Două probleme: este lent (trei treceri complete DES pe bloc, cam 1/20 din viteza AES) și a păstrat blocul de 64 de biți. Cu 32 GiB de date sub o singură cheie (limita de aniversare de 232 blocuri), coliziunile de blocuri devin suficient de probabile încât să scurgă structura textului clar — atacul Sweet32 (2016) a demonstrat aceasta împotriva sesiunilor TLS 3DES. NIST a interzis criptarea 3DES după 2023 (SP 800-131A r2); PCI DSS impune retragerea acestuia în sistemele de plată.
RC4 / ARCFOUR: cifrul de flux al primului web
Cum funcționează. RC4 (Ron's Code 4, proiectat în 1987, scurs în 1994) este un cifru de flux: cheia programează o permutare de 256 de octeți (KSA), apoi permutarea emite un flux pseudoaleatoriu de octeți (PRGA), care se aplică prin XOR cu mesajul. Fără umplere, fără dimensiune de bloc, orice lungime a mesajului, extrem de rapid în software — motiv pentru care a dominat SSL/TLS și WEP în anii 1990. „ARCFOUR” este denumirea fără marcă înregistrată pe care o folosesc majoritatea proiectelor open-source.
Cum s-a spart. Fluhrer, Mantin și Shamir (2001) au arătat că primii octeți ai fluxului de chei sunt părtinitori — fatal în WEP, unde construcția cheii pe pachet le oferea atacatorilor. Atacurile ulterioare de părtinire (2013, AlFardan et al.) au recuperat texte clare din sesiuni TLS protejate cu RC4, având milioane de conexiuni. RFC 7465 (2015) interzice explicit RC4 în TLS.
Vectorul clasic. Cheia „Key” (3 octeți), mesajul „Plaintext” dau textul cifrat bbf316e8d940af0ad3 — se poate încerca exemplul RC4 și se compară. Autotestul acestei pagini verifică și fluxul de chei RFC 6229 pentru cheia de 40 de biți 01 02 03 04 05: b2396305f03dc027ccc3524a0a1118a8.
Blowfish: nespart, dar limitat de bloc
Ce este. Cifrul Feistel al lui Bruce Schneier din 1993: blocuri de 64 de biți, chei de la 32 la 448 de biți (4..56 de octeți), 16 runde și un program de chei celebru, care rulează chiar Blowfish de 521 de ori pentru a construi subcheile — ceea ce face inițializarea cheii lentă, dar și încercările de forță brută costisitoare. Nicio criptanaliză practică nu sparge Blowfish cu runde complete.
De ce se află pe această pagină. Problema este blocul de 64 de biți, nu algoritmul: peste ~32 GiB sub o singură cheie, coliziunile de tip aniversare scurg date (aceeași limită ca la 3DES, de tip Sweet32). Schneier însuși recomandă succesorul său Twofish (finalist AES) sau AES pentru orice lucru nou. Blowfish trăiește mai departe în bcrypt — programul de chei al hașului pentru parole este Blowfish — ceea ce este în regulă, deoarece hașurile folosesc intrări mici, nu volume de ordinul gigaoctetelor.
Vectorii clasici. Cheia și textul clar formate doar din zerouri se cifrează în 4ef997456198dd78 (primul bloc al ieșirii din exemplu); cheia "abcdefghijklmnopqrstuvwxyz" pentru "BLOWFISH" dă 324ed0fef413a203. Ambii provin din fișierul publicat de vectori al lui Schneier și sunt verificate de autotest.
Greșeli frecvente
- Utilizarea lor pentru date noi. Fiecare cifru de pe această pagină este depreciat, cu excepția Blowfish (care este limitat de dimensiunea blocului). Alegerea modernă corectă este AES-GCM — vezi Criptare / decriptare AES.
- Cheie DES dintr-o parolă. O parolă de 8 caractere nu înseamnă 56 de biți aleatori; înseamnă câțiva biți de entropie pe caracter. Sistemele vechi făceau exact aceasta, iar aceasta este cea mai frecventă cauză pentru care arhivele „criptate DES” cad în minute în atacuri de dicționar.
- Refolosirea unui IV în CBC. Primul bloc scurge atunci egalitatea textului clar între mesaje sub aceeași cheie. Butonul IV aleatoriu există dintr-un motiv.
- Refolosirea unui flux de chei RC4. RC4 aplică XOR cu același flux de chei pentru aceeași cheie: criptarea a două mesaje cu o cheie este un bloc de unică folosință folosit de două ori — prin XOR-ul textelor cifrate ies la iveală ambele texte clare. Defectul fatal al WEP a fost exact o construcție cu refolosirea fluxului de chei.
- Presupunerea că „se decriptează, deci e corect”. ECB/CBC validează aici doar umplerea la decriptare — o cheie greșită produce de obicei un text fără sens, care poate trece totuși de verificarea umplerii. Niciun mod vechi nu are verificare de integritate; dacă este nevoie de una, se folosește AES-GCM, nu aceste moduri.
- Numărarea 3DES ca „168 de biți”. Cheia brută are 168 de biți, dar puterea efectivă este de 112 — atacul întâlnire la mijloc reduce criptarea triplă la una dublă plus ceva, exact ca la construcțiile strămoșești ale 3DES.
Întrebări frecvente
De ce să mai existe un instrument cu cifruri sparte? Compatibilitatea. Copiile de siguranță criptate, fișierele exportate în format vechi, urmele de protocol capturate, provocările CTF și hardware-ul care nu poate fi actualizat mai vorbesc încă aceste cifruri. Citirea datelor vechi este legitimă; scrierea de date noi cu ele nu este.
Cheia DES are paritate impară / octeți non-ASCII. DES ignoră bitul de paritate din fiecare octet al cheii, deci cheia efectivă este oricum celelalte 56 de biți. Această pagină acceptă orice 8 octeți și nu impune paritate pară.
De ce arată uneori textul decriptat ca un șir de caractere fără sens? Cheie greșită, mod greșit, IV greșit sau datele nu au fost criptate în felul presupus. Fără etichetă de autentificare nu există o eroare curată de „cheie greșită” — verificarea umplerii este singurul indiciu, iar aceasta poate trece din noroc (în 1/256 din cazuri).
Este Blowfish sigur pentru fișiere? Pentru fișiere mici, din punct de vedere criptografic, da (fără spargere practică). Pentru orice volum de ordinul gigaoctetelor sub o singură cheie, nu — limita de aniversare pentru blocul de 64 de biți ține de volumul datelor, nu de puterea cheii. Twofish sau AES evită problema.
Ce este cu cheile Blowfish de 72 de octeți pe care le-am văzut undeva? Unele implementări acceptă până la 72 de octeți, dar referința lui Schneier folosește 56, iar octeții de peste această limită nu aduc difuzie suplimentară în programul standard de chei. Această pagină urmează referința: 4..56 de octeți.