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

Pierwotny strumień 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 zaszyfrowanym tekście i nie można ich usunąć ani zmienić ich kolejności. Segmenty z jednego szyfrogramu nie mogą być wstawiane do innego szyfrogramu. Aby zmodyfikować istniejący tekst zaszyfrowany, cały strumień danych musi zostać ponownie zaszyfrowany.1

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

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

  • Secrecy o tekstach zwykłych wiadomo tylko ich długość.
  • Authenticity nie można zmienić zaszyfrowanego tekstu szyfrowanego bez wykrycia.
  • Symmetric szyfrowanie i odszyfrowywanie tekstu zwykłego odbywa się przy użyciu 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

Pierwotny strumień AEAD może służyć do powiązania szyfrogramu z konkretnymi powiązanymi danymi. Załóżmy, że masz bazę danych z polami user-idencrypted-medical-history: w tym scenariuszu pole user-id może być używane jako powiązane dane podczas szyfrowania pola 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:

  • AES-GCM-HKDF
    • AES128_GCM_HKDF_1MB (lub AES256_GCM_HKDF_1MB) jest szybszą opcją. Może szyfrować 264 pliki o rozmiary do 264 bajtów każdy. Podczas procesu szyfrowania i odszyfrowywania zużywa się około 1 MB pamięci.
    • AES128_GCM_HKDF_4KB zużywa około 4 KB pamięci i jest dobrym wyborem, jeśli Twój system ma mało pamięci.
  • AES-CTR HMAC
    • 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 długości 251 bajtów2 . Żadna z ataków z maksymalnie 232 wybranymi tekstami jawnymi lub zaszyfrowanymi tekstami nie ma prawdopodobieństwa powodzenia większego niż 2-32.

Przykładowy przypadek użycia

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


  1. Powodem tego ograniczenia jest użycie szyfru AES-GCM. Zaszyfrowanie innego segmentu tekstu zwykłego w tym samym miejscu byłoby równoznaczne z ponownym użyciem IV, co narusza gwarancje bezpieczeństwa AES-GCM. Kolejnym powodem jest zapobieganie atakom polegającym na przywracaniu, w których przypadku atakujący może spróbować przywrócić poprzednią wersję pliku bez wykrycia. 

  2. Obsługiwanych jest 232 segmentów, 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