GCM (kryptografia)

GCM (od ang. Galois/Counter Mode) – tryb działania szyfrów blokowych, umożliwiający jednoczesne zapewnienie poufności i uwierzytelniania danych. Należy do metod szyfrowania uwierzytelnionego z dodatkowymi danymi uwierzytelnianymi (ang. Authenticated Encryption with Associated Data, AEAD). Najczęściej stosuje się go w połączeniu z szyfrem AES, tworząc rozwiązanie określane jako AES-GCM.

GCM łączy tryb licznikowy (CTR), wykorzystywany do szyfrowania danych, z mechanizmem uwierzytelniania opartym na działaniach w ciele skończonym GF(2128). Pozwala to na równoległe przetwarzanie bloków, a także na wykrywanie nieautoryzowanych zmian w szyfrogramie i dodatkowych danych uwierzytelnianych. Tryb wymaga szyfru blokowego o długości bloku wynoszącej 128 bitów.

Schemat działania trybu GCM oraz jego odmiany GMAC.

Zasada działania

GCM wykorzystuje dwa współpracujące mechanizmy: szyfrowanie licznikowe oraz obliczanie znacznika uwierzytelniającego.

Danymi wejściowymi operacji szyfrowania są:

Wynikiem operacji jest szyfrogram C oraz znacznik uwierzytelniający T. Odbiorca wykorzystuje klucz, wektor inicjujący, szyfrogram, dane AAD i znacznik do zweryfikowania autentyczności wiadomości. Nieprawidłowy znacznik oznacza niepowodzenie operacji uwierzytelnionego odszyfrowywania.

Szyfrowanie

GCM stosuje tryb licznikowy CTR. Kolejne wartości licznika są szyfrowane za pomocą szyfru blokowego, a uzyskane bloki są łączone z tekstem jawnym przy użyciu operacji XOR.

Poszczególne bloki mogą być przetwarzane niezależnie, co umożliwia równoległe szyfrowanie i odszyfrowywanie. Tryb nie wymaga uzupełniania tekstu jawnego do pełnych bloków, ponieważ może przetwarzać również niepełny blok końcowy.

Uwierzytelnianie

Do wyznaczenia znacznika uwierzytelniającego GCM wykorzystuje funkcję GHASH, opartą na mnożeniu elementów ciała skończonego GF(2128). Operacje wykonywane są na 128-bitowych blokach danych.

Ciało to jest skonstruowane z wykorzystaniem nierozkładalnego wielomianu:

Klucz funkcji GHASH, oznaczany przez H, jest wyznaczany przez zaszyfrowanie bloku złożonego ze 128 zer:

gdzie oznacza szyfrowanie blokowe z użyciem klucza K.

W GCM funkcja GHASH przetwarza odpowiednio uzupełnione zerami bloki AAD i szyfrogramu oraz blok zawierający długości obu ciągów. Dla kolejnych 128-bitowych bloków przetwarzanego ciągu obliczenia można przedstawić rekurencyjnie:

gdzie mnożenie odbywa się w GF(2128). Wynik GHASH jest następnie łączony operacją XOR z wynikiem zaszyfrowania bloku J0, wyznaczonego z wektora inicjującego, a otrzymany ciąg jest skracany do ustalonej długości znacznika uwierzytelniającego.

W przypadku AAD możliwe jest na przykład uwierzytelnienie nagłówka pakietu sieciowego bez szyfrowania informacji potrzebnych do jego przesłania. Zmiana zarówno zaszyfrowanej treści, jak i chronionych danych dodatkowych powoduje, z bardzo wysokim prawdopodobieństwem, niezgodność znacznika podczas weryfikacji.

Parametry

GCM jest przeznaczony do współpracy z szyframi o 128-bitowej długości bloku. Długość klucza zależy od zastosowanego szyfru blokowego. Dla AES możliwe są klucze 128, 192 i 256-bitowe, natomiast zdefiniowane w RFC 5116 algorytmy AEAD_AES_128_GCM i AEAD_AES_256_GCM korzystają odpowiednio z kluczy 128 i 256-bitowych.

Wektor inicjujący może mieć różną długość, jednak NIST zaleca stosowanie 96-bitowego IV ze względu na wydajność, prostotę i interoperacyjność. Dla takiej długości blok początkowy J0 powstaje przez dołączenie do IV ciągu 31 zer i jednego bitu o wartości 1:

gdzie oznacza konkatenację ciągów bitów. Pierwszy blok licznika używany do szyfrowania tekstu jawnego otrzymuje się przez zwiększenie o jeden 32 najmłodszych bitów bloku J0, z obliczaniem wyniku modulo 232. W przypadku innych długości IV wartość J0 wyznacza się z wykorzystaniem GHASH.

Specyfikacja NIST SP 800-38D z 2007 roku dopuszcza znaczniki uwierzytelniające o długościach 128, 120, 112, 104, 96, 64 i 32 bitów. Stosowanie dwóch najkrótszych wariantów jest obwarowane dodatkowymi ograniczeniami. W algorytmach AES-GCM określonych przez RFC 5116 stosowany jest znacznik 128-bitowy.

Norma NIST ogranicza długość tekstu jawnego szyfrowanego w pojedynczej operacji do 239 − 256 bitów. Dodatkowe ograniczenia dotyczą długości danych uwierzytelnianych, wektora inicjującego i liczby operacji wykonywanych przy użyciu tego samego klucza.

Bezpieczeństwo

Ponowne użycie wektora inicjującego

Podstawowym wymaganiem bezpieczeństwa GCM jest unikatowość wektora inicjującego dla każdego szyfrowania wykonywanego z tym samym kluczem. Ponowne użycie identycznej pary klucz–IV dla różnych wiadomości może doprowadzić do utraty zarówno poufności, jak i integralności danych.

Ze względu na zastosowanie trybu CTR ponowne wykorzystanie pary klucz–IV powoduje wygenerowanie tego samego strumienia szyfrującego. Znajomość dwóch szyfrogramów pozwala wówczas wyznaczyć XOR odpowiadających im tekstów jawnych, co może ułatwić odtworzenie ich zawartości.

Ponowne użycie IV osłabia również mechanizm uwierzytelniania GHASH i może umożliwić fałszowanie poprawnych znaczników. RFC 5116 wskazuje, że takie naruszenie zasad użycia GCM może podważyć całą ochronę integralności zapewnianą przez dany klucz.

Znacznik uwierzytelniający

Bezpieczeństwo mechanizmu uwierzytelniania zależy między innymi od długości znacznika oraz liczby wiadomości przetwarzanych przy użyciu jednego klucza. Skrócenie znacznika zwiększa ryzyko skutecznego odgadnięcia jego wartości, a prawdopodobieństwo powodzenia ataków zależy również od ilości przetwarzanych danych i liczby prób weryfikacji.

Implementacja nie powinna udostępniać odszyfrowanej wiadomości jako poprawnej przed pomyślną weryfikacją znacznika. Odrzucenie wiadomości, dla której weryfikacja się nie powiodła, stanowi część prawidłowego stosowania szyfrowania uwierzytelnionego.

Ataki powtórzeniowe

GCM nie zapewnia samodzielnie ochrony przed atakami powtórzeniowymi (ang. replay attacks). Przechwycona wiadomość zawierająca prawidłowy szyfrogram i znacznik uwierzytelniający może zostać ponownie przesłana i pomyślnie zweryfikowana przez odbiorcę.

Zapobieganie takim atakom należy do systemu lub protokołu wykorzystującego GCM. Możliwe mechanizmy obejmują wykrywanie powtórzonych wektorów inicjujących przy odszyfrowywaniu albo stosowanie numerów sekwencyjnych lub znaczników czasu jako części uwierzytelnianych danych dodatkowych. Zasady te opisano w dodatku D do NIST SP 800-38D.

Odmiany odporne na błędne użycie IV

W celu ograniczenia skutków przypadkowego ponownego użycia wektora inicjującego opracowano między innymi AES-GCM-SIV, opisany w RFC 8452 z 2019 roku. Wariant ten wykorzystuje syntetyczny wektor inicjujący i zapewnia odporność na niektóre błędy zarządzania IV, które w standardowym GCM mogą prowadzić do poważnej utraty bezpieczeństwa. AES-GCM-SIV nie jest jednak tożsamy z klasycznym AES-GCM.

Wydajność

GCM zaprojektowano z myślą o wydajnym przetwarzaniu dużych ilości danych, szczególnie w systemach, które mogą wykonywać operacje kryptograficzne równolegle.

W przeciwieństwie do trybów wykorzystujących sekwencyjne łączenie bloków, takich jak CBC, szyfrowanie w trybie licznikowym pozwala niezależnie obliczać kolejne bloki strumienia szyfrującego. Również obliczenia wykorzystywane do uwierzytelniania mogą być odpowiednio równoleglone.

GCM nadaje się do implementacji programowych i sprzętowych. W przypadku AES-GCM wydajność może być dodatkowo zwiększana za pomocą instrukcji procesora przyspieszających szyfrowanie AES oraz mnożenie wielomianów w ciele skończonym, takich jak AES-NI i PCLMULQDQ.

Zastosowania

GCM jest wykorzystywany w protokołach komunikacyjnych i rozwiązaniach wymagających jednoczesnego szyfrowania oraz weryfikacji integralności danych.

Do jego zastosowań należą:

Chociaż najczęściej spotykaną konstrukcją jest AES-GCM, tryb GCM może współpracować również z innymi 128-bitowymi szyframi blokowymi. RFC 6367 definiuje zestawy szyfrów wykorzystujące Camellię w trybie GCM dla TLS 1.2.

W RFC 8998 opisano natomiast wykorzystanie szyfru SM4 w trybie GCM jako elementu zestawu TLS_SM4_GCM_SM3 dla TLS 1.3. Dokument ma status informacyjny i nie stanowi standardu zatwierdzonego przez IETF.

GMAC

GMAC (ang. Galois Message Authentication Code) jest odmianą GCM przeznaczoną wyłącznie do uwierzytelniania danych, bez ich szyfrowania.

W GMAC część wiadomości przeznaczona do szyfrowania jest pusta, a dane podlegające uwierzytelnieniu przekazywane są jako AAD. Wynikiem działania jest znacznik uwierzytelniający, który umożliwia wykrycie zmian danych i potwierdzenie ich autentyczności przy użyciu wspólnego tajnego klucza.

GMAC korzysta z tych samych podstaw matematycznych co GCM, w tym funkcji GHASH. Podobnie jak w GCM niezbędne jest zapewnienie unikatowości wektorów inicjujących dla danego klucza.

Standaryzacja

GCM został opracowany przez Johna Viegę i Davida A. McGrewa. W czerwcu 2005 roku opublikowano RFC 4106, określający wykorzystanie AES-GCM w protokole IPsec.

W listopadzie 2007 roku amerykański National Institute of Standards and Technology opublikował specjalną publikację SP 800-38D, definiującą GCM i GMAC. Dokument określa działanie obu mechanizmów, dopuszczalne parametry oraz wymagania związane z ich bezpiecznym stosowaniem.

W marcu 2024 roku NIST ogłosił decyzję o rewizji SP 800-38D, przewidującej między innymi wycofanie obsługi znaczników krótszych niż 96 bitów oraz doprecyzowanie zasad tworzenia wektorów inicjujących.

W czerwcu 2026 roku NIST ogłosił kolejne konsultacje dotyczące rewizji standardu, obejmujące również propozycję szerszego wariantu wGCM, przeznaczonego do współpracy z szyframi o 256-bitowych blokach. Według komunikatu NIST na tym etapie prac nie był jeszcze dostępny projekt nowej wersji SP 800-38D.

Zobacz też

Przypisy

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Morris Dworkin: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC. National Institute of Standards and Technology, 2007-11-28. [dostęp 2026-10-26]. (ang.).
  2. 1 2 3 4 5 6 7 David A. McGrew: RFC 5116: An Interface and Algorithms for Authenticated Encryption. RFC Editor, 1 2008. [dostęp 2026-10-26]. (ang.).
  3. ↑ Shay Gueron, Adam Langley, Yehuda Lindell: RFC 8452: AES-GCM-SIV: Nonce Misuse-Resistant Authenticated Encryption. RFC Editor, 4 2019. [dostęp 2026-10-26]. (ang.).
  4. ↑ Shay Gueron, Michael Kounavis: Efficient implementation of the Galois Counter Mode using a carry-less multiplier and a fast reduction algorithm. Information Processing Letters, 7 2010. [dostęp 2026-10-26]. (ang.).
  5. ↑ Joseph Salowey, Abhijit Choudhury, David A. McGrew: RFC 5288: AES Galois Counter Mode (GCM) Cipher Suites for TLS. RFC Editor, 8 2008. [dostęp 2026-10-26]. (ang.).
  6. ↑ Eric Rescorla: RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3. RFC Editor, 8 2018. [dostęp 2026-10-26]. (ang.).
  7. 1 2 John Viega, David A. McGrew: RFC 4106: The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating Security Payload (ESP). RFC Editor, 6 2005. [dostęp 2026-10-26]. (ang.).
  8. ↑ 802.1AE: MAC Security (MACsec). IEEE 802.1 Working Group. [dostęp 2026-10-26]. (ang.).
  9. ↑ Satoru Kanno, Masayuki Kanda: RFC 6367: Addition of the Camellia Cipher Suites to Transport Layer Security (TLS). RFC Editor, 9 2011. [dostęp 2026-10-26]. (ang.).
  10. ↑ Paul Yang: RFC 8998: ShangMi (SM) Cipher Suites for TLS 1.3. RFC Editor, 3 2021. [dostęp 2026-10-26]. (ang.).
  11. ↑ NIST to Revise Special Publication 800-38D. National Institute of Standards and Technology, 2024-03-05. [dostęp 2026-10-26]. (ang.).
  12. ↑ Second Pre-Draft Call for Comments: GCM and GMAC Block Cipher Modes of Operation. National Institute of Standards and Technology, 2026-06-01. [dostęp 2026-10-26]. (ang.).