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

Pierwotny typ danych Streaming AEAD zapewnia uwierzytelnione szyfrowanie danych strumieniowych. Jest to przydatne, gdy dane do zaszyfrowania są zbyt duże, aby przetworzyć je 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 ich lokalizacją w szyfrowanym tekście. Nie można go usunąć ani zmienić jego kolejności. Segmenty z jednego szyfrowanego tekstu nie mogą być wstawiane do innego szyfrowanego tekstu. Aby zmodyfikować istniejący tekst zaszyfrowany, cały strumień danych musi zostać ponownie zaszyfrowany.1

Odszyfrowywanie jest szybkie, ponieważ za każdym razem odszyfrowywana i uwierzytelniana jest tylko część tekstu zaszyfrowanego. Częściowe teksty jawne można uzyskać bez przetwarzania całego tekstu zaszyfrowanego.

Wdrożenia AEAD w przypadku strumieniowania spełniają definicję AEAD i są chronione przed NOAE. Mają te właściwości:

  • Tajemnica: o tekstach zwykłych wiadomo tylko ich długość.
  • Autentyczność: nie można zmienić zaszyfrowanego tekstu jawnego, który jest podstawą szyfrogramu, bez wykrycia.
  • Symetryczne: szyfrowanie tekstu zwykłego i odszyfrowywanie tekstu zaszyfrowanego odbywa się za pomocą tego samego klucza.
  • Randomizacja: szyfrowanie jest losowe. 2 wiadomości z tym samym tekstem jawnym dają różne teksty zaszyfrowane. Hakerzy nie mogą wiedzieć, który tekst zaszyfrowany odpowiada danemu tekstowi jawnemu.

Powiązane dane

Strumieniowego AEAD można używać do wiązania tekstu zaszyfrowanego z określonymi powiązanymi danymi. Załóżmy, że masz bazę danych z polami user-idencrypted-medical-history. W takiej sytuacji user-id może służyć jako powiązane dane podczas szyfrowania encrypted-medical-history. Zapobiega to przenoszeniu historii medycznej z jednego konta na drugie.

Wybieranie typu klucza

W większości przypadków zalecamy użycie AES128_GCM_HKDF_1MB. Ogólnie:

  • Szybsza opcja to AES128_GCM_HKDF_1MB (lub AES256_GCM_HKDF_1MB). Może szyfrować 264 pliki o rozmiary do 264 bajtów każdy. Podczas szyfrowania i odszyfrowywania zużywa się około 1 MB pamięci.
  • AES128_GCM_HKDF_4KB zużywa ok. 4 KB pamięci i jest dobrym rozwiązaniem, gdy Twój system nie ma zbyt dużo pamięci.
  • AES128_CTR_HMAC_SHA256_1MB (lub AES256_CTR_HMAC_SHA256_1MB) to bardziej zachowawcza opcja.

Gwarancje bezpieczeństwa

Streamingowe implementacje AEAD oferują:

  • Zabezpieczenia CCA2.
  • Siła uwierzytelniania co najmniej 80-bitowa.
  • Możliwość zaszyfrowania co najmniej 264 wiadomości3 o łącznej liczbie 251 bajtów2 . Żadna z ataków z maksymalnie 2 32 wybranymi tekstami jawnymi lub szyframi nie ma prawdopodobieństwa powodzenia większego niż 2-32.

Przykładowy przypadek użycia

Zobacz Chcę zaszyfrować duże pliki lub strumienie danych.


  1. To ograniczenie wynika ze stosowania szyfru AES-GCM. Zaszyfrowanie innego segmentu zwykłego tekstu w tej samej lokalizacji byłoby równoważne ponownemu użyciu segmentu IV, co narusza gwarancje bezpieczeństwa AES-GCM. Kolejnym powodem jest zapobieganie atakom polegającym na przywracaniu poprzednich wersji plików, w których przypadku atakujący może próbować przywrócić poprzednią wersję pliku bez wykrycia. 

  2. Obsługiwane są 232 segmenty, z czym każdy segment zawiera segment_size - tag_size bajtów tekstu zwykłego. W przypadku segmentów o wielkości 1 MB łączny rozmiar tekstu to 232 * (220-16) ≈ 251 bajtów. 

  3. Streaming AEAD staje się niepewny, gdy powtarza się kombinacja klucza wyprowadzonego (128-bitowego) i prefiksu nonce (niezależna losowa wartość 7-bajtowa). Mamy 184-bitową odporność na kolizje, co w przybliżeniu przekłada się na 264 wiadomości, jeśli chcemy, aby prawdopodobieństwo sukcesu było mniejsze niż 2-32