Strumieniowe szyfrowanie uwierzytelnione z użyciem powiązanych danych (strumieniowe szyfrowanie AEAD)

Wersja podstawowa AEAD strumieniowania zapewnia uwierzytelnione szyfrowanie strumieniowania danych. Jest to przydatne, gdy dane do szyfrowania są zbyt duże, aby można je było przetworzyć w jednym kroku. Typowe przypadki użycia obejmują szyfrowanie dużych plików lub strumieni danych na żywo.

Szyfrowanie odbywa się w segmentach, które są powiązane z lokalizacją za pomocą szyfrowanego tekstu i nie można ich usunąć ani zmienić ich kolejności. Fragmentów z jednego tekstu szyfrowania nie można wstawiać do innego tekstu szyfrowania. Aby zmodyfikować istniejący szyfrowany tekst, trzeba ponownie zaszyfrować cały strumień danych1.

Odszyfrowywanie jest szybkie, ponieważ tylko część tekstu szyfrowania jest odszyfrowywana i uwierzytelniana jednocześnie. Częściowe teksty jawne można uzyskać bez przetwarzania całego tekstu szyfrowanego.

Implementacje strumieniowania AEAD są zgodne z definicją AEAD i są zabezpieczone przez OAE2. Obejmują one te właściwości:

  • Tajność: poza długością tekstu nie są znane żadne informacje.
  • Autentyczność: nie można zmienić zaszyfrowanego tekstu jawnego, na którym opiera się tekst szyfrowany, bez wykrycia.
  • Symetryczny: szyfrowanie tekstu zwykłego i odszyfrowywania tekstu zaszyfrowanego odbywa się przy użyciu tego samego klucza.
  • Kolejność losowa: szyfrowanie jest losowe. Dwie wiadomości z tym samym tekstem jawnym generują różne teksty zaszyfrowane. Osoby przeprowadzające atak nie wiedzą, który tekst odpowiada tekstowi jawnemu.

Powiązane dane

Strumieniowe przesyłanie AEAD może służyć do powiązania tekstu szyfrowania z określonymi powiązanymi danymi. Załóżmy, że masz bazę danych z polami user-id i encrypted-medical-history. W tym scenariuszu podczas szyfrowania encrypted-medical-history można używać user-id jako danych powiązanych. Dzięki temu osoba przeprowadzająca atak nie będzie mogła przenosić historii medycznej z jednego użytkownika do drugiego.

Wybierz typ klucza

W większości przypadków zalecamy stosowanie formatu AES128_GCM_HKDF_1MB. Ogólnie:

  • AES128_GCM_HKDF_1MB (lub AES256_GCM_HKDF_1MB) to szybsza opcja. Może zaszyfrować 264 pliki, każdy o rozmiarze do 264 bajtów. Podczas szyfrowania i odszyfrowywania jest zużywanych ok. 1 MB pamięci.
  • AES128_GCM_HKDF_4KB zużywa ok. 4 KB pamięci. Jest to dobry wybór, jeśli system ma niewiele pamięci.
  • AES128_CTR_HMAC_SHA256_1MB (lub AES256_CTR_HMAC_SHA256_1MB) to bardziej zachowawcza opcja.
.

Gwarancje bezpieczeństwa

Strumieniowe wdrożenia AEAD zapewniają:

  • Zabezpieczenia CCA2.
  • Siła uwierzytelniania musi wynosić co najmniej 80 bitów.
  • możliwość zaszyfrowania co najmniej 264 wiadomości3 o łącznej wielkości 251 bajtów2 . Żaden atak z maksymalnie 232 wybranymi tekstami jawnymi lub szyfrowanymi ma prawdopodobieństwo sukcesu większe niż 2–32.

Przykład zastosowania

Zapoznaj się z artykułem Chcę szyfrować duże pliki lub strumienie danych.


  1. Przyczyną tego ograniczenia jest korzystanie z szyfru AES-GCM. Szyfrowanie innego segmentu tekstu jawnego w tej samej lokalizacji jest równoważne z ponownym wykorzystaniem IV, co narusza gwarancje bezpieczeństwa AES-GCM. Inną przyczyną jest to, że zapobiega to atakom typu „wycofanie”, w ramach których osoba przeprowadzająca atak może próbować przywrócić poprzednią wersję pliku bez wykrycia. 

  2. Obsługiwane są 232 segmenty, z których każdy zawiera segment_size - tag_size B tekstu zwykłego. W przypadku segmentów o wielkości 1 MB łączny rozmiar tekstu jawnego wynosi 232 * (220–16) ~= 251 bajtów.

  3. Strumieniowe przesyłanie AEAD staje się niezabezpieczone, gdy powtórzona zostanie kombinacja klucza pochodnego (128-bitowego) i prefiksu jednorazowego (niezależnej losowej wartości 7-bajtowej). Stosujemy 184-bitową odporność na kolizję, co daje mniej więcej 264 wiadomości, jeśli chcemy, aby prawdopodobieństwo sukcesu było mniejsze niż 2–32.