0Pricing
Cryptology Academy · Lekcja

Framework protokołu Noise

Proszę poznać Noise — framework do tworzenia niestandardowych uzgodnień kryptograficznych wykorzystywanych w WireGuard, WhatsApp i Lightning.

Framework protokołu Noise to bezpłatna lekcja Cryptology Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cryptology Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cryptology Academy zawiera 4 lekcji w sumie.

Czym jest framework Noise

Noise Protocol Framework (Trevor Perrin, 2016; aktualna wersja z 2018 r.) to framework do budowania bezpiecznych protokołów kanałów przy użyciu niewielkiego zestawu prymitywów i języka wzorców. Zamiast definiować pojedynczy protokół, Noise określa słownik wzorców uzgadniania opisujących sekwencję operacji DH i ich kolejność. Każdy prawidłowy wzorzec Noise można skonfigurować z użyciem konkretnych funkcji DH (Curve25519 lub Curve448), szyfrujących (AESGCM lub ChaChaPoly) i skrótów (SHA-256, SHA-512, BLAKE2). Noise jest używany w WireGuard, WhatsApp, Signal (jako podstawa X3DH), Lightning Network i I2P.

Role i klucze w Noise

Każde uzgadnianie Noise ma inicjatora (I) i respondera (R). Każda strona może mieć dwa typy kluczy: statyczny (długoterminowy klucz tożsamości, oznaczany jako s/S) oraz efemeryczny (generowany od nowa dla każdej sesji, oznaczany jako e/E). Małe litery oznaczają klucz lokalnej strony, a wielkie — klucz publiczny strony zdalnej. Wzorzec Noise określa, które klucze są wysyłane (w postaci jawnej lub zaszyfrowanej) oraz jakie operacje DH są wykonywane. Na przykład „e” oznacza „wyślij mój efemeryczny klucz publiczny”, a „es” oznacza „wykonaj DH(my_ephemeral, remote_static)”. Każdy wynik DH jest mieszany z bieżącym stanem skrótu uzgadniania.

Stan symetryczny Noise

Rdzeniem Noise jest SymmetricState, który przechowuje trzy wartości: ck (klucz łańcuchowy, zainicjowany skrótem nazwy protokołu), h (skrót uzgadniania, czyli bieżący skrót transkryptu) oraz k (bieżący klucz szyfrowania). MixKey(input) wykonuje HKDF(ck, input), aby zaktualizować ck i k. MixHash(data) dodaje dane do h za pomocą funkcji skrótu. EncryptAndHash(plaintext) szyfruje dane przy użyciu k i miesza szyfrogram z h. DecryptAndHash(ciphertext) odszyfrowuje dane i miesza szyfrogram z h. Skrót uzgadniania h zapewnia powiązanie z transkryptem — każda modyfikacja dowolnej wiadomości przez przeciwnika zmienia h, powodując niepowodzenie odszyfrowania. Na końcu uzgadniania Split() tworzy dwa oddzielne stany CipherState do wysyłania i odbierania.

Wzorzec Noise_XX

Noise_XX jest najczęściej używanym wzorcem wzajemnego uwierzytelniania. Zapewnia wzajemne uwierzytelnianie za pomocą kluczy statycznych, przy czym klucze statyczne obu stron są przesyłane podczas uzgadniania. Wzorzec: (1) -> e (inicjator wysyła efemeryczny klucz publiczny). (2) <- e, ee, s, es (responder wysyła klucz efemeryczny, wykonuje DH(e,e) i DH(e,s_resp), a następnie wysyła zaszyfrowany klucz statyczny). (3) -> s, se (inicjator wysyła zaszyfrowany klucz statyczny i wykonuje DH(s_init, e_resp)). Po kroku 3 obie strony włączyły trzy wyniki DH do klucza sesji: ee (forward secrecy), es (uwierzytelnianie serwera), se (uwierzytelnianie klienta). Klucz sesji jest niezależny od kompromitacji dowolnego klucza długoterminowego po zakończeniu sesji.

Wzorzec Noise_IK (WireGuard)

WireGuard używa wzorca wywodzącego się z Noise_IK, w którym inicjator zna wcześniej klucz statyczny respondera. (1) -> e, es, s, ss (inicjator wysyła klucz efemeryczny, wykonuje DH(e, S_resp), wysyła zaszyfrowany klucz statyczny i wykonuje DH(s_init, S_resp)). (2) <- e, ee, se (responder wysyła klucz efemeryczny, wykonuje DH(e_resp, e_init) oraz DH(e_resp, S_init)). Wzorzec IK zapewnia ukrycie tożsamości inicjatora (jego klucz statyczny jest szyfrowany kluczem statycznym respondera w kroku 1) oraz ukończenie uzgadniania w jednej rundzie komunikacji (1 RTT). WireGuard dodaje znacznik czasu wewnątrz zaszyfrowanego ładunku inicjatora, aby zapobiegać powtórzeniom. Dzięki temu WireGuard zachowuje charakterystyczną prostotę: pełne uzgadnianie VPN odbywa się w dwóch pakietach UDP.

Skrót uzgadniania Noise i wiązanie kanału

Skrót uzgadniania h na końcu uzgadniania Noise jest skrótem transkryptu obejmującym każdą wysłaną wiadomość. Służy jako wartość wiążąca kanał — obie strony obliczają to samo h, a każdy protokół stron trzecich, który chce powiązać się z sesją Noise, może użyć h jako nonce lub identyfikatora kanału. Umożliwia to uwierzytelnianie złożone: po uzgadnianiu Noise może zostać wykonany etap uwierzytelniania certyfikatem w stylu TLS, wiążący certyfikat z konkretną sesją za pomocą h. Wiązanie kanału zapobiega atakom polegającym na przekazywaniu poświadczeń, w których poświadczenia uwierzytelniające z jednej sesji są odtwarzane przeciwko innej. Split() udostępnia aplikacji h razem z kluczami sesji.

Odroczone wzorce Noise i fallback

Noise obsługuje odroczone wzorce w sytuacjach, gdy inicjator nie zna wcześniej klucza statycznego respondera. Noise_NX (inicjator nie ma klucza statycznego, a responder go przesyła) jest analogiczny do jednokierunkowego TLS. Noise_XX obsługuje sytuację, w której obie strony muszą wymienić klucze. Noise_IK może przejść awaryjnie do Noise_XXfallback, jeśli przypuszczenie inicjatora dotyczące klucza statycznego respondera jest nieprawidłowe (na przykład po rotacji klucza). Wzorzec fallback pozwala responderowi zasygnalizować „użyto niewłaściwego klucza; oto mój nowy klucz publiczny” bez ujawniania zewnętrznym obserwatorom, że nastąpiło przejście awaryjne — zachowując niejawność protokołu.

Noise w WhatsApp i Signal

WhatsApp i Signal używają Noise_XX do ustanawiania bezpiecznych kanałów między klientami a serwerami. Binarny protokół WhatsApp wykorzystuje Noise_XX z Curve25519, ChaChaPoly i SHA-256. Kluczem statycznym klienta jest jego długoterminowy klucz tożsamości. Po uzgadnianiu Noise warstwa aplikacji wykonuje dodatkowe uwierzytelnianie (rejestrację w Signal i weryfikację numeru telefonu). Uzgadnianie klucza X3DH (Extended Triple Diffie-Hellman) wykonuje cztery operacje DH w celu ustanowienia wspólnego sekretu między dwiema osobami za pośrednictwem asynchronicznej wymiany wiadomości — nie jest to standardowy wzorzec Noise, ale wykorzystuje podobne koncepcje mieszania DH. Następnie Double Ratchet przejmuje obsługę bieżącego szyfrowania wiadomości.

Noise a TLS

Noise i TLS 1.3 rozwiązują ten sam problem (uwierzytelnione uzgadnianie klucza), ale opierają się na odmiennych założeniach. TLS 1.3 jest pojedynczym protokołem ze z góry określonymi zestawami szyfrów, formatami certyfikatów (X.509) i rozszerzeniami. Został zaprojektowany dla przeglądarek internetowych i serwerów — jako rozwiązanie pasujące do większości zastosowań. Noise jest frameworkiem: nie określa formatu certyfikatów, PKI ani wiązania z warstwą transportową. Dzięki temu Noise jest mniejszy (cała implementacja Noise w WireGuard ma mniej niż 400 wierszy kodu) i łatwiejszy do formalnej analizy, ale wymaga od aplikacji osobnego zarządzania tożsamością. Noise jest preferowany w systemach zamkniętych (aplikacja–serwer, VPN), w których PKI byłoby nadmiarowe, natomiast TLS sprawdza się w systemach otwartych (sieć WWW), gdzie potrzebna jest interoperacyjność certyfikatów.

Formalne bezpieczeństwo Noise

Wzorce Noise zostały formalnie przeanalizowane w modelu bezpieczeństwa eCK (extended Canetti-Krawczyk). Kobeissi, Bhargavan i Blanchet przeanalizowali Noise za pomocą Proverif i znaleźli dowody uwierzytelniania oraz poufności klucza dla wszystkich 12 podstawowych wzorców Noise. Dowody te zakładają standardowe założenie trudności problemu DH dla Curve25519 oraz bezpieczeństwo bazowych funkcji AEAD i skrótu. Kompozycyjny charakter Noise (każdy wynik DH jest stopniowo mieszany) ułatwia analizę w porównaniu ze złożonymi protokołami podobnymi do TLS, mającymi wiele przejść między stanami. Weryfikacja kryptograficzna Noise zapewniła twórcom WireGuard i WhatsApp wysoki poziom pewności co do bezpieczeństwa ich protokołów przed wdrożeniem.

Poprawna implementacja Noise

Typowe problemy przy implementacji Noise: (1) Pomylenie wzorca — użycie Noise_IK, gdy klucz statyczny respondera nie został wiarygodnie przekazany z wyprzedzeniem, prowadzi do niezgodności tożsamości (inicjator może niepostrzeżenie szyfrować wiadomości z użyciem niewłaściwego klucza). (2) Ochrona przed powtórzeniami — Noise zapewnia uwierzytelnianie, ale nie chroni wiadomości fazy Transport przed powtórzeniem; należy wymuszać używanie nonce'ów (64-bitowego licznika), a przepełnienie licznika (po 2^64 wiadomościach) musi powodować ponowne uzgadnianie kluczy. (3) Integralność prologu — prolog Noise (ciąg bajtów mieszany z h przed rozpoczęciem uzgadniania) musi zawierać cały kontekst protokołu (wersję i wybór algorytmów), aby zapobiegać atakom obniżenia poziomu zabezpieczeń. (4) Niewłaściwe użycie PSK — Noise obsługuje rozszerzenia PSK służące do mieszania wstępnie współdzielonych kluczy; PSK muszą mieć wysoką entropię, a nie być hasłami użytkowników.

Quiz z frameworka Noise

Co w notacji wzorców Noise oznacza „es” podczas uzgadniania?

Podsumowanie frameworka Noise

Noise jest frameworkiem do budowania protokołów uwierzytelnionego uzgadniania klucza z użyciem języka wzorców operacji DH. SymmetricState przechowuje klucz łańcuchowy (ck), skrót transkryptu (h) oraz klucz szyfrowania (k), aktualizowane przez MixKey/MixHash. Noise_XX zapewnia wzajemne uwierzytelnianie w czasie 1,5 RTT, a Noise_IK (WireGuard) kończy się w czasie 1 RTT, gdy klucz respondera jest znany. Skrót uzgadniania h służy do wiązania kanału. Noise został formalnie zweryfikowany dla wszystkich podstawowych wzorców za pomocą Proverif. Jest preferowany zamiast TLS w protokołach systemów zamkniętych (WireGuard, WhatsApp), w których PKI nie jest potrzebne. Poprawna implementacja wymaga ochrony przed powtórzeniami, integralności prologu i PSK o wysokiej entropii.

Często zadawane pytania

Czy lekcja „Framework protokołu Noise” jest bezpłatna?

Tak — pełny tekst „Framework protokołu Noise” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cryptology Academy, przejdź na CoddyKit PRO. Kurs Cryptology Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Framework protokołu Noise”?

Proszę poznać Noise — framework do tworzenia niestandardowych uzgodnień kryptograficznych wykorzystywanych w WireGuard, WhatsApp i Lightning. Ćwiczysz Cryptology Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Cryptology Academy?

Nie wymagamy żadnego doświadczenia. Cryptology Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Framework protokołu Noise”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Cryptology Academy?

Tak. Każda lekcja Cryptology Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Protokół Needhama-Schroedera i ataki
  2. Protokół Station-to-Station (STS)
  3. Framework protokołu Noise
  4. Zasady projektowania bezpiecznych protokołów
← Powrót do Cryptology Academy