ChaCha20-Poly1305 – algorytm szyfrowania symetrycznego z uwierzytelnianiem, łączący szyfr strumieniowy ChaCha20 z algorytmem uwierzytelniania wiadomości Poly1305. Należy do konstrukcji typu AEAD (ang. Authenticated Encryption with Associated Data), które zapewniają poufność przesyłanych informacji oraz umożliwiają wykrywanie ich nieuprawnionych modyfikacji. Pozwala również uwierzytelniać dodatkowe dane, które pozostają niezaszyfrowane.
Wariant nazywany IETF wykorzystuje 256-bitowy klucz, 96-bitową wartość nonce, która musi być odmienna dla każdego szyfrowania przy użyciu tego samego klucza, oraz 128-bitowy znacznik uwierzytelniający. Konstrukcja została opisana w dokumencie RFC 7539 z 2015 roku, zastąpionym w 2018 roku przez RFC 8439.
ChaCha20-Poly1305 stosuje się m.in. w protokołach TLS, IPsec i SSH oraz w WireGuard. Jest jednym z algorytmów szyfrowania uwierzytelnionego dostępnych w TLS 1.3.
Algorytmy składające się na ChaCha20-Poly1305 opracował Daniel J. Bernstein. Poly1305 został przedstawiony w 2005 roku jako algorytm uwierzytelniania wiadomości, natomiast ChaCha20 w 2008 roku jako rozwinięcie szyfru strumieniowego Salsa20.
Prace nad zastosowaniem tych algorytmów w protokołach internetowych doprowadziły do opracowania konstrukcji łączącej szyfrowanie strumieniowe z uwierzytelnianiem wiadomości. W 2015 roku opublikowano RFC 7539, opisujący ChaCha20, Poly1305 oraz ich połączenie w algorytm AEAD. W tym samym roku ukazał się RFC 7634, określający zastosowanie ChaCha20-Poly1305 w IPsec oraz protokole wymiany kluczy IKEv2.
W czerwcu 2016 roku RFC 7905 określił sposób wykorzystania ChaCha20-Poly1305 w TLS 1.2 i DTLS 1.2. W czerwcu 2018 roku RFC 7539 został zastąpiony przez RFC 8439, który uwzględnił poprawki do wcześniejszej specyfikacji i rozszerzył omówienie zagadnień bezpieczeństwa.
ChaCha20-Poly1305 łączy dwa algorytmy o odmiennych zadaniach. ChaCha20 szyfruje tekst jawny, natomiast Poly1305 oblicza znacznik umożliwiający sprawdzenie, czy szyfrogram i powiązane z nim dane nie zostały zmodyfikowane. Konstrukcja wykorzystuje zasadę encrypt-then-MAC, polegającą na uwierzytelnianiu danych po ich zaszyfrowaniu.
Wariant IETF opisany w RFC 8439 wykonuje następujące operacje:
Dane przekazywane do Poly1305 mają ściśle określony format. Najpierw umieszczane są dane AAD, uzupełniane w razie potrzeby zerowymi bajtami do wielokrotności 16 bajtów. Następnie dodawany jest szyfrogram, również odpowiednio uzupełniany, a na końcu dwie 64-bitowe liczby określające długości AAD i szyfrogramu w bajtach. Obie długości zapisuje się w porządku little-endian.
Szyfrogram ma taką samą długość jak tekst jawny. Dodatkowe 16 bajtów zajmuje znacznik uwierzytelniający. Sposób przekazywania wartości nonce zależy od protokołu wykorzystującego algorytm.
AEAD pozwala chronić integralność danych bez konieczności ich szyfrowania. Takie dane określa się skrótem AAD (ang. Additional Authenticated Data). Mogą to być na przykład informacje w nagłówku pakietu sieciowego, potrzebne do jego przetwarzania i dlatego pozostawione w postaci jawnej.
AAD są uwzględniane przy obliczaniu znacznika Poly1305 razem z szyfrogramem. Zmiana któregokolwiek z tych elementów powoduje, że sprawdzenie autentyczności wiadomości kończy się niepowodzeniem, z wyjątkiem sytuacji skutecznego sfałszowania znacznika.
Odbiorca wykorzystuje ten sam klucz główny i wartość nonce, aby odtworzyć jednorazowy klucz Poly1305. Następnie oblicza znacznik uwierzytelniający na podstawie otrzymanych AAD i szyfrogramu oraz porównuje go ze znacznikiem dołączonym do wiadomości.
Jeżeli znaczniki są zgodne, szyfrogram może zostać odszyfrowany za pomocą ChaCha20. W przeciwnym przypadku wiadomość zostaje odrzucona. Implementacja nie powinna udostępniać niezweryfikowanego tekstu jawnego aplikacji.
Podstawowy wariant określony w RFC 8439 wykorzystuje 96-bitową wartość nonce i 32-bitowy licznik bloków ChaCha20. Ponieważ licznik 0 jest przeznaczony do wygenerowania klucza Poly1305, szyfrowanie tekstu jawnego rozpoczyna się od bloku 1. Ogranicza to maksymalną długość pojedynczej wiadomości do 274 877 906 880 bajtów, czyli nieco mniej niż 256 GiB.
XChaCha20-Poly1305 jest odmianą konstrukcji wykorzystującą algorytm XChaCha20 oraz 192-bitową wartość nonce. Zastosowanie dłuższej wartości nonce pozwala na jej losowe generowanie przy zachowaniu bardzo małego prawdopodobieństwa powtórzenia, co ułatwia bezpieczne szyfrowanie dużej liczby niezależnych wiadomości.
Wariant ten wykorzystuje funkcję HChaCha20 do wyprowadzenia klucza pochodnego z klucza głównego i części wartości nonce. Następnie stosuje konstrukcję ChaCha20-Poly1305 z otrzymanym kluczem. XChaCha20-Poly1305 jest obsługiwany m.in. przez bibliotekę libsodium i nie jest bezpośrednio zgodny z wariantem IETF o 96-bitowej wartości nonce.
Istnieje również pierwotna odmiana ChaCha20-Poly1305, wykorzystująca 64-bitową wartość nonce i 64-bitowy licznik bloków. Zapewnia ona znacznie większy zakres wartości licznika niż wariant IETF. Biblioteka libsodium udostępnia obie odmiany jako odrębne interfejsy programistyczne.
W protokole SSH stosowany jest wariant chacha20-poly1305@openssh.com, którego format i sposób wykorzystania algorytmów różnią się od konstrukcji opisanej w RFC 8439. Wykorzystuje on dwie instancje ChaCha20 z odrębnymi kluczami: jedną do szyfrowania długości pakietu, a drugą do szyfrowania jego zawartości. Nie należy zakładać jego bezpośredniej zgodności z wariantem IETF.
Bezpieczeństwo ChaCha20-Poly1305 zależy od właściwego zarządzania kluczami oraz zapewnienia niepowtarzalności wartości nonce dla wiadomości szyfrowanych tym samym kluczem. Ponowne użycie tej samej pary klucza i wartości nonce powoduje wygenerowanie identycznego strumienia klucza ChaCha20 i tego samego jednorazowego klucza Poly1305.
W takiej sytuacji operacja XOR wykonana na dwóch szyfrogramach ujawnia wynik XOR odpowiadających im tekstów jawnych. Może to umożliwić odzyskanie części lub całości chronionych informacji, zwłaszcza gdy zawartość jednej z wiadomości jest znana. Ponowne wykorzystanie klucza Poly1305 narusza również założenia bezpieczeństwa mechanizmu uwierzytelniania.
W celu uniknięcia powtórzenia wartości nonce można wykorzystywać liczniki wiadomości lub inne mechanizmy gwarantujące ich unikatowość. Wariant XChaCha20-Poly1305, dzięki dłuższej wartości nonce, nadaje się także do zastosowań, w których wartości te są generowane losowo.
ChaCha20 opiera się na dodawaniu liczb całkowitych, rotacjach bitowych i operacjach XOR, co ułatwia tworzenie implementacji wykonujących operacje w czasie niezależnym od tajnych danych. Odpowiedniego zabezpieczenia wymaga również implementacja Poly1305 oraz porównywanie znaczników uwierzytelniających. Porównanie, którego czas wykonania zależy od liczby zgodnych początkowych bajtów, może umożliwiać atak czasowy.
Algorytm nie zapewnia ochrony przed wszystkimi zagrożeniami związanymi z komunikacją. W szczególności samo prawidłowe uwierzytelnienie wiadomości nie zapobiega jej ponownemu przesłaniu. Ochrona przed takimi sytuacjami, określanymi jako ataki powtórzeniowe, wymaga odpowiednich mechanizmów w protokole wykorzystującym ChaCha20-Poly1305.
ChaCha20-Poly1305 zaprojektowano z myślą o wydajnym wykonywaniu operacji kryptograficznych w oprogramowaniu. ChaCha20 wykorzystuje proste operacje arytmetyczne i logiczne, natomiast Poly1305 oblicza znacznik uwierzytelniający bez konieczności stosowania szyfru blokowego do przetwarzania kolejnych fragmentów wiadomości.
Jedną z głównych alternatyw dla ChaCha20-Poly1305 jest AES-GCM, który łączy szyfr blokowy AES z mechanizmem uwierzytelniania wykorzystującym operacje w ciele Galois.
| Cecha | ChaCha20-Poly1305 | AES-GCM |
|---|---|---|
| Algorytm szyfrujący | ChaCha20, szyfr strumieniowy | AES, szyfr blokowy pracujący w trybie licznikowym |
| Mechanizm uwierzytelniania | Poly1305 | GHASH i końcowe przekształcenie za pomocą AES |
| Przyspieszenie sprzętowe | Może wydajnie działać bez specjalnych instrukcji kryptograficznych | Może korzystać m.in. z instrukcji AES-NI i przyspieszenia mnożenia wielomianów |
| Typowy profil wydajności | Korzystny na procesorach bez wyspecjalizowanego przyspieszenia AES | Korzystny na procesorach z odpowiednim przyspieszeniem sprzętowym |
Na procesorach bez wyspecjalizowanych instrukcji AES ChaCha20-Poly1305 może osiągać większą szybkość niż AES-GCM. Na urządzeniach wyposażonych w odpowiednie przyspieszenie sprzętowe przewaga ta może zanikać lub odwracać się. Rzeczywista wydajność zależy od procesora, implementacji oraz wielkości przetwarzanych wiadomości.
ChaCha20-Poly1305 jest wykorzystywany w wielu protokołach komunikacyjnych i bibliotekach kryptograficznych.
TLS_CHACHA20_POLY1305_SHA256. Sufiks SHA256 odnosi się do funkcji skrótu wykorzystywanej w protokole TLS, a nie do algorytmu uwierzytelniania danych Poly1305.chacha20-poly1305@openssh.com, stosowany do szyfrowania i uwierzytelniania pakietów SSH.Algorytm jest również dostępny w bibliotekach kryptograficznych, takich jak OpenSSL i libsodium, które udostępniają interfejsy umożliwiające jego wykorzystanie w aplikacjach.