DES, 3DES, RC4 i Blowfish wyjaśnione od podstaw
W jednym zdaniu: te cztery szyfry były końmi roboczymi lat 90. — DES i jego obejście potrójnym szyfrowaniem 3DES, szyfr strumieniowy RC4 oraz Blowfish — i każdy z nich jest dziś wycofany lub przestarzały, utrzymywany przy życiu tylko przez stare pliki, stary sprzęt i stare protokoły, które wciąż trzeba odczytać.
DES: standard z 1977 roku, od którego wszystko się zaczęło
Czym jest. Data Encryption Standard (FIPS 46, 1977) to szyfr Feistela z 16 rundami na blokach 64-bitowych z kluczem 56-bitowym (przechowywanym w 8 bajtach, bo jeden bit każdego bajtu to bit parzystości). Zaprojektowany przez IBM z udziałem NSA, przez dwie dekady był standardem USA, a w 1998 roku został złamany w praktyce, gdy maszyna Deep Crack EFF odgadła klucz w 56 godzin za 250 000 dolarów sprzętu. NIST wycofał go do szyfrowania w 2005 roku.
Dlaczego bit parzystości myli długości kluczy. Co ósmy bit klucza DES jest wyliczany z pozostałych siedmiu, więc 8-bajtowy klucz niesie tylko 56 niezależnych bitów — dlatego widać zarówno „klucz 64-bitowy”, jak i „klucz 56-bitowy” dla tego samego szyfru. 3DES dziedziczy to: 24 surowe bajty = 168 bitów surowych = 112 efektywnych (atak meet-in-the-middle usuwa resztę).
Gdzie wciąż występuje. Bloki PIN w bankowości (ISO 9564), niektóre domeny Kerberos v4, stare archiwa kopii zapasowych i karty chipowe. Jeśli system wymaga dziś DES, to albo współpracuje ze sprzętem z lat 90., albo jest po prostu niebezpieczny.
3DES: szyfruj, odszyfruj, szyfruj
Sztuczka. Triple-DES uruchamia DES trzy razy na każdym bloku: EDE3 używa trzech różnych kluczy (C = Ek3(Dk2(Ek1(P)))); krok odszyfrowania w środku istnieje po to, by implementacja 3DES mogła naśladować pojedynczy DES, ustawiając k1=k2. EDE2 używa tylko dwóch kluczy (k1=k3), dając 112 efektywnych bitów. Konstrukcja była szybką poprawką, która potroiła bezpieczeństwo już atakowanego szyfru, nie wymyślając nowego.
Dlaczego i tak upadł. Dwa problemy: jest wolny (trzy pełne przebiegi DES na blok, ~1/20 szybkości AES) i zachował blok 64-bitowy. Przy 32 GiB danych pod jednym kluczem (granica urodzinowa 232 bloków) kolizje bloków stają się na tyle prawdopodobne, że ujawniają strukturę tekstu jawnego — atak Sweet32 (2016) pokazał to na sesjach TLS 3DES. NIST zakazał szyfrowania 3DES po 2023 roku (SP 800-131A r2); PCI DSS wymaga jego wycofania w systemach płatniczych.
RC4 / ARCFOUR: szyfr strumieniowy wczesnego internetu
Jak działa. RC4 (Ron's Code 4, zaprojektowany w 1987, wyciekł w 1994) to szyfr strumieniowy: klucz steruje 256-bajtową permutacją (KSA), a potem permutacja wypuszcza pseudolosowy strumień bajtów (PRGA), który jest XORowany z wiadomością. Bez dopełnienia, bez rozmiaru bloku, dowolna długość wiadomości, błyskawiczny w oprogramowaniu — dlatego dominował w SSL/TLS i WEP w latach 90. „ARCFOUR” to nazwa wolna od znaków towarowych, której używa większość projektów open source.
Jak został złamany. Fluhrer-Mantin-Shamir (2001) pokazali, że pierwsze bajty strumienia klucza są obciążone — to fatalne w WEP, gdzie konstrukcja klucza dla każdego pakietu przekazywała te bajty atakującym. Późniejsze ataki na obciążenia (2013, AlFardan i in.) odzyskały tekst jawny z sesji TLS chronionych RC4 po milionach połączeń. RFC 7465 (2015) zakazuje RC4 w TLS w całości.
Klasyczny wektor. Klucz "Key" (3 bajty), wiadomość "Plaintext" daje szyfrogram bbf316e8d940af0ad3 — wypróbuj Próbkę RC4 i porównaj. Autotest tej strony sprawdza też strumień klucza z RFC 6229 dla 40-bitowego klucza 01 02 03 04 05: b2396305f03dc027ccc3524a0a1118a8.
Blowfish: niezłamany, ale ograniczony rozmiarem bloku
Czym jest. Szyfr Feistela Bruce'a Schneiera z 1993 roku: bloki 64-bitowe, klucze od 32 do 448 bitów (4..56 bajtów), 16 rund i słynny harmonogram kluczy, który uruchamia sam Blowfish 521 razy, by zbudować podklucze — co czyni przygotowanie klucza wolnym, ale próby brute-force także kosztownymi. Żadna praktyczna kryptoanaliza nie łamie Blowfisha z pełną liczbą rund.
Dlaczego i tak jest na tej stronie. Problemem jest blok 64-bitowy, nie algorytm: powyżej ~32 GiB pod jednym kluczem kolizje urodzinowe ujawniają dane (ta sama granica co dla 3DES, styl Sweet32). Sam Schneier zaleca do nowych zastosowań swojego następcę Twofish (finalista AES) albo AES. Blowfish żyje dalej w bcrypt — harmonogram kluczy skrótu hasła jest Blowfishem — co jest w porządku, bo haszowanie działa na małych wejściach, nie na gigabajtach.
Klasyczne wektory. Klucz złożony z samych zer i tekst jawny z samych zer szyfrują się do 4ef997456198dd78 (pierwszy blok wyniku Próbki); klucz "abcdefghijklmnopqrstuvwxyz" dla "BLOWFISH" daje 324ed0fef413a203. Oba pochodzą z opublikowanego pliku wektorów Schneiera i są sprawdzane przez autotest.
Typowe błędy
- Użycie ich do nowych danych. Każdy szyfr na tej stronie jest przestarzały poza Blowfishem (ograniczonym rozmiarem bloku). Prawidłowym nowoczesnym wyborem jest AES-GCM — zobacz Szyfrowanie / deszyfrowanie AES.
- Klucz DES z hasła. 8-znakowe hasło to nie 56 losowych bitów; to kilka bitów entropii na znak. Stare systemy robiły dokładnie to i to najczęstszy powód, dla którego archiwa „szyfrowane DES” padają w ciągu minut przed atakiem słownikowym.
- Ponowne użycie IV w CBC. Pierwszy blok ujawnia wtedy równość tekstu jawnego między wiadomościami pod tym samym kluczem. Przycisk Losowy IV istnieje z tego powodu.
- Ponowne użycie strumienia klucza RC4. RC4 XORuje ten sam strumień klucza dla tego samego klucza: szyfrowanie dwóch wiadomości jednym kluczem to dwukrotnie użyty jednorazowy klucz — XOR szyfrogramów ujawnia oba teksty jawne. Śmiertelną wadą WEP było dokładnie takie ponowne użycie strumienia.
- Zakładanie, że „odszyfrowuje się, więc jest dobrze”. ECB/CBC tutaj sprawdzają przy odszyfrowaniu tylko dopełnienie — zły klucz zwykle daje śmieci, które mogą mimo to przejść usuwanie dopełnienia. Żaden tryb legacy nie ma kontroli integralności; jeśli jest potrzebna, potrzebny jest AES-GCM, a nie tych.
- Liczenie 3DES jako „168-bitowego”. Surowy klucz ma 168 bitów, ale efektywna siła to 112 — meet-in-the-middle redukuje potrójne szyfrowanie do podwójnego plus nieco, dokładnie tak jak w przodkach konstrukcji 3DES.
FAQ
Po co trzymać narzędzie do złamanych szyfrów? Ze względu na zgodność. Zaszyfrowane kopie zapasowe, wyeksportowane pliki w starym formacie, przechwycone ślady protokołów, wyzwania CTF i sprzęt, którego nie da się zaktualizować, wciąż mówią tymi szyframi. Odczytywanie starych danych jest uprawnione; zapisywanie nowych nimi — nie.
Mój klucz DES ma nieparzysty bit parzystości / bajty spoza ASCII. DES ignoruje bit parzystości każdego bajtu klucza, więc efektywnym kluczem są zawsze pozostałe 56 bitów. Ta strona przyjmuje dowolne 8 bajtów i nie wymusza parzystości.
Dlaczego odszyfrowany tekst czasem wygląda jak śmieci? Zły klucz, zły tryb, zły IV albo dane nie zostały zaszyfrowane tak, jak zakłada się. Bez znacznika uwierzytelnienia nie ma czystego błędu „złego klucza” — jedyną wskazówką jest sprawdzenie dopełnienia, które może przejść przypadkiem (1/256 przypadków).
Czy Blowfish jest bezpieczny dla moich plików? Dla małych plików kryptograficznie tak (brak praktycznego złamania). Dla czegokolwiek w skali gigabajtów pod jednym kluczem nie — granica urodzinowa bloku 64-bitowego dotyczy ilości danych, a nie siły klucza. Twofish lub AES unikają problemu.
A 72-bajtowe klucze Blowfisha, które gdzieś widziałem? Niektóre implementacje przyjmują do 72 bajtów, ale referencyjna implementacja Schneiera używa 56, a bajty ponad to nie dają dodatkowej dyfuzji w standardowym harmonogramie. Ta strona podąża za referencją: 4..56 bajtów.