Zmiana algorytmu szyfrowania przekaźników (relay encryption) z wysłużonego "tor1" na Counter Galois Onion (CGO) to kawał fascynującej inżynierii.
Oto co dokładnie się zmienia i dlaczego powinniście się tym ekscytować (lub przynajmniej czuć bezpieczniej).
Dlaczego "tor1" musiał umrzeć?
Stary protokół, któremu twórcy dopiero teraz nadali nazwę "tor1" (żeby mieć co wpisać w dokumentacji przy jego wycofywaniu), powstał w okolicach 2002 roku. Opierał się on na szyfrze strumieniowym AES-128-CTR.
Głównym problemem była tzw. kowalność (malleability) szyfru strumieniowego. W trybie licznikowym (CTR) szyfrogram ($C$) powstaje przez zxorowanie strumienia klucza ($S$) z tekstem jawnym ($P$), czyli $C = S \oplus P$.
To matematyka na poziomie podstawówki, która była gwoździem do trumny anonimowości:
- Jeśli atakujący (Pan Ciekawski) przechwyci zaszyfrowaną paczkę i zxoruje ją z własnym wzorcem ($M$), to po odszyfrowaniu przez ofiarę, tekst jawny również będzie zawierał ten wzorzec.
- Atakujący może więc "oznaczyć" ruch na wejściu do sieci i nasłuchiwać, gdzie ten uszkodzony wzorzec wypłynie na wyjściu.
- Efekt? Całkowita deanonimizacja obwodu, zanim jeszcze prześlemy jakiekolwiek dane.
Co gorsza, użytkownicy często mylili efekty tych ataków (zrywane połączenia) z atakami DDoS, co powodowało fałszywe alarmy w logach klientów Tor.
CGO: Kryptograficzne "Wszystko albo Nic"
Nowy standard, Counter Galois Onion (CGO), oparty jest na konstrukcji UIV+ i koncepcji Rugged Pseudorandom Permutation (RPRP). Zamiast prostego strumienia, mamy tu do czynienia z szyfrowaniem szerokoblokowym (wide-block cipher design), które jest odporne na kowalność.
Jak to działa w praktyce?
- Efekt domina: Każda komórka jest szyfrowana w taki sposób, że zależy od poprzednich. CGO wykorzystuje 16-bajtowy znacznik $T$, który jest przekazywany ("chained") do następnej komórki jako $T'$.
- Destrukcja zamiast modyfikacji: Jeśli atakujący zmieni choćby jeden bit w przesyłanym pakiecie, algorytm deszyfrujący "wybuchnie". Cała wiadomość, oraz wszystkie kolejne w tym obwodzie, staną się niemożliwe do odczytania. Atakujący nie może już "dorysować kropki" – może co najwyżej spalić paczkę, co jest łatwe do wykrycia i nie zdradza tożsamości nadawcy.
- Forward Secrecy (Utajnianie z wyprzedzeniem): W "tor1" klucze AES żyły przez całe życie obwodu. W CGO, przy każdym wysłaniu lub odebraniu komórki, klucze są aktualizowane przez funkcję
Update. Jeśli ktoś ukradnie klucz w 5 minucie połączenia, nie odszyfrowuje tego, co działo się w 4 minucie.
Wydajność: Gdzie zyskujemy, a gdzie tracimy?
To chyba największe zaskoczenie. Zazwyczaj "bezpieczniej" znaczy "wolniej". Tutaj mamy ciekawą anomalię.
Stary protokół używał SHA-1 do weryfikacji integralności. SHA-1 jest powolne. CGO eliminuje ten narzut.
Badania (przeprowadzone na procesorach Intel Cascade Lake) pokazują następujące wyniki:
- Węzły końcowe (Klient/Proxy i Exit Node): Tutaj CGO jest 3-krotnie szybsze od starego Tora!. To ogromna ulga dla obciążonych węzłów wyjściowych.
- Węzły pośrednie (Relay): Tutaj mamy spowolnienie rzędu 20-50%. Wynika to z faktu, że stary Tor na środkowych węzłach robił tylko bardzo szybkie AES-CTR, a teraz musi wykonać nieco bardziej skomplikowaną matematykę CGO.
Twórcy jednak uspokajają – zysk na krańcach sieci jest ważniejszy, a nowoczesne procesory z instrukcjami AES-NI i PCLMUL (używanymi do optymalizacji CGO) poradzą sobie z narzutem na węzłach pośrednich.

Co dalej?
Implementacja CGO jest już gotowa w Arti (klient Tora napisany w Rust) oraz w klasycznej implementacji C. Następne kroki to włączenie CGO domyślnie w Arti oraz wdrożenie negocjacji CGO dla usług cebulowych (onion services).
To fascynujący moment, w którym widzimy, jak akademicka kryptografia (badania Degabriele, Melloni, Münch, Stam) realnie naprawia internet.
Czytaj więcej: Dlaczego VPN to za mało? - Kompleksowa analiza anonimowości, gdzie omawiamy zalety i ograniczenia sieci Tor w kontekście współczesnych zagrożeń.
Aleksander
Źródła: