ου γαρ εστιν κρυπτον ο ου φανερον γενησεται ουδε αποκρυφον ο ου γνωσθησεται και εις φανερον ελθη
Wersja PL ENG Version

Kod uwierzytelniania wiadomości (ang. message authentication code - MAC)

Kod uwierzytelniania wiadomości (nazywany zwykle MAC, od angielskiego oryginału) to nieduży blok danych, który jest używany w celu uwierzytelnienia przesyłanej wiadomości. Odbiorca może sprawdzić za jego pomocą czy wiadomość nie została zmodyfikowana przez osoby trzecie.

Za pomocą skrótu MAC oznacza się również algorytmy używane w celu tworzenia bloku zawierającego kod uwierzytelnienia oraz jego późniejszego weryfikowania.

Definicja MAC zdefiniowany na (K, M, T) to para algorytmów (S, V):
  • S(k, m): zwraca kod uwierzytelnienia t należący do zbioru T
  • V(k, m, t): zwraca wartość true lub false w zależności od poprawności sprawdzanego kodu uwierzytelnienia
gdzie:
  • M to zbiór wszystkich możliwych wiadomości m,
  • K to zbiór wszystkich możliwych kluczy k,
  • T to zbiór wszystkich możliwych kodów uwierzytelnienia t

Najprostszym sposobem oznaczenia autentyczności wiadomości jest wyliczenie jej sumy kontrolnej, na przykład za pomocą algorytmu CRC, a następnie dołączenie wyniku na końcu przesyłanej wiadomości.

Podstawową wadą tej metody jest brak zabezpieczenia przed celowymi modyfikacjami w treści wiadomości. Napastnik może zmienić zawartość wiadomości, a następnie wyliczyć nową sumę kontrolną i wstawić ją na miejsce oryginalnej. Algorytmy CRC umożliwiają jedynie wykrycie losowych uszkodzeń wiadomości, nie przeprowadzonych celowo przez ewentualnego napastnika.

Kolejne akapity zaprezentują algorytmy MAC, które uniemożliwiają napastnikowi podrobienie kodów uwierzytelniających.

Algorytmy MAC bazujące na PRF

Na bazie kryptograficznie bezpiecznej funkcji pseudolosowej (PRF) można skonstruować kryptograficznie bezpieczny MAC.

Definicja Dla funkcji pseudolosowej F: (K x X) -> Y można zdefiniować parę algorytmów MAC: (S, V) jako:
  • S(k, m) := F(k, m)
  • V(k, m, t): zwraca wartość true jeśli t = F(k, m) lub false w przeciwnym wypadku
  • Należy mieć na uwadze, że zbiór Y musi być na tyle duży, żeby prawdopodobieństwo odgadnięcia wyniku funkcji F było zaniedbywalnie małe.

Przykładowo, aby zabezpieczyć 16-bajtową wiadomość można użyć algorytmu szyfrującego AES lub dowolnego innego podobnego szyfru symetrycznego operującego na 16-bajtowych blokach danych.

Poniżej zaprezentowano algorytmy MAC, które umożliwiają zabezpieczenie dłuższych wiadomości.

CBC MAC

Algorytm CBC MAC jest zbudowany na bazie funkcji pseudolosowej (dla wygody nazwanej F). Jego działanie jest oparte na tej samej idei co szyfrowanie symetryczne przeprowadzane w trybie CBC, z tą różnicą, że nie zwraca się kolejno otrzymywanych pośrednich wartości. Ponadto, po zaszyfrowaniu ostatniego bloku wiadomości wykonywane jest dodatkowe szyfrowanie aktualnego rezultatu przy użyciu drugiego sekretnego klucza.

Końcowe szyfrowanie ma na celu zapewnienie bezpieczeństwa wyliczonego kodu. Cały proces, włącznie z ostatnim dodatkowym krokiem, nosi nazwę ECBC MAC (od ang. encrypted), w odróżnieniu od części algorytmu bez ostatniego szyfrowania nazywanej raw CBC MAC.

Schemat działania ECBC MAC

W przypadku nie zastosowania ostatniego kroku algorytmu (czyli bez szyfrowania za pomocą drugiego klucza), napastnik mógłby zaatakować zabezpieczenia CBC MAC za pomocą ataku z wybranym tekstem jawnym:

  1. Napastnik wybiera wiadomość m o długości jednego bloku.
  2. Następnie napastnik uzyskuje od atakowanego systemu wartość kodu uwierzytelniającego dla tej wiadomości: t = F(k, m).
  3. Atakujący może w tym momencie określić wartość kodu uwierzytelniającego dla wiadomości m1 o długości dwóch bloków m1 = (m, t XOR m):
    rawCBC(k, m1)  = rawCBC(k, (m, t XOR m))  =  F(k, F(k, m) XOR (t XOR m))  =  F(k, t XOR (t XOR m))  =  t

CBC MAC może zabezpieczać wiadomości o dowolnej długości, od jednego do bardzo wielu bloków. Jego stosowanie jest kryptograficznie bezpieczne, o ile po zaszyfrowaniu pewnej ilości wiadomości zmienia się używany sekretny klucz. Można wykazać, że klucz przestaje być bezpieczny po liczbie wiadomości równej w przybliżeniu pierwiastkowi z liczby wszystkich możliwych wartości bloków danych.

Jeżeli ostatni blok przekazywanej wiadomości nie jest zapełniony całkowicie bitami wiadomości, należy dopełnić go pewnymi znakami, ustalonymi przez komunikujące się strony. Zwykle blok dopełnia się bitami, które jednoznacznie wskazują kiedy kończy się oryginalna wiadomość i uniemożliwiają wykorzystanie ewentualnej niejednoznaczności przez napastnika. Przykładem takiego ciągu może być jedynka, a następnie same zera aż do końca bloku (10000...). Jeśli ostatni blok zapełniony jest w takim stopniu, że nie mieści się w nim jedynka z przynajmniej jednym zerem, należy dołączyć kolejny blok i wypełnić go w całości dopełnianymi znakami.

Dla porównania, użycie samych zer wprowadzałoby niejasność gdzie kończy się transmitowana wiadomość, która może sama posiadać zera jako swoje ostatnie bity danych. Dodatkowo, wiele wiadomości o treściach różniących się jedynie ilością końcowych zer, mogłoby mieć takie same kody uwierzytelniające, co byłoby złamaniem reguł bezpieczeństwa kodowania wiadomości.

CBC MAC jest wykorzystywany w różnych aplikacjach, na przykład w systemach bankowych (standardy ANSI X9.9, X9.19, FIPS 186-3). Często jego sercem jest algorytm szyfrujący AES, którego używa się jako funkcji F.

NMAC

Algorytm NMAC (od ang. nested) jest podobny do opisanego wcześniej CBC MAC. Wykorzystuje nieco inaczej zbudowaną funkcję pseudolosową F, która w tym przypadku zwraca wartości będące poprawnymi elementami zbioru wszystkich możliwych kluczy, a nie elementami zbioru wszystkich możliwych wartości bloku wiadomości.

Podobnie jak w przypadku CBC MAC, po zaszyfrowaniu ostatniego bloku wiadomości, wykonywane jest dodatkowe szyfrowanie otrzymanego wyniku przy użyciu drugiego sekretnego klucza szyfrującego. Ponieważ wynikiem szyfrowania ostatniego bloku za pomocą funkcji F jest ciąg danych o długości klucza szyfrującego, należy go uzupełnić za pomocą pewnego stałego ciągu (ang. fix pad) do długości bloków wiadomości. NMAC jest zwykle wykorzystywany w systemach, gdzie długość bloku danych jest dużo większa od długości sekretnego klucza szyfrującego.

Schemat działania NMAC

Ostatnie szyfrowanie ma na celu zapewnienie bezpieczeństwa wyliczonego kodu wiadomości, podobnie jak w przypadku CBC MAC. Proces szyfrowania kolejnych bloków bez ostatniego kroku algorytmu NMAC nosi angielską nawę cascade.

Bez ostatniego kroku algorytmu (czyli bez szyfrowania za pomocą drugiego klucza), napastnik mógłby dołączyć do przechwyconej wiadomości z poprawnie wyliczonym kodem uwierzytelniającym, dowolną liczbę dodatkowych bloków tekstu i samodzielnie wyliczyć nowy kod. Wejściem do pierwszej nowo dodanej funkcji F byłby końcowy kod uwierzytelniający oryginalnej wiadomości.

Stosowanie NMAC jest kryptograficznie bezpieczne, o ile po zaszyfrowaniu pewnej ilości wiadomości zmienia się używany sekretny klucz. Można wykazać, że klucz przestaje być bezpieczny po liczbie wiadomości równej w przybliżeniu pierwiastkowi z liczby wszystkich możliwych wartości kluczy szyfrujących.

Algorytm NMAC obowiązują takie same reguły dotyczące dopełniania ostatnich bloków przekazywanych wiadomości, jakie mają zastosowanie do CBC MAC.

CMAC

Algorytm CMAC jest odmianą opisanego wcześniej CBC MAC. Wykorzystuje tak samo zbudowaną funkcję pseudolosową F, która zwraca wartości będącymi poprawnymi elementami zbioru wszystkich możliwych bloków danych.

Zamiast ostatniego, dodatkowego szyfrowania za pomocą drugiego klucza, w CMAC wykorzystuje się dwa dodatkowe klucze, które dodaje się do danych wejściowych do ostatniego bloku funkcji F. W zależności od tego czy ostatni blok wiadomości jest w całości zapełniony bitami danych, czy też należy go dopełnić ustalonym ciągiem znaków, używa się odpowiedniego z dwóch dodatkowych kluczy szyfrujących.

Schemat działania CMAC

Dodanie dodatkowego klucza szyfrującego w ostatnim kroku szyfrowania uniemożliwia ewentualnemu napastnikowi dołączenie dalszych bloków zmodyfikowanej wiadomości i zwalnia z konieczności stosowania dodatkowego kroku kodowania za pomocą funkcji F. Dzięki takiemu rozwiązaniu nie ma również potrzeby dodawać kolejnego bloku, aby zmieścić wcześniej ustalone bajty dopełnienia. Wystarczające będzie użycie właściwego dodatkowego klucza.

CMAC jest uznawany za bezpieczny sposób uwierzytelniania wiadomości. Posiada certyfikaty m. in. amerykańskiego instytutu NIST.

PMAC

Algorytm PMAC (od ang. parallel) może być wykonywany z użyciem wielu wątków równocześnie, w przeciwieństwie do opisanych wyżej algorytmów sekwencyjnych, w których wszystkie bloki wiadomości musiały być przetwarzane jeden po drugim.

PMAC wykorzystuje w swoim działaniu dwa sekretne klucze szyfrujące. Pierwszy z nich używany jest w funkcji P, która na wejściu przyjmuje dodatkowo jeszcze zwiększające się wartości licznika. Wyjście z funkcji P dodawane jest XOR do bloku danych, a wynik szyfrowany jest przez funkcję pseudolosową F, używającą drugiego sekretnego klucza. Funkcja P jest z założenia nieskomplikowana i działa znacznie szybciej od funkcji F.

Wyjścia ze wszystkich funkcji F oraz dane z ostatniego bloku danych (który wyjątkowo nie jest szyfrowany przez funkcję F) są sumowane XOR, a na końcu szyfrowane również za pomocą algorytmu funkcji F, z drugim sekretnym kluczem szyfrującym.

Schemat działania PMAC

Stosowanie algorytmu PMAC jest kryptograficznie bezpieczne, o ile po zaszyfrowaniu pewnej ilości wiadomości zmienia się używane sekretne klucze. Można wykazać, że klucze przestają być bezpieczne po zaszyfrowaniu liczby wiadomości równej w przybliżeniu pierwiastkowi z liczby wszystkich możliwych wartości bloków danych.

Algorytm PMAC umożliwia łatwe i szybkie uaktualnienie kodu uwierzytelniającego, w przypadku, gdy jeden z bloków wiadomości został podmieniony na nowy. Przykładowo, jeśli blok m[x] został zmieniony na m'[x], to należy jedynie przeprowadzić następujące obliczenia:
    tag'  =  F(k2(F-1(k2, tag) XOR F(k2, m[x] XOR P(k1, x)) XOR F(k2, m'[x] XOR P(k1, x)))

Jednorazowy MAC (one-time MAC)

Analogicznie do szyfrowania jednorazowego, można zdefiniować jednorazowy MAC, który zapewnia bezpieczeństwo przeciwko potencjalnym atakom i jest generalnie szybszy od algorytmów uwierzytelniania wiadomości bazujących na funkcjach PFR.

Definicja Jednorazowy MAC (one-time MAC) jest parą algorytmów (S, V):
  • S(m, k1, k2) := P(m, k1) + k2  (mod q): zwraca kod uwierzytelnienia t
  • V(m, k1, k2, t): zwraca wartość true lub false w zależności od poprawności sprawdzanego kodu uwierzytelnienia t
gdzie:
  • q to duża liczba pierwsza (rzędu 2128),
  • m to wiadomość zawierająca L bloków o długości 128 bitów,
  • k1, k2 to dwa sekretne klucze, z których każdy ma wartość z przedziału [1, q],
  • P(m, x) = m[L]⋅xL + ... + m[1]⋅x jest wielomianem stopnia L

Można wykazać, że dwie wiadomości oznakowane za pomocą tych samych kluczy szyfrujących są nierozróżnialne dla potencjalnego obserwatora.

Carter-Wegman MAC

Działanie Carter-Wegman MAC oparte jest na idei jednorazowego MAC (ang. one-time MAC), rozszerzonego o funkcję pseudolosową w celu umożliwienia wielokrotnego zastosowania tych samych sekretnych kluczy dla kolejnych wiadomości.

Definicja Mając dany bezpieczny jednorazowy MAC (S, V) zdefiniowany na zbiorach (M, KJ, T) oraz bezpieczną funkcję pseudolosową F: KF x {0,1}n->{0,1}n, można zdefiniować parę algorytmów Carter-Wegman MAC:
  • SC-W(m, kF, kJ) := (r, F(kF, r) XOR S(m, kJ)): zwraca kod uwierzytelnienia będący parą (r, tC-W)
  • VC-W(m, kJ, F(kF, r) XOR tC-W): zwraca wartość true lub false w zależności od poprawności sprawdzanego kodu uwierzytelnienia (r, tC-W)
gdzie:
  • kJ, kF to dwa sekretne klucze należące do zbiorów KJ oraz KF,
  • T to zbiór wszystkich możliwych wartości kodów uwierzytelniających algorytmu jednorazowego MAC (o długości n bitów),
  • r to losowa liczba o długości n bitów,
  • (r, tC-W) to wartość kodu uwierzytelniającego algorytmu Carter-Wegman (o długości 2n bitów)

HMAC

HMAC jest popularnym systemem uwierzytelniania wiadomości zbudowanym w podobny sposób do NMAC.

Algorytm HMAC opiera się na wykorzystaniu jednokierunkowych funkcji skrótu (czyli funkcji haszujących).

Schemat HMAC

Wartości ipad oraz opad mogą przyjmować różne wartości. Jest zalecane używanie takich wartości, aby klucz szyfrujący został zmodyfikowany w maksymalnie różny sposób w obu miejscach, w których jest wykorzystywany jako wejście do funkcji haszujących.

Zastosowanie bezpiecznej funkcji haszującej (czyli takiej, której działanie nie powoduje kolizji, to znaczy nie wylicza takich samych wartości dla różnych danych wejściowych) gwarantuje bezpieczeństwo HMAC.

HMAC jest wykorzystywany w wielu systemach, między innymi w popularnych protokołach internetowych (SSL, IPsec, SSH).