Poly1305

Poly1305 – algorytm kryptograficzny służący do tworzenia kodów uwierzytelniania wiadomości (MAC, message authentication code), opracowany przez Daniela J. Bernsteina. Wykorzystuje funkcje skrótu oparte na arytmetyce wielomianowej, wybierane za pomocą tajnego klucza. Umożliwia sprawdzanie integralności i autentyczności wiadomości przy użyciu tajnego klucza współdzielonego przez nadawcę i odbiorcę. Algorytm został opisany w pracy poświęconej konstrukcji Poly1305-AES, opublikowanej w 2005 roku.

Poly1305 przetwarza wiadomość o dowolnej długości przy użyciu jednorazowego klucza o długości 256 bitów (32 bajtów) i generuje 128-bitowy (16-bajtowy) znacznik uwierzytelniający. Sam algorytm nie szyfruje danych ani nie zapewnia ich poufności. Może natomiast współpracować z szyframi, takimi jak Salsa20 i ChaCha20, tworząc konstrukcje zapewniające zarówno poufność, jak i uwierzytelnianie danych.

Zasada działania

Poly1305 wykorzystuje arytmetykę wielomianową w ciele skończonym o charakterystyce określonej przez liczbę pierwszą . Obliczenia polegają na przetwarzaniu kolejnych fragmentów wiadomości, ich dodawaniu i mnożeniu modulo . Znacznik można obliczać na bieżąco, podczas przetwarzania kolejnych fragmentów wiadomości, bez konieczności wczytywania jej w całości do pamięci.

Klucz i parametry

Jednorazowy klucz Poly1305 składa się z dwóch 128-bitowych części, oznaczanych jako i . Obie są interpretowane jako liczby całkowite zapisane w kolejności od najmniej znaczącego bajtu (little-endian).

Przed rozpoczęciem obliczeń wartość podlega ograniczeniu określanemu w dokumentacji anglojęzycznej jako clamping. Polega ono na wyzerowaniu wybranych bitów klucza (przy numerowaniu bajtów od zera):

W rezultacie 22 spośród 128 bitów wartości zostają wyzerowane, co pozostawia dopuszczalnych wartości. Ograniczenie to jest elementem konstrukcji algorytmu i ułatwia bezpieczne oraz wydajne wykonywanie działań arytmetycznych.

Obliczanie znacznika

Wiadomość dzielona jest na kolejne bloki o długości 16 bajtów. Ostatni blok może być krótszy. Każdy blok jest interpretowany jako liczba całkowita w porządku little-endian, do której dodaje się bit o wartości 1 bezpośrednio za ostatnim bitem danych. Dla pełnego bloku odpowiada to dodaniu , natomiast dla bloku zawierającego bajtów – dodaniu .

Po oznaczeniu kolejnych wartości bloków jako wyniki kolejnych działań przechowywane są w zmiennej nazywanej akumulatorem. Początkowo ma ona wartość . Dla każdego kolejnego bloku oblicza się:

Po przetworzeniu wszystkich bloków do akumulatora dodawana jest druga część klucza, . Wynikowy kod uwierzytelniający oblicza się według wzoru:

Wartość zapisywana jest jako 16-bajtowy ciąg w porządku little-endian. Stanowi ona znacznik uwierzytelniający wiadomość. Odbiorca dysponujący właściwym kluczem może ponownie obliczyć znacznik i porównać go z wartością otrzymaną od nadawcy.

Bezpieczeństwo

Poly1305 opiera się na tzw. uniwersalnym haszowaniu, w którym funkcja skrótu jest wybierana z określonej rodziny za pomocą tajnego parametru . Przy losowym wyborze tego parametru prawdopodobieństwo uzyskania identycznego wyniku dla dwóch różnych wiadomości jest niewielkie i można je matematycznie oszacować. Takie rozwiązanie wykorzystywane jest w metodzie Wegmana–Cartera. W odróżnieniu od zwykłych funkcji skrótu, takich jak SHA-256, Poly1305 wymaga tajnego klucza, a jego podstawowym zastosowaniem jest uwierzytelnianie wiadomości, nie zaś obliczanie publicznie weryfikowalnego skrótu danych.

Podstawowym wymaganiem bezpieczeństwa jednorazowego Poly1305 jest niepowtarzanie tej samej pary podczas uwierzytelniania różnych wiadomości. Ponowne wykorzystanie całego klucza może umożliwić wyznaczenie tajnych parametrów na podstawie znaczników uwierzytelniających, a następnie fałszowanie wiadomości. Klucze muszą ponadto pozostać tajne i nieprzewidywalne.

Nie oznacza to, że sama wartość musi zawsze być zmieniana. W odpowiednio skonstruowanych schematach, takich jak Poly1305-AES, dopuszczalne jest wielokrotne wykorzystanie , pod warunkiem zastosowania nowej, nieprzewidywalnej wartości dla każdej wiadomości. W praktyce wartości jednorazowe można wyprowadzać z szyfru strumieniowego lub innej odpowiedniej funkcji kryptograficznej.

Bezpieczeństwo implementacji zależy również od odporności na ataki bocznokanałowe, w tym ataki czasowe. Operacje arytmetyczne oraz porównywanie znaczników powinny być realizowane w sposób, którego czas wykonania nie ujawnia informacji o tajnych danych. RFC 8439 wymaga porównywania znaczników w stałym czasie, a także stosowania pełnych 128-bitowych znaczników w opisanej w nim konstrukcji ChaCha20-Poly1305.

Zastosowania

Poly1305-AES

Pierwotna konstrukcja Poly1305-AES, przedstawiona przez Bernsteina w 2005 roku, łączy uniwersalną funkcję skrótu Poly1305 z szyfrem blokowym AES-128. Wykorzystuje 128-bitowy klucz AES, dodatkowy 128-bitowy parametr oraz 128-bitową wartość nonce, która nie musi pozostawać tajna.

AES służy w tej konstrukcji do przekształcenia wartości nonce w tajną wartość , wykorzystywaną podczas tworzenia znacznika. Pozwala to uwierzytelniać wiele wiadomości za pomocą tego samego długoterminowego klucza, pod warunkiem zachowania niepowtarzalności wartości nonce. Autor konstrukcji wskazał, że AES można zastąpić inną odpowiednią funkcją kryptograficzną generującą wartości jednorazowe.

XSalsa20-Poly1305

Poly1305 jest wykorzystywany w bibliotekach kryptograficznych NaCl i libsodium w połączeniu z szyfrem strumieniowym XSalsa20. Konstrukcja XSalsa20-Poly1305 zapewnia uwierzytelnione szyfrowanie danych.

XSalsa20 generuje strumień pseudolosowych bajtów, którego początkowa część służy do wyprowadzenia jednorazowego klucza Poly1305. Pozostała część strumienia wykorzystywana jest do szyfrowania wiadomości, natomiast Poly1305 uwierzytelnia szyfrogram. Rozwiązanie to stanowi podstawę interfejsu crypto_secretbox w bibliotekach NaCl i libsodium.

ChaCha20-Poly1305

Jednym z najważniejszych zastosowań Poly1305 jest konstrukcja ChaCha20-Poly1305, łącząca szyfr strumieniowy ChaCha20 z uwierzytelnianiem wiadomości. Należy ona do algorytmów uwierzytelnionego szyfrowania z danymi dodatkowymi (AEAD, authenticated encryption with associated data).

W konstrukcji opisanej w RFC 8439 jednorazowy klucz Poly1305 wyprowadzany jest z pierwszych 32 bajtów bloku wygenerowanego przez ChaCha20 przy liczniku bloku równym zero. Kolejne bloki strumienia szyfrującego służą do szyfrowania danych. Poly1305 uwierzytelnia szyfrogram oraz ewentualne dodatkowe dane, które nie są szyfrowane, ale mają podlegać ochronie integralności.

ChaCha20-Poly1305 znajduje zastosowanie między innymi w protokołach TLS, IPsec i WireGuard. Jego zastosowanie w IPsec określa RFC 7634, natomiast wykorzystanie w WireGuard opisuje dokumentacja tego protokołu. Użycie w TLS 1.2 i DTLS 1.2 opisuje RFC 7905, natomiast algorytm ChaCha20-Poly1305 został również uwzględniony w TLS 1.3.

Implementacje

Poly1305 został zaimplementowany między innymi w bibliotekach NaCl i libsodium, które udostępniają funkcje obliczania oraz weryfikacji znaczników uwierzytelniających. W libsodium jednorazowe uwierzytelnianie realizowane jest za pomocą interfejsu crypto_onetimeauth, umożliwiającego obliczenie znacznika zarówno dla całej wiadomości przekazanej jednorazowo, jak i dla wiadomości dostarczanej w kolejnych fragmentach.

Algorytm zaprojektowano z myślą o szybkim działaniu w implementacjach programowych. Wykorzystuje przede wszystkim dodawanie, mnożenie i redukcję modularną na liczbach całkowitych. Nie wymaga sprzętowej implementacji szyfru blokowego i może być efektywnie realizowany na różnych architekturach procesorów. Przy poprawnej implementacji możliwe jest również wykonywanie obliczeń w stałym czasie, ograniczające ryzyko wycieku informacji przez czas działania programu.

Zobacz też

Przypisy

  1. 1 2 3 4 Daniel J. Bernstein, The Poly1305-AES message-authentication code, [w:] H. Gilbert, H. Handschuh (red.), Fast Software Encryption, Springer, 2005, s. 32–49, DOI: 10.1007/11502760_3 (ang.).
  2. 1 2 3 4 5 6 7 8 Yoav Nir, Adam Langley, ChaCha20 and Poly1305 for IETF Protocols, RFC Editor, czerwiec 2018, DOI: 10.17487/RFC8439 [dostęp 2026-10-24] (ang.).
  3. 1 2 3 4 One-time authentication [online], libsodium [dostęp 2026-10-24] (ang.).
  4. ↑ Authenticated encryption [online], libsodium [dostęp 2026-10-24] (ang.).
  5. ↑ Yoav Nir, ChaCha20, Poly1305, and Their Use in the Internet Key Exchange Protocol (IKE) and IPsec, RFC Editor, sierpień 2015, DOI: 10.17487/RFC7634 [dostęp 2026-10-24] (ang.).
  6. ↑ Protocol & Cryptography [online], WireGuard [dostęp 2026-10-24] (ang.).
  7. ↑ Adam Langley, Wan-Teh Chang, Nikos Mavrogiannopoulos, Joachim Strombergson, Simon Josefsson, ChaCha20-Poly1305 Cipher Suites for Transport Layer Security (TLS), RFC Editor, czerwiec 2016, DOI: 10.17487/RFC7905 [dostęp 2026-10-24] (ang.).
  8. ↑ Eric Rescorla, The Transport Layer Security (TLS) Protocol Version 1.3, RFC Editor, sierpień 2018, DOI: 10.17487/RFC8446 [dostęp 2026-10-24] (ang.).

Linki zewnętrzne