Jak to działa

Jak Crocodile sprawia, że Twoje rozmowy należą do Ciebie

Przegląd architektury i protokołu prostymi słowami. Każdy rozdział zaczyna się od idei; otwórz „Pod maską”, żeby zobaczyć szczegóły techniczne.

Rozdział 1

Cztery rodzaje uczestników

Crocodile dzieli pracę tak, by Twoje słowa widzieli tylko ci, z którymi rozmawiasz, a części prowadzone przez obcych nigdy ich nie widziały.

Twoja aplikacja

Przechowuje Twoje klucze, szyfruje wszystko, co wysyłasz, i odszyfrowuje to, co odbierasz. Historia wiadomości jest tutaj i nigdzie indziej.

Wie: Wszystko, co wysyłasz i odbierasz: to Twoje.

Gospodarz

W każdym pokoju głosowym i przestrzeni aplikacja jednej osoby zostaje wybrana do przekazywania szyfrowanego ruchu pozostałym. To uczestnik jak każdy inny.

Wie: Adresy IP uczestników i to, kto mówi, nigdy treść.

Serwery koordynujące

Centrale prowadzone przez wolontariuszy: przechowują profile i przestrzenie, mówią, kto jest online, i wybierają gospodarzy. Łączą się w jedną sieć.

Wie: Profile, członkostwa i to, kto jest online, nigdy treść.

Katalog

Książka telefoniczna serwerów koordynujących, dzięki której nowe aplikacje wiedzą, od czego zacząć. Nie wie nic o ludziach.

Wie: Tylko listę serwerów.

Rozdział 2

Twoje konto to klucz, nie hasło

Gdy instalujesz Crocodile, aplikacja tworzy na Twoim komputerze losowy sekret o długości 32 bajtów. Powstają z niego dwa klucze: jeden do podpisywania tego, co publikujesz, i jeden do odbierania szyfrowanych wiadomości. Twój identyfikator to odcisk klucza do podpisywania.

Ponieważ identyfikator jest wyliczany z klucza, serwer nie może podmienić klucza i podszyć się pod Ciebie. Nie ma hasła do ukradzenia ani resetu, do którego dałoby się nakłonić pracownika pomocy. Sekret jest pokazywany raz jako klucz odzyskiwania i zostaje na Twoich urządzeniach, zaszyfrowany pękiem kluczy systemu.

Pod maską
  • Z 32-bajtowego ziarna powstaje klucz do podpisywania Ed25519 i klucz szyfrujący X25519. Identyfikator to pierwsze 26 znaków base32(SHA-256(publiczny klucz do podpisywania)).
  • Każde urządzenie publikuje podpisany rekord urządzenia z pakietem kluczy wstępnych (X25519 + ML-KEM-768), który zmienia się co tydzień. Stare sekrety kluczy wstępnych są usuwane po okresie przejściowym.
  • Numery bezpieczeństwa pozwalają dwóm osobom porównać klucze innym kanałem, jak w innych bezpiecznych komunikatorach.
  • Dane lokalne (tożsamość, klucze wstępne, historia) są szyfrowane kluczem chronionym przez pęk kluczy systemu operacyjnego.

Rozdział 3

Szukanie najszybszego serwera

Aplikacja pobiera z katalogu listę serwerów koordynujących, mierzy, jak szybko każdy odpowiada, i łączy się z najszybszym. Drugi czeka w gotowości, więc gdy Twój serwer zniknie, aplikacja od razu się przełącza.

Zanim cokolwiek się wydarzy, serwer udowadnia, kim jest, a aplikacja i serwer uzgadniają klucze dla tego połączenia. Od tej chwili nawet metadane, którymi się wymieniają, są szyfrowane, niezależnie od HTTPS, więc działa to bezpiecznie także na domowym serwerze.

Pod maską
  • Katalog wymienia każdy serwer podpisany przez ten serwer, z zaciemnionym adresem. Aplikacje sprawdzają podpis, zanim użyją wpisu.
  • Podpisane powitanie serwera zawiera świeżą ofertę hybrydowej wymiany kluczy (X25519 + ML-KEM-768). Aplikacja sprawdza ją z kluczem z katalogu, odpowiada i podpisuje zapis rozmowy. Każda kolejna ramka jest szyfrowana AES-256-GCM i dopełniana.
  • Serwery odpowiadają też na STUN na dwóch portach, więc aplikacje poznają swój publiczny adres i typ NAT bez pytania Google czy Cloudflare.

Rozdział 4

Serwery, które nie mogą kłamać na Twój temat

Twój profil, utworzone przez Ciebie przestrzenie, ich zaproszenia i lista członków to małe rekordy podpisane przez autora. Serwery je przechowują i udostępniają, a każdy serwer i każda aplikacja sprawdza podpisy. Serwer może odmówić przekazania rekordu, ale nie może go zmienić ani zmyślić.

Serwery koordynujące znajdują się nawzajem i tworzą sieć. Każdy rekord przechowuje kilka serwerów wybranych na podstawie skrótu i kopiują sobie zmiany, więc sieć działa dalej, gdy któryś serwer padnie.

Pod maską
  • Rekordy: profil, zapieczętowana lista znajomych, przestrzeń, zaproszenie, członek, urządzenie i notatka. Każdy ma autora, który może go zapisać; weryfikacja (podpis, uprawnienia, wersja „ostatni zapis wygrywa”) jest identyczna na serwerach i w aplikacjach.
  • Listy znajomych są szyfrowane tylko dla urządzeń właściciela, a zaproszenia do znajomych podróżują jako zapieczętowane notatki bez nazwy nadawcy, więc serwery nie wiedzą, kto się z kim przyjaźni.
  • Każdym rekordem opiekuje się kilka pierwszych serwerów na pierścieniu spójnego haszowania dla jego fragmentu. Opiekunowie replikują zapisy, nadrabiają zaległości kursorami sekwencji i przekazują rekordy, gdy serwery dołączają lub odchodzą.

Rozdział 5

Znajomy jest gospodarzem, zapasowy czeka

Gdy ludzie dołączają do pokoju głosowego albo otwierają przestrzeń, serwer koordynujący patrzy na łącza wszystkich (jak otwarta jest ich sieć, jaka jest prędkość wysyłania, jaki komputer, czy działa na baterii) i wybiera na gospodarza najlepiej przygotowaną osobę. Druga w kolejności jest zapasowa.

Wszyscy łączą się z aplikacją gospodarza, która przekazuje szyfrowany dźwięk. Żeby nie obciążać łącza, każdemu słuchaczowi przesyła kilku najgłośniejszych mówców. Nigdy nie ma dźwięku w postaci jawnej: po prostu przesyła zapieczętowane pakiety.

Jeśli gospodarz wyjdzie albo przestanie być osiągalny, zastępuje go osoba zapasowa i wszyscy łączą się z nią, zwykle zanim ktokolwiek to zauważy.

Pod maską
  • Gospodarz uruchamia w swojej aplikacji mały SFU (selective forwarding unit). Każdy uczestnik otwiera do niego jedno połączenie WebRTC z jedną ścieżką wysyłaną, pięcioma miejscami na mówców i kanałem danych.
  • Miejsca na mówców są przydzielane na podstawie nagłówka poziomu dźwięku RFC 6464 („last-N”), z przepisanymi numerami sekwencji, żeby każde miejsce było jednym ciągłym strumieniem.
  • Oferty i odpowiedzi są podpisywane kluczami tożsamości wraz z sesją, epoką, oboma identyfikatorami i odciskiem DTLS, więc serwer koordynujący nie może się wstawić pośrodku.
  • Każda zmiana gospodarza zwiększa numer epoki; nieaktualne oferty są ignorowane. Uczestnicy, którzy nie mogą połączyć się z gospodarzem, zgłaszają to, a gdy zgodzi się połowa, przejmuje osoba zapasowa.

Rozdział 6

Szyfrowanie warstwami

Wszystko jest szyfrowane na Twoim urządzeniu, zanim je opuści, a klucze mają tylko uczestnicy rozmowy. Oto, co dzieje się z wiadomością po drodze.

Jedna wiadomość, cztery warstwy

Aplikacja podpisuje wiadomość, żeby inni mogli udowodnić, że pochodzi od Ciebie, dopełnia ją, żeby długość nic nie zdradzała, szyfruje kluczem, który mają tylko uczestnicy rozmowy, i wysyła połączeniem, które samo jest szyfrowane. Każdy po drodze widzi tylko pomieszane bajty standardowego rozmiaru.

Gotowy na komputery kwantowe

Klucze są wymieniane hybrydowo: X25519, sprawdzoną klasyczną metodą, i ML-KEM-768, nowym standardem postkwantowym. Napastnik musiałby złamać oba. To ważne, bo ktoś może dziś nagrać szyfrowany ruch i poczekać, aż komputer kwantowy go odszyfruje.

Klucze, które idą naprzód

Klucz każdego uczestnika obraca się jak zapadka: po każdej wiadomości zastępuje go następny w łańcuchu, który idzie tylko do przodu, a stary jest usuwany. Ktoś, kto ukradnie klucz dziś, nie przeczyta wczorajszych wiadomości. Co 30 minut i za każdym razem, gdy ktoś wychodzi, wszyscy zaczynają nowy łańcuch od nowych losowych kluczy, więc skradziony klucz szybko przestaje działać.

Głos, ramka po ramce

Twój głos jest szyfrowany w małych ramkach, około pięćdziesięciu na sekundę, zaraz za mikrofonem, zanim trafi do sieci. Ramka, której nie da się zaszyfrować, jest odrzucana, nigdy nie wychodzi jawnie. Głos ma stały bitrate, więc rozmiar pakietów nie zdradza, co mówisz.

Pod maską
  • Wspólne sekrety par (dystrybucja kluczy nadawców, synchronizacja historii, łączenie urządzeń, kanały z serwerem) łączą X25519 i ML-KEM-768 (FIPS 203) przez HKDF-SHA256.
  • Klucze nadawców mają dwa łańcuchy HKDF: tekstowy przesuwa się po każdej wiadomości, a dźwiękowy co 30 sekund. Klucze są wymieniane co 30 minut i przy wyjściu kogoś z rozmowy, a wysyłane tylko do urządzeń, których członkostwo aplikacja sama sprawdziła na podstawie podpisanych rekordów.
  • Głos: wątek Encoded Transform szyfruje każdą ramkę Opus algorytmem AES-256-GCM z uwierzytelnionym końcowym znacznikiem w stylu SFrame (identyfikator klucza, generacja, licznik).
  • Tekst: podpisany przez autora (Ed25519), dopełniony metodą Padmé, zaszyfrowany łańcuchem tekstowym.
  • Zapieczętowane paczki do urządzenia używają jego bieżącego klucza wstępnego i są podpisane przez nadawcę, więc nawet wiadomości dla urządzeń offline mają poufność przyszłą.

Rozdział 7

Gdy bezpośrednie połączenie jest niemożliwe

Niektóre sieci, na przykład restrykcyjne zapory w biurach czy na uczelniach, blokują bezpośrednie połączenia między komputerami. Crocodile informuje, gdy tak się dzieje, a Ty możesz pozwolić serwerowi koordynującemu przekazywać Twój ruch.

Przekaźnik przesyła pakiety, które już są zaszyfrowane end-to-end: widzi ich rozmiar i czas, ale nie zawartość. Zgoda obowiązuje godzinę i jest odnawiana tylko wtedy, gdy wciąż jest potrzebna.

Pod maską
  • Przekaźnik to standardowy TURN (RFC 5766) na porcie UDP serwera koordynującego, z krótkotrwałymi danymi uwierzytelniającymi. Serwery ograniczają liczbę osób, które mogą z niego korzystać.
  • Po połączeniu aplikacja sprawdza swoją sieć na dwóch portach STUN, klasyfikuje ją jako otwartą, ograniczoną (symetryczny NAT) lub zablokowaną i proponuje przekaźnik, gdy trzeba.
  • Każde połączenie zapisuje cztery etapy (oferta, odpowiedź, ścieżka sieciowa, szyfrowany kanał), więc gdy coś zawiedzie, aplikacja wie, gdzie.

Rozdział 8

Wiadomości, które znajdą drogę

Żaden serwer nie przechowuje Twojej historii, więc aplikacje Crocodile przekazują sobie wiadomości nawzajem. Oto, co się dzieje, gdy piszesz do kogoś, kto jest offline.

  1. Czeka u Ciebie

    Wiadomość trafia do skrzynki nadawczej aplikacji i pokazuje mały zegar.

  2. Znajomy wraca

    Gdy tylko oboje jesteście online, aplikacja przekazuje ją, zapieczętowaną dla jego urządzenia.

  3. Potwierdzone

    Jego aplikacja potwierdza odbiór, a zegar znika. Uczestnicy, którzy przegapili wiadomości w przestrzeni, nadrabiają je od gospodarza i zapasowego.

  4. Albo skrzynka

    Opcjonalnie serwer przechowuje wiadomości prywatne do 7 dni, zapieczętowane dla każdego urządzenia, więc nie może ich przeczytać, i usuwa je po dostarczeniu.

Rozdział 9

Dodawanie komputera

Nowy komputer pokazuje krótki kod. Wpisz go na komputerze, na którym jesteś zalogowany, a potem sprawdź, czy oba ekrany pokazują ten sam sześciocyfrowy kod bezpieczeństwa. Jeśli tak, konto zostaje przesłane w postaci zaszyfrowanej, a nowe urządzenie jest gotowe.

Kod bezpieczeństwa obejmuje klucze obu urządzeń, więc gdyby ktoś próbował podmienić któryś po drodze, kody by się różniły i od razu byś to zauważył.

Słowniczek

Pojęcia, które spotkasz w tekstach o bezpieczeństwie, każde w zdaniu lub dwóch.

Szyfrowanie end-to-end
Klucze mają tylko nadawca i odbiorcy. Cokolwiek przenosi wiadomość po drodze, łącznie z serwerami, widzi tylko pomieszane dane.
Peer-to-peer
Aplikacje łączą się ze sobą bezpośrednio, a nie przez centralny serwer.
Kryptografia postkwantowa
Szyfrowanie zaprojektowane tak, by oprzeć się przyszłym komputerom kwantowym, które mogłyby złamać metody używane dziś w większości internetu. ML-KEM to standard opublikowany przez NIST w 2024 roku.
Poufność przyszła (forward secrecy)
Kradzież klucza dziś nie otwiera dawnych wiadomości, bo klucze, którymi je szyfrowano, zostały usunięte.
Bezpieczeństwo po przejęciu klucza
Po kradzieży klucza nowe losowe klucze wkrótce znów odcinają złodzieja. W Crocodile dzieje się to w ciągu 30 minut albo od razu, gdy ktoś wychodzi.
Podpis cyfrowy
Matematyczna pieczęć tworzona kluczem prywatnym. Każdy może ją sprawdzić kluczem publicznym, a nikt bez klucza prywatnego nie może jej podrobić.
NAT, STUN i TURN
Domowe routery ukrywają komputery za jednym publicznym adresem (NAT). STUN pomaga aplikacjom poznać ich publiczny adres, żeby mogły połączyć się bezpośrednio; TURN przekazuje ruch, gdy nie mogą.
SFU
Selective forwarding unit przekazuje dźwięk od każdego mówcy do każdego słuchacza bez miksowania i dekodowania. W Crocodile działa w aplikacji gospodarza.
Metadane
Dane o rozmowie, a nie jej treść: kto z kim rozmawia, kiedy i ile. Crocodile w pełni szyfruje treść i ogranicza metadane, ale serwery wciąż widzą ich część.

Przeczytaj pełny dokument o architekturze (po angielsku)