Wrocław University of Science and TechnologyDepartment of Fundamentals of Computer Science

Kryptografia II stopień

Od definicji bezpieczeństwa do konstrukcji, redukcji i publikacji naukowych.

W10a. Szyfrowanie asymetryczne: ElGamal i Cramer–Shoup

Nowa potrzeba: odbiorca udostępnił klucz publiczny i może być nieobecny. Nadawca chce zostawić mu poufną wiadomość bez wcześniejszego uzgodnienia wspólnego sekretu. To nie jest identyfikacja ani pełna wymiana AKE. Nadawca sam wykonuje Enc, a odbiorca później wykonuje Dec.

Z DH znamy już równość (ga)r=(gr)a(g^a)^r=(g^r)^a. ElGamal wykorzysta ją do utworzenia i odtworzenia maski wiadomości. W tym zastosowaniu A=gaA=g^a jest długoterminowym kluczem odbiorcy, a grg^r jednorazową częścią szyfrogramu. Najpierw zapiszmy interfejs. Dopiero potem podstawimy do niego ten rachunek.

Szyfrowanie publiczne: Setup, KeyGen, Enc, Dec

Schemat szyfrowania z kluczem publicznym zapisujemy jako krotkę:

Πenc=(Setup,KeyGen,Enc,Dec).\Pi_{\mathrm{enc}}=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Enc},\mathsf{Dec}).
Algorytm i jego wynik Wejście Co wykonuje i komu służy
pp←Setup(1λ)pp\leftarrow\mathsf{Setup}(1^\lambda) Parametr bezpieczeństwa Ustala jawne parametry całego schematu.
(pk,sk)←KeyGen(pp)(pk,sk)\leftarrow\mathsf{KeyGen}(pp) Parametry publiczne Odbiorca tworzy powiązaną parę kluczy. Udostępnia pkpk, zachowuje sksk.
C←Enc(pp,pk,m)C\leftarrow\mathsf{Enc}(pp,pk,m) Parametry, klucz publiczny odbiorcy i wiadomość m∈Mppm\in\mathcal M_{pp} Nadawca szyfruje. Wynik CC należy do określonej przez schemat przestrzeni szyfrogramów Cpp\mathcal C_{pp}.
m′←Dec(pp,sk,C)m'\leftarrow\mathsf{Dec}(pp,sk,C) Parametry, klucz tajny odbiorcy i szyfrogram Odbiorca zwraca wiadomość z Mpp\mathcal M_{pp} albo ⊥\bot, czyli odrzucenie.

Enc jest skrótem od encrypt, czyli szyfruj. Dec pochodzi od decrypt, czyli odszyfruj. Losowość jest wewnętrznym wejściem algorytmu probabilistycznego. Nie trzeba przekazywać sekretu odbiorcy ani losowych monet szyfrującego jako osobnego pola szyfrogramu. Kiedy analizujemy konkretny przebieg, jawnie nazwiemy jego losowość.

Poprawność wymaga, żeby odszyfrowanie uczciwie utworzonego szyfrogramu dawało wejściową wiadomość. Dla dopuszczalnych parametrów i pary kluczy wytworzonej przez KeyGen:

Pr⁡[Dec(pp,sk,Enc(pp,pk,m))=m]=1dla kaz˙dego m∈Mpp.\Pr[\mathsf{Dec}(pp,sk,\mathsf{Enc}(pp,pk,m))=m]=1 \quad\text{dla każdego }m\in\mathcal M_{pp}.

Prawdopodobieństwo uwzględnia losowania algorytmów. To wersja z doskonałą poprawnością, wystarczająca dla omawianych tu ElGamala i Cramera–Shoupa. Inne rodziny mogą dopuszczać jawnie ograniczone prawdopodobieństwo błędu. Poprawność nie mówi jeszcze nic o tym, czy przeciwnik potrafi odczytać wiadomość. To osobne wymaganie bezpieczeństwa.

Program nadawcy
pp,pk,mpp,pk,m
Lokalne Enc
C←Enc(pp,pk,m)C\leftarrow\mathsf{Enc}(pp,pk,m)
wywołaniePrzesyłane lub zapisane dane
CC
klucz tajny nie jest komunikatemUrządzenie odbiorcy: Dec
m′←Dec(pp,sk,C)m\prime\leftarrow\mathsf{Dec}(pp,sk,C)
Wynik dla aplikacjiwiadomość albo odrzucenieOdczyt w późniejszym czasieTylko odbiorca ma właściwy sekret.Nadawca nie uczestniczy w Dec.
W Enc klucz publiczny należy do odbiorcy. Wiadomość przekazuje nadawca, a losowość dobiera algorytm. Dec wykonuje później odbiorca ze swoim sekretem. Schemat nie wymaga jego obecności podczas szyfrowania.

Granica uprawnień: klucz publiczny pozwala każdemu zaszyfrować wiadomość do tego odbiorcy. Dlatego samo poprawne odszyfrowanie nie ustala nadawcy. Klucz tajny jest argumentem lokalnej procedury Dec i nie jest częścią przesyłanych danych. Wiarygodne pozyskanie pkpk odbiorcy jest konieczne, aby nie zaszyfrować wiadomości do klucza podstawionego przez przeciwnika.

ElGamal

ElGamal szyfruje element grupy za pomocą wspólnej maski, którą nadawca wylicza z klucza publicznego odbiorcy i własnej losowości. Odbiorca odtwarza tę maskę za pomocą klucza tajnego. Zapiszmy cały schemat ΠEG=(Setup,KeyGen,Enc,Dec)\Pi_{\mathrm{EG}}=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Enc},\mathsf{Dec}), zgodnie z definicją szyfrowania.

Symbol Typ i rola Kto go zna
pp=(G,q,g)pp=(G,q,g) Opis grupy pierwszego rzędu qq, generatora, działań i kodowania Wszyscy
sk=a∈Zqsk=a\in\mathbb Z_q Klucz tajny odbiorcy, skalar Odbiorca
pk=A=ga∈Gpk=A=g^a\in G Klucz publiczny odbiorcy, element grupy Wszyscy, także przeciwnik
r∈Zqr\in\mathbb Z_q Świeża losowość pojedynczego szyfrowania, nie klucz długoterminowy Szyfrujący
m∈Gm\in G Wiadomość w wersji grupowej Nadawca, po odszyfrowaniu także odbiorca
C=(u,v)∈G2C=(u,v)\in G^2 Przesyłany szyfrogram Może być jawny

Małe aa jest sekretem. Duże AA jest publiczne. Litery nie są zamienne. Element grupy AA nie jest tym samym co jego wykładnik aa.

Szyfrowanie ElGamala: algorytmy i przepływ

Klucz A należy do odbiorcy. Wiadomość m jest elementem G. Szyfrowanie dowolnych bajtów wymaga osobnego kodowania lub konstrukcji hybrydowej.

Π=(Setup,KeyGen,Enc,Dec)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Enc},\mathsf{Dec})
Setup(1λ)\mathsf{Setup}(1^\lambda)⟶pp\longrightarrow pp
pp=(G,q,g)pp=(G,q,g)
∣G∣=q,G=⟨g⟩|G|=q,\quad G=\langle g\rangle

Rząd q jest liczbą pierwszą. Ustal kodowania i działania grupy. Dodatkowe funkcje wskazano przy konstrukcji.

KeyGen(pp)\mathsf{KeyGen}(pp)⟶(A,a)\longrightarrow (A,a)
a←$Zq,A=gaa\overset{\$}{\leftarrow}\mathbb Z_q,\quad A=g^a

Profil z całym ciałem, zgodnie z opisem konstrukcji. Sekret a pozostaje u właściciela. Odbiorca uwierzytelnia publiczny A.

Enc(pp,A,m)\mathsf{Enc}(pp,A,m)⟶C=(u,v)\longrightarrow C=(u,v)
r←$Zqr\overset{\$}{\leftarrow}\mathbb Z_q
u=gr,v=m⋅Aru=g^r,\quad v=m\cdot A^r
Dec(pp,a,(u,v))\mathsf{Dec}(pp,a,(u,v))⟶m albo ⊥\longrightarrow m\text{ albo }\bot
m=v⋅(ua)−1m=v\cdot(u^a)^{-1}

Odrzuć błędny format i elementy poza grupą. Sama zmiana poprawnego elementu nie musi powodować błędu.

Szyfrowanie ElGamala: czynności i komunikatyNadawcaOdbiorcaEnc: świeża maskaDwa elementy grupyDec: usuń maskę
Tylko ta strona zna a.

Szyfrowanie ElGamala

Nadawca: pp,A,mpp,A,m

Odbiorca: pp,app,a

  1. Nadawca, Enc: świeża maska: r←$Zq,u=grr\overset{\$}{\leftarrow}\mathbb Z_q,\quad u=g^r v=m⋅Arv=m\cdot A^r
  2. Nadawca → Odbiorca: C=(u,v)C=(u,v) Dwa elementy grupy
  3. Odbiorca, Dec: usuń maskę: m=v⋅(ua)−1m=v\cdot(u^a)^{-1} Tylko ta strona zna a.
Losowość i wiadomość nie są osobnymi polami komunikatu. Równanie deszyfrowania nie zapewnia integralności.

Setup: parametry ElGamala

Wejście: 1λ1^\lambda. Wyjście: publiczne pp=(G,q,g)pp=(G,q,g) z opisem kodowania i działań. Algorytm dobiera grupę cykliczną pierwszego rzędu qq oraz generator gg. Do poniższego argumentu poufności potrzebujemy rodziny grup, w której DDH jest trudne. Sama możliwość wykonania potęgowania nie zapewnia tego założenia.

KeyGen: klucze odbiorcy

Wejście: pppp. Odbiorca losuje a←$Zqa\overset{\$}{\leftarrow}\mathbb Z_q, oblicza A=gaA=g^a i zwraca (pk,sk)=(A,a)(pk,sk)=(A,a). Klucz publiczny udostępnia w sposób, który pozwala przypisać go właściwemu odbiorcy. Klucz tajny zachowuje. Parametry pppp są dostępne przy obu kluczach.

Enc: szyfrowanie ElGamala

Wejście: pppp, publiczny klucz A∈GA\in G i wiadomość m∈Gm\in G. Algorytm losuje świeże r←$Zqr\overset{\$}{\leftarrow}\mathbb Z_q i oblicza:

u=gr,v=m⋅Ar,C=(u,v).u=g^r,\qquad v=m\cdot A^r,\qquad C=(u,v).

Wyjście: C∈G2C\in G^2. Nadawca przesyła dwa elementy grupy. Nie przesyła osobno rr ani maski ArA^r. Nie potrzebuje aa. Wiadomość jest tu elementem grupy, a nie dowolnym plikiem. Kodowanie lub konstrukcję hybrydową trzeba określić osobno.

Dec: odszyfrowanie ElGamala

Wejście: pppp, tajny klucz aa i szyfrogram CC. Jeśli nie można odczytać kanonicznie zakodowanej pary (u,v)∈G2(u,v)\in G^2, zwracamy ⊥\bot. W przeciwnym razie obliczamy:

m′=v⋅(ua)−1.m'=v\cdot(u^a)^{-1}.

Wyjście: odzyskany element m′∈Gm'\in G. Potęga uau^a odtwarza maskę. Odwrotność w grupie ją usuwa. Kontrola typu nie jest kontrolą autentyczności. W podstawowym ElGamalu każda poprawnie zakodowana para elementów grupy daje jakąś wiadomość.

Poprawność i przykład liczbowy

Podstawiamy wyniki Enc do wejścia Dec:

m′=m⋅Ar⋅(ua)−1=m⋅ga⋅r⋅(gr⋅a)−1=m.m'=m\cdot A^r\cdot(u^a)^{-1} =m\cdot g^{a\cdot r}\cdot(g^{r\cdot a})^{-1}=m.

Do małego rachunku wybierzmy podgrupę rzędu q=23q=23 modulo 4747, z generatorem g=2g=2. Dla a=7a=7 klucz publiczny to A=34A=34. Szyfrujemy m=9m=9 z r=9r=9. Otrzymujemy u=42u=42, maskę Ar=36A^r=36 i v=42v=42. Odbiorca oblicza ua=36u^a=36 oraz 36−1=17mod4736^{-1}=17\bmod47. Stąd m′=42⋅17mod47=9m'=42\cdot17\bmod47=9. Liczby są celowo małe, więc nie zapewniają bezpieczeństwa.

W tej wersji definicji skalary losujemy z całego Zq\mathbb Z_q, także z możliwością wyniku 0. Zdarzenia a=0a=0 lub r=0r=0 są degeneracjami, każda o prawdopodobieństwie 1/q1/q. Profile wykluczające zero powinny określać to jawnie. Równanie poprawności działa również dla zera.

Bezpieczeństwo: od CPA do ataku CCA

Redukcja DDH dostaje (g,A,U,T)(g,A,U,T) i odpowiada na wyzwanie przez (U,mb⋅T)(U,m_b\cdot T). Prawdziwe DH daje właściwy szyfrogram. Losowe TT ukrywa mbm_b doskonale. Inne szyfrowania wykonujemy kluczem publicznym. To argument IND-CPA.

Nie jest to IND-CCA2. Zmieniamy wyzwanie na (u,v⋅Δ)(u,v\cdot\Delta) dla Δ≠1\Delta\ne1. Wyrocznia deszyfrowania nowego szyfrogramu zwraca mb⋅Δm_b\cdot\Delta, skąd odzyskujemy mbm_b. Potrzebna jest konstrukcja z dowodem dla silniejszego modelu, nie samodzielnie dopisana suma kontrolna.

Ten sam szyfr, silniejszy przeciwnik

Rozpiszmy tę zmianę modelu. W CPA przeciwnik może uzyskiwać szyfrowania wybranych wiadomości. W szyfrowaniu publicznym i tak może je obliczać. W CCA otrzymuje dodatkowo dostęp do deszyfrowania innych szyfrogramów. W wersji adaptacyjnej CCA2 może pytać również po otrzymaniu wyzwania. Jedyny zakaz bezpośredni dotyczy jego deszyfrowania. Bez niego gra byłaby trywialna.

  1. Przeciwnik wybiera różne wiadomości m0,m1∈Gm_0,m_1\in G.
  2. Otrzymuje wyzwanie (u,v)(u,v), będące szyfrowaniem jednej z nich.
  3. Wybiera Δ≠1G\Delta\ne1_G i pyta o (u,v⋅Δ)(u,v\cdot\Delta). To inny szyfrogram, więc zakaz go nie obejmuje.
  4. Dostaje mb⋅Δm_b\cdot\Delta, mnoży przez Δ−1\Delta^{-1} i porównuje z wiadomościami.
  5. Zgadnięty bit jest poprawny. Nie obliczył ani aa, ani rr.
Przeciwnikotrzymał wyzwanie (u, v)Wyrocznia deszyfrującaodrzuca tylko wyzwanie
(u,v⋅Δ)(u,v\cdot\Delta)
mb⋅Δm_b\cdot\Delta
Odzyskana wiadomośćbez odzyskiwania klucza
mb=(mb⋅Δ)⋅Δ−1m_b=(m_b\cdot\Delta)\cdot\Delta^{-1}
Dla niejednostkowego Δ szyfrogram jest inny od wyzwania. Nowe uprawnienie deszyfrowania pozwala przeprowadzić atak niedostępny w CPA.

Demonstrator ataku na ElGamala

Demonstrator losuje niezerowe aa i rr, aby nie zaczynać od degeneracji. Rysunek przedstawia szyfrogram (U,V)=(gr,M⋅Ar)(U,V)=(g^r,M\cdot A^r). Dla niejednostkowego Δ\Delta przeciwnik przesyła (U,V⋅Δ)(U,V\cdot\Delta), otrzymuje M⋅ΔM\cdot\Delta i odzyskuje MM przez pomnożenie przez Δ−1\Delta^{-1}. Małą wiadomość liczbową kodujemy jako M=gmM=g^m. Wielkie U,V,MU,V,M oznaczają elementy grupy, a nie skalary.

Realizacja na krzywej. W zapisie addytywnym szyfrogram to (U,V)=(r⋅P2,M+r⋅A)(U,V)=(r\cdot P_2,M+r\cdot A). Przeciwnik dodaje niezerowy punkt Δ\Delta do drugiego składnika. Wyrocznia zwraca M+ΔM+\Delta, więc odjęcie znanego punktu odzyskuje MM. Tylko wyrocznia ma dostęp do sekretu aa. Obliczenie odzyskujące korzysta z jej odpowiedzi i publicznego Δ\Delta.

ElGamal: policz atak CCA

MCL WebAssembly. Wiadomość jest elementem grupy. Mały indeks m służy do jej odwracalnego kodowania, nie jest haszem do grupy ani formatem szyfrowania plików.

Uprawnienie przeciwnika
ElGamal: policz atak CCA1. Wyzwanie
U=gr,V=M⋅ArU=g^r,\quad V=M\cdot A^r
oczekuje
2. Inny szyfrogram
(U,V⋅Δ)(U,V\cdot\Delta)
oczekuje
3. Zapytanie o deszyfrowanie
(V⋅Δ)⋅U−a=M⋅Δ(V\cdot\Delta)\cdot U^{-a}=M\cdot\Delta
oczekuje
4. Odzyskanie bez sekretnego klucza
(M⋅Δ)⋅Δ−1=M(M\cdot\Delta)\cdot\Delta^{-1}=M
oczekuje

Zapis i obliczenia. Wzory schematu są multiplikatywne. MCL realizuje je na krzywej. Generator gg odpowiada punktowi P2P_2. W grupach punktów iloczyn oznacza dodawanie, potęga oznacza mnożenie punktu przez skalar, a odwrotność oznacza punkt przeciwny. Nie potęgujemy współrzędnych. Ten rachunek nie używa pairingu.

Gotowe.

Obliczenia MCL na krzywej. Poniżej pokazujemy konkretne operacje biblioteki. Grupy punktów zapisujemy addytywnie.

  1. Wyzwanie

    Oczekuje.

  2. Inny szyfrogram

    Oczekuje.

  3. Zapytanie o deszyfrowanie

    Oczekuje.

  4. Odzyskanie bez sekretnego klucza

    Oczekuje.

Sprawdź: Przełącz dostęp do wyroczni. Wskaż pierwszy krok, którego przeciwnik nie może już wykonać.

Atak nie przeczy argumentowi DDH dla CPA. Używa usługi, której tamten argument nie obsługuje. W prawdziwym systemie taki dostęp może wynikać z interfejsu odszyfrowywania, przetwarzania zmodyfikowanych rekordów albo ujawniających informacji błędów. Nie każda aplikacja daje pełną wyrocznię deszyfrującą, ale model CCA celowo bada mocną gwarancję.

Rerandomizacja daje pokrewny przykład: (u⋅gt,v⋅At)(u\cdot g^t,v\cdot A^t) szyfruje tę samą wiadomość. Jeżeli wynik jest inny niż wyzwanie, samo zakazanie identycznego szyfrogramu nie zamyka ataku. Poufność wobec aktywnego przetwarzania wymaga kontroli takich przekształceń.

Naprawa wymaga zmiany kontraktu, np. użycia sprawdzonej konstrukcji szyfrowania uwierzytelnionego lub hybrydowego z odpowiednim twierdzeniem. Zwykły publiczny hasz dołączony do szyfrogramu nie pomaga, bo przeciwnik przeliczy go po modyfikacji.

Cramer–Shoup

Nie każda przekształcalność jest błędem. W ElGamalu publiczna rerandomizacja pozwala zmienić wygląd szyfrogramu bez poznania wiadomości. Jest użyteczna np. w odpowiednio zabezpieczonych sieciach miksujących. Mnożenie dwóch szyfrogramów daje z kolei szyfrogram iloczynu ich wiadomości. Takie własności projektuje się świadomie wraz z ograniczeniami dostępu do deszyfrowania. Nie są zgodne z obietnicą IND-CCA2 dla tego samego, swobodnie przekształcalnego formatu.

Cramer–Shoup zmienia tę obietnicę. Nadal każdy może szyfrować kluczem publicznym, ale odbiorca najpierw sprawdza algebraiczne powiązanie wszystkich składników. Nie wydaje częściowo odszyfrowanej wiadomości po nieudanej kontroli. Opiszemy wersję CS1 z pracy Cramera i Shoupa Design and Analysis of Practical Public-Key Encryption Schemes Secure against Adaptive Chosen Ciphertext Attack, §6.1. Używa ona dwóch skalarów maskujących. To wariant tej samej rodziny co pierwotny schemat z CRYPTO 1998. Publikacja i algorytmy.

CS1
Cramer–Shoup, construction 1. Oznaczenie pierwszej konstrukcji Cramera–Shoupa w omawianym źródle.

Formalnie ΠCS1=(Setup,KeyGen,Enc,Dec)\Pi_{\mathrm{CS1}}=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Enc},\mathsf{Dec}). Rozdzielamy przygotowanie publicznych parametrów od generowania sekretu. W źródle obie czynności znajdują się w algorytmie generowania kluczy. Ten podział służy opisowi i nie zmienia poniższych równań.

Cramer–Shoup CS1: algorytmy i przepływ

Wersja CS1 z sześcioma skalarami klucza. Wiadomość należy do G. Nie mieszamy jej z wariantem o pięciu skalarach.

Π=(Setup,KeyGen,Enc,Dec)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Enc},\mathsf{Dec})
Setup(1λ)\mathsf{Setup}(1^\lambda)⟶pp\longrightarrow pp
pp=(G,q,g1,g2,κ)pp=(G,q,g_1,g_2,\kappa)

G ma pierwszy rząd q. Ustal dwa generatory i rodzinę haszy TCR. Publiczny κ wybiera funkcję z tej rodziny. Jej wymaganie bezpieczeństwa rozwijamy po diagramie.

TCR
target collision resistance. Odporność na kolizję z zadanym celem.
KeyGen(pp)\mathsf{KeyGen}(pp)⟶(pk,sk)\longrightarrow (pk,sk)
sk=(x1,x2,y1,y2,z1,z2)←$Zq6sk=(x_1,x_2,y_1,y_2,z_1,z_2)\overset{\$}{\leftarrow}\mathbb Z_q^6
pk=(c,d,h)pk=(c,d,h)
c=g1x1⋅g2x2,d=g1y1⋅g2y2c=g_1^{x_1}\cdot g_2^{x_2},\quad d=g_1^{y_1}\cdot g_2^{y_2}
h=g1z1⋅g2z2h=g_1^{z_1}\cdot g_2^{z_2}
Enc(pp,pk,m)\mathsf{Enc}(pp,pk,m)⟶C=(u1,u2,w,v)\longrightarrow C=(u_1,u_2,w,v)
r←$Zq,u1=g1r,u2=g2rr\overset{\$}{\leftarrow}\mathbb Z_q,\quad u_1=g_1^r,\quad u_2=g_2^r
w=m⋅hr,α=ℋκ(u1,u2,w)w=m\cdot h^r,\quad\alpha=\mathcal H_\kappa(u_1,u_2,w)
v=cr⋅dr⋅αv=c^r\cdot d^{r\cdot\alpha}
Dec(pp,sk,C)\mathsf{Dec}(pp,sk,C)⟶m albo ⊥\longrightarrow m\text{ albo }\bot
α=ℋκ(u1,u2,w)\alpha=\mathcal H_\kappa(u_1,u_2,w)
v=?u1x1+α⋅y1⋅u2x2+α⋅y2v\stackrel{?}{=}u_1^{x_1+\alpha\cdot y_1}\cdot u_2^{x_2+\alpha\cdot y_2}
m=w⋅(u1z1⋅u2z2)−1m=w\cdot(u_1^{z_1}\cdot u_2^{z_2})^{-1}

Najpierw format i podgrupa. Niezgodny test oznacza ⊥ bez obliczania wiadomości.

Cramer–Shoup CS1: czynności i komunikatyNadawcaOdbiorcaEnc: wkłady i maskowanieEnc: zwiąż wszystkie składnikiCztery elementy grupyDec: kontrola przed odczytem
Błąd: zwróć ⊥.
Dec: odczyt po akceptacji

Cramer–Shoup CS1

Nadawca: pp,pk,mpp,pk,m

Odbiorca: pp,skpp,sk

  1. Nadawca, Enc: wkłady i maskowanie: u1=g1r,u2=g2ru_1=g_1^r,\quad u_2=g_2^r w=m⋅hrw=m\cdot h^r
  2. Nadawca, Enc: zwiąż wszystkie składniki: α=ℋκ(u1,u2,w)\alpha=\mathcal H_\kappa(u_1,u_2,w) v=cr⋅dr⋅αv=c^r\cdot d^{r\cdot\alpha}
  3. Nadawca → Odbiorca: (u1,u2,w,v)(u_1,u_2,w,v) Cztery elementy grupy
  4. Odbiorca, Dec: kontrola przed odczytem: α=ℋκ(u1,u2,w)\alpha=\mathcal H_\kappa(u_1,u_2,w) v=?u1x1+α⋅y1⋅u2x2+α⋅y2v\stackrel{?}{=}u_1^{x_1+\alpha\cdot y_1}\cdot u_2^{x_2+\alpha\cdot y_2} Błąd: zwróć ⊥.
  5. Odbiorca, Dec: odczyt po akceptacji: m=w⋅(u1z1⋅u2z2)−1m=w\cdot(u_1^{z_1}\cdot u_2^{z_2})^{-1}
W odróżnieniu od surowego ElGamala kontrola szyfrogramu poprzedza ujawnienie wiadomości.

Setup: parametry Cramera–Shoupa

Wejście: 1λ1^\lambda. Wyjście: pp=(G,q,g1,g2,κ)pp=(G,q,g_1,g_2,\kappa) wraz z rodziną haszy, kodowaniem i działaniami grupy. Wszystkie te parametry są jawne.

Pracujemy w grupie GG pierwszego rzędu qq, w której zakładamy trudność DDH. Wybieramy niezależne generatory g1,g2∈Gg_1,g_2\in G, różne od elementu neutralnego. Ich indeksy numerują bazy tej samej grupy, nie dwie grupy pairingu. Przeciwnik nie dostaje logarytmu jednej bazy względem drugiej.

Publiczny parametr κ\kappa wybiera funkcję haszującą ℋκ:G3→Zq\mathcal H_\kappa:G^3\to\mathbb Z_q. Haszowanie obejmuje jednoznaczne kodowanie uporządkowanej trójki. To hash do skalaru, a nie ℋG1\mathcal H_{G_1} mapujący do punktu. W twierdzeniu potrzebna jest odporność na kolizję z zadanym celem, określona w źródle jako TCR (target collision resistance). W definicji z §5 źródła cel jest jednostajną trójką z G3G^3, losowaną niezależnie od parametru κ\kappa. Przeciwnik dostaje cel i parametr. Ma znaleźć inną trójkę z tym samym haszem. Nie wybiera obu wejść. To konkretny wariant definicji, a nie wymóg dla każdego dowolnie wybranego celu. Pełna odporność na kolizje jest silniejszym wystarczającym wymaganiem. Nie zastępujemy tych własności samym stwierdzeniem „użyto funkcji hashującej”.

Parametr κ\kappa jest losowany zgodnie z opisem rodziny haszy, niezależnie od skalarów klucza. Nie jest tajnym kluczem MAC. Zestaw parametrów dobieramy uczciwie, zgodnie z modelem konstrukcji.

KeyGen: sześć sekretów i klucz publiczny

Wejście: pppp. Odbiorca losuje niezależnie sześć skalarów x1,x2,y1,y2,z1,z2←$Zqx_1,x_2,y_1,y_2,z_1,z_2\overset{\$}{\leftarrow}\mathbb Z_q i oblicza:

c=g1x1⋅g2x2,d=g1y1⋅g2y2,h=g1z1⋅g2z2.c=g_1^{x_1}\cdot g_2^{x_2},\qquad d=g_1^{y_1}\cdot g_2^{y_2},\qquad h=g_1^{z_1}\cdot g_2^{z_2}.

Wyjście: para (pk,sk)(pk,sk), gdzie pk=(c,d,h)pk=(c,d,h) i sk=(x1,x2,y1,y2,z1,z2)sk=(x_1,x_2,y_1,y_2,z_1,z_2). Oba klucze są używane razem z pppp. Pełny publiczny opis zawiera więc również grupę oraz (g1,g2,κ)(g_1,g_2,\kappa). Składnik hh służy maskowaniu wiadomości. Składniki c,dc,d służą kontroli spójności. Klucz publiczny odbiorcy musi pochodzić z zaufanego źródła, podobnie jak w innych systemach szyfrowania publicznego.

Enc: szyfrowanie Cramera–Shoupa

Wejście: pppp, klucz publiczny pk=(c,d,h)pk=(c,d,h) i wiadomość m∈Gm\in G. Nadawca losuje świeże r←$Zqr\overset{\$}{\leftarrow}\mathbb Z_q. Kolejność jest istotna:

  1. Losowość w dwóch bazach: u1=g1ru_1=g_1^r, u2=g2ru_2=g_2^r. Oba elementy powstają z tego samego rr.
  2. Ukrycie wiadomości: w=m⋅hrw=m\cdot h^r.
  3. Związanie zawartości: α=ℋκ(u1,u2,w)\alpha=\mathcal H_\kappa(u_1,u_2,w).
  4. Znacznik kontroli: v=cr⋅dr⋅αv=c^r\cdot d^{r\cdot\alpha}.

Wyjście: szyfrogram C=(u1,u2,w,v)∈G4C=(u_1,u_2,w,v)\in G^4. Zauważmy, że nadawca oblicza vv z klucza publicznego i własnego rr. Nie potrzebuje sześciu sekretów odbiorcy.

Dec: kontrola i odszyfrowanie

Wejście: pppp, klucz tajny sk=(x1,x2,y1,y2,z1,z2)sk=(x_1,x_2,y_1,y_2,z_1,z_2) i szyfrogram CC. Wyjście: element m∈Gm\in G albo ⊥\bot.

Odbiorca sprawdza format, kanoniczne kodowanie i przynależność elementów do właściwej grupy. Następnie sam oblicza α\alpha z odebranej trójki. Nie ufa haszowi dołączonemu przez nadawcę. Sprawdza:

v=?u1x1+α⋅y1⋅u2x2+α⋅y2.v\stackrel{?}{=}u_1^{x_1+\alpha\cdot y_1}\cdot u_2^{x_2+\alpha\cdot y_2}.

Niezgodność oznacza ⊥\bot, czyli odrzucenie bez wiadomości. Dopiero po zgodności wolno obliczyć:

B=u1z1⋅u2z2,m=w⋅B−1.B=u_1^{z_1}\cdot u_2^{z_2},\qquad m=w\cdot B^{-1}.

Poprawność i demonstrator

Dlaczego uczciwe szyfrowanie przechodzi kontrolę? Rozpiszmy prawą stronę, korzystając wyłącznie z praw działań w grupie:

u1x1+α⋅y1⋅u2x2+α⋅y2=(g1x1⋅g2x2)r⋅(g1y1⋅g2y2)r⋅α=cr⋅dr⋅α=v,B=(g1z1⋅g2z2)r=hr.\begin{aligned} u_1^{x_1+\alpha\cdot y_1}\cdot u_2^{x_2+\alpha\cdot y_2} &=(g_1^{x_1}\cdot g_2^{x_2})^r\cdot(g_1^{y_1}\cdot g_2^{y_2})^{r\cdot\alpha}\\ &=c^r\cdot d^{r\cdot\alpha}=v,\\ B&=(g_1^{z_1}\cdot g_2^{z_2})^r=h^r. \end{aligned}

Usuwamy więc dokładnie tę maskę, którą dodał nadawca. Jest to dowód poprawności, jeszcze nie dowód bezpieczeństwa.

Cramer–Shoup · co dzieje się po zmianie szyfrogramu?

Obliczenia w G1G_1 BLS12-381, MCL WebAssembly i SHA-256. W obu kolumnach odbiorca wykonuje tę samą kontrolę. Oryginalny przebieg pozostaje widoczny.

Operacja na prawej kolumnie

Zmieniamy tylko składnik ukrywający wiadomość. Znacznik pozostaje oryginalny.

Szyfrogram oryginalny

hash trzech pólzwiąż z vdecyzja 1 · Odebrany szyfrogram
C=(u1,u2,w,v)C=(u_1,u_2,w,v)
2 · Hash do skalaru
α=ℋκ(u1,u2,w)\alpha=\mathcal H_\kappa(u_1,u_2,w)
3 · Kontrola z kluczem sekretnym
v=?u1x1+α⋅y1⋅u2x2+α⋅y2v\stackrel{?}{=}u_1^{x_1+\alpha\cdot y_1}\cdot u_2^{x_2+\alpha\cdot y_2}
4 · Wiadomość albo odrzucenie
m=w⋅(u1z1⋅u2z2)−1lub⊥m=w\cdot(u_1^{z_1}\cdot u_2^{z_2})^{-1}\quad\text{lub}\quad\bot
Hash, początek zapisu hex
Oczekuje
Równanie kontrolne
Oczekuje
Odczytana liczba
Oczekuje

Szyfrogram po operacji

hash trzech pólzwiąż z vdecyzja 1 · Odebrany szyfrogram
C=(u1,u2,w,v)C=(u_1,u_2,w,v)
2 · Hash do skalaru
α=ℋκ(u1,u2,w)\alpha=\mathcal H_\kappa(u_1,u_2,w)
3 · Kontrola z kluczem sekretnym
v=?u1x1+α⋅y1⋅u2x2+α⋅y2v\stackrel{?}{=}u_1^{x_1+\alpha\cdot y_1}\cdot u_2^{x_2+\alpha\cdot y_2}
4 · Wiadomość albo odrzucenie
m=w⋅(u1z1⋅u2z2)−1lub⊥m=w\cdot(u_1^{z_1}\cdot u_2^{z_2})^{-1}\quad\text{lub}\quad\bot
Hash, początek zapisu hex
Oczekuje
Równanie kontrolne
Oczekuje
Odczytana liczba
Oczekuje

Przygotowanie MCL WebAssembly…

Porównanie z ElGamalem pojawi się po obliczeniu wyniku.

Pełne wartości obliczeń

Kanoniczne kodowania punktów i skalary w zapisie szesnastkowym. To klucze testowe. Porównywane są całe punkty, nie skróty etykiet.

Stan
Brak obliczeń.

Dlaczego modyfikacja z ataku na ElGamala już nie wystarcza

Zamieńmy tylko ww na w′=w⋅Δw'=w\cdot\Delta, gdzie Δ≠1G\Delta\ne1_G. Odbiorca wyznaczy nowy α′=ℋκ(u1,u2,w′)\alpha'=\mathcal H_\kappa(u_1,u_2,w'). Stary znacznik był związany z α\alpha, więc z reguły nie spełni nowego równania. Samo przeliczenie publicznego hasza nie daje przeciwnikowi nowego znacznika.

Można próbować subtelniej: przemnożyć u1,u2,wu_1,u_2,w odpowiednio przez g1t,g2t,htg_1^t,g_2^t,h^t i obliczyć α′\alpha' dla nowej trójki. Prosta aktualizacja znacznika do v⋅ct⋅dt⋅α′v\cdot c^t\cdot d^{t\cdot\alpha'} nadal pomija czynnik:

dr⋅(α′−α).d^{r\cdot(\alpha'-\alpha)}.

Przeciwnik zna własne tt, lecz nie zna losowości rr zaatakowanego szyfrogramu. To pomaga zrozumieć rolę hasza, ale nie jest samodzielnym dowodem odporności na wszystkie ataki. Szczególne przypadki i prawdopodobieństwa obsługuje redukcja.

Nowe, poprawne szyfrowanie innej wiadomości powinno natomiast przejść kontrolę. Akceptacja nie oznacza uwierzytelnienia nadawcy. Każdy zna klucz publiczny. Schemat nie wykrywa też samodzielnie ponownego przesłania identycznego szyfrogramu. To osobne cele protokołu.

Bezpieczeństwo: od DDH do IND-CCA2

W grze przeciwnik wybiera dwie wiadomości i dostaje szyfrogram jednej z nich. Może adaptacyjnie pytać o deszyfrowanie innych szyfrogramów, także po otrzymaniu wyzwania. Jego celem jest wskazanie zaszyfrowanej wiadomości z przewagą nad losowaniem. Dowód musi symulować również tę wyrocznię, nie tylko zamienić maskę na losowy element, jak w prostym argumencie CPA dla ElGamala.

  • Zgodne wykładniki. W uczciwym szyfrogramie u1=g1ru_1=g_1^r i u2=g2ru_2=g_2^r. To relacja DH. W analizie zastępujemy ją parą o niezależnych wykładnikach. Wykrycie takiej zmiany prowadzi do rozróżniacza DDH.
  • Niespójne zapytania. Dwie ukryte współrzędne każdego składnika klucza pozostawiają swobodę algebraiczną, mimo znajomości klucza publicznego. Dla zapytań bez wspólnego wykładnika trafienie poprawnego znacznika wymaga spełnienia dodatkowego ukrytego warunku liniowego. Analiza ogranicza prawdopodobieństwo takiego zdarzenia także przy wielu zapytaniach.
  • Próba zachowania hasza. Inna trójka z haszem trójki wyzwania stanowiłaby kolizję z zadanym celem. To miejsce użycia TCR. Nie zakładamy, że każdy zmieniony ciąg zawsze ma inny hasz.
  • Ukryty bit. Po kontrolowanych zmianach reguł pozostały widok nie zależy od wybranej wiadomości. Różnice między grami rozliczamy przez DDH, TCR i małe prawdopodobieństwo wyjątków.

To mapa dowodu, nie jego pełny zapis. Dla wersji CS1 twierdzenie 1 źródła daje poniższe konkretne ograniczenie. Niech QDQ_D oznacza maksymalną liczbę zapytań deszyfrujących, a przewaga CCA będzie zdefiniowana jako ∣Pr⁡[b′=b]−1/2∣|\Pr[b'=b]-1/2|. Istnieją odpowiednie redukcje B,C\mathcal B,\mathcal C takie, że:

Adv⁡CS1CCA2(A)≤Adv⁡GDDH(B)+Adv⁡ℋTCR(C)+QD+4q.\operatorname{Adv}^{\mathrm{CCA2}}_{\mathrm{CS1}}(\mathcal A) \leq\operatorname{Adv}^{\mathrm{DDH}}_G(\mathcal B) +\operatorname{Adv}^{\mathrm{TCR}}_{\mathcal H}(\mathcal C) +\frac{Q_D+4}{q}.

Przewaga DDH jest różnicą prawdopodobieństw odpowiedzi rozróżniacza w dwóch rozkładach, a składnik TCR jest prawdopodobieństwem znalezienia wymaganej kolizji. Wyraz (QD+4)/q(Q_D+4)/q pochodzi z oszacowania zdarzeń wyjątkowych w dowodzie. Nie jest „siłą hasza” ani empirycznym wynikiem demonstracji. Zmiana definicji przewagi może zmienić stałe. Pełną kolejność gier i rachunek zawiera §6.2, twierdzenie 1.

Model standardowy: powyższe twierdzenie nie zastępuje hasza wyrocznią losową. Korzysta z jego konkretnej własności TCR oraz założenia DDH. Nie przenosi się automatycznie do każdej grupy z pairingiem. W demonstratorze wykorzystujemy działania w G1G_1 BLS12-381, ale nie pairing. Interpretacja bezpieczeństwa wymagałaby trudności DDH właśnie w tej grupie oraz odpowiedniego hasza. Nie publikujemy obrazów tych samych sekretów w G2G_2.

Granice demonstracji. Obliczenia punktów wykonuje MCL WebAssembly. Zapis potęgowy na rysunku oznacza w kodzie dodawanie punktów i mnożenie przez skalar, zgodnie z wcześniejszym słownikiem. Punkty P,QP,Q odpowiadają bazom g1,g2g_1,g_2. Hasz skalarny to SHA-256 z separatorem domeny, publicznym parametrem κ\kappa i kodowaniami trzech punktów, następnie redukcja modulo qq. Nie jest to certyfikowana implementacja rodziny TCR ani gotowa ciphersuite. Wiadomości liczbowe są kodowane jako m=μ⋅Pm=\mu\cdot P, a odczyt przeszukuje mały, jawny zakres. Dodanie Δ=δ⋅P\Delta=\delta\cdot P oznacza w tym kodowaniu zmianę liczby o δ\delta. To odwracalne kodowanie demonstracyjne, nie hash-to-curve i nie szyfrowanie dowolnych plików. Demo przetwarza lokalnie utworzone punkty, nie pakiety odbierane z sieci. Klucze testowe i oba stany są dostępne na jednej stronie. Wyniki testów poprawności nie dowodzą IND-CCA2.

Gwarancja jest probabilistyczna. Na przykład losowanie r=0r=0 z Zq\mathbb Z_q ma prawdopodobieństwo 1/q1/q. Wtedy u1=u2=v=1Gu_1=u_2=v=1_G, a maska jest neutralna. Takie wyjątkowe wykonanie nie ukrywa wiadomości. Właśnie dlatego twierdzenie mówi o zaniedbywalnej przewadze w całym eksperymencie, a nie o bezwarunkowym odrzuceniu każdej modyfikacji w każdym możliwym wykonaniu.

Sprawdź rozumienie: co stałoby się, gdyby hasz pomijał ww? Dlaczego tag nie jest podpisem nadawcy? Dlaczego nie wolno wydać w⋅B−1w\cdot B^{-1} przed sprawdzeniem równania? W wariancie bez wiązania ww atak w↦w⋅Δw\mapsto w\cdot\Delta znów przechodziłby kontrolę. Właśnie dlatego zestaw argumentów funkcji haszującej jest częścią schematu.

Dalszy krok: rerandomizacja i zmiana odbiorcy, sieci miksujące, C8. Źródła: Cramer–Shoup, CRYPTO 1998, rozszerzona analiza CS1.

Szyfrowanie hybrydowe: od elementu grupy do pliku

ElGamal powyżej przyjmuje element grupy, a nie dowolnie długi plik. Możemy rozdzielić zadanie: mechanizm asymetryczny dostarcza krótki sekret, a mechanizm symetryczny chroni właściwe dane. Interfejs całości nadal musi określać, co szyfrujemy i co przesyłamy.

Hybrydowe szyfrowanie pliku: KEM (key encapsulation mechanism) to mechanizm enkapsulacji klucza. Korzystając z klucza publicznego odbiorcy, nadawca uzyskuje tajny materiał kluczowy i kapsułkę do przesłania. Odbiorca dekapsułkuje ją swoim sekretem i odzyskuje ten sam materiał. Wyprowadzamy z niego klucz i szyfrujemy dane mechanizmem AEAD. Muszą zgadzać się długości, kodowania, identyfikator algorytmu i uwierzytelniany kontekst. Samo umieszczenie dwóch dobrych mechanizmów obok siebie nie zastępuje twierdzenia o kompozycji.

W formalnym interfejsie ΠKEM=(Setup,KeyGen,Encaps,Decaps)\Pi_{\mathrm{KEM}}=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Encaps},\mathsf{Decaps}) wywołanie (cK,z)←Encaps(pp,pk)(c_K,z)\leftarrow\mathsf{Encaps}(pp,pk) zwraca publiczną kapsułkę cKc_K oraz tajny materiał zz. Nie przyjmuje wiadomości użytkownika. Wywołanie z′←Decaps(pp,sk,cK)z'\leftarrow\mathsf{Decaps}(pp,sk,c_K) odtwarza zgodny materiał dla uczciwej kapsułki. Obsługę nieprawidłowych kapsułek określa konkretny KEM, z jawnym odrzuceniem albo mechanizmem odrzucenia niejawnego. Następnie obie strony wyprowadzają klucz AEAD. Wiadomość użytkownika jest wejściem dopiero do tego symetrycznego szyfrowania.

Szyfrowanie hybrydowe KEM–AEAD: algorytmy i przepływ

Jest to kompozycja interfejsów, nie nowa nazwana konstrukcja z automatycznym dowodem. Setup ustala zgodne KEM, KDF, AEAD, kodowania i kontekst. KeyGen jest algorytmem wybranego KEM. Osobny standard określa bezpieczeństwo tej kompozycji.

Π=(Setup,KeyGen,Enc,Dec)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Enc},\mathsf{Dec})
Enc(pp,pk,m,d)\mathsf{Enc}(pp,pk,m,d)⟶C=(cK,n,cE)\longrightarrow C=(c_K,n,c_E)
(cK,z)←Encaps(ppKEM,pk)(c_K,z)\leftarrow\mathsf{Encaps}(pp_{\mathrm{KEM}},pk)
k=KDF(z,ctx)k=\mathsf{KDF}(z,\mathrm{ctx})
cE←EncAEAD(k,n,m,d)c_E\leftarrow\mathsf{Enc}_{\mathrm{AEAD}}(k,n,m,d)

Ustal nonce zgodnie z profilem. Kontekst wiąże algorytmy i kapsułkę.

Dec(pp,sk,C,d)\mathsf{Dec}(pp,sk,C,d)⟶m albo ⊥\longrightarrow m\text{ albo }\bot
z′←Decaps(ppKEM,sk,cK)z\prime\leftarrow\mathsf{Decaps}(pp_{\mathrm{KEM}},sk,c_K)
k′=KDF(z′,ctx)k\prime=\mathsf{KDF}(z\prime,\mathrm{ctx})
m=DecAEAD(k′,n,cE,d)m=\mathsf{Dec}_{\mathrm{AEAD}}(k\prime,n,c_E,d)

Przerwij przy jawnym błędzie KEM. Przy odrzuceniu niejawnym sprawdzenie AEAD nie może być pominięte.

Szyfrowanie hybrydowe KEM–AEAD: czynności i komunikatyNadawcaOdbiorcaEncaps i KDFEnc: dane użytkownikaKapsułka i zaszyfrowane daneDecaps i KDFDec: kontrola tagu i odczyt

Szyfrowanie hybrydowe KEM–AEAD

Nadawca: pp,pk,m,dpp,pk,m,d

Odbiorca: pp,skpp,sk

  1. Nadawca, Encaps i KDF: (cK,z)←Encaps(ppKEM,pk)(c_K,z)\leftarrow\mathsf{Encaps}(pp_{\mathrm{KEM}},pk) k=KDF(z,ctx)k=\mathsf{KDF}(z,\mathrm{ctx})
  2. Nadawca, Enc: dane użytkownika: cE=EncAEAD(k,n,m,d)c_E=\mathsf{Enc}_{\mathrm{AEAD}}(k,n,m,d)
  3. Nadawca → Odbiorca: (cK,n,cE,d)(c_K,n,c_E,d) Kapsułka i zaszyfrowane dane
  4. Odbiorca, Decaps i KDF: z′=Decaps(ppKEM,sk,cK)z\prime=\mathsf{Decaps}(pp_{\mathrm{KEM}},sk,c_K) k′=KDF(z′,ctx)k\prime=\mathsf{KDF}(z\prime,\mathrm{ctx})
  5. Odbiorca, Dec: kontrola tagu i odczyt: m=DecAEAD(k′,n,cE,d)m=\mathsf{Dec}_{\mathrm{AEAD}}(k\prime,n,c_E,d)
Publiczny klucz odbiorcy służy enkapsulacji. Dane użytkownika trafiają dopiero do AEAD. Na rysunku pominięto jawne parametry AEAD ustalone w pp.

Dalej: RSA zmieni rodzinę problemu matematycznego. Nadal będziemy jednak sprawdzać te same interfejsy Enc/Dec i Sign/Verify, zamiast nazywać pojedyncze potęgowanie gotowym systemem szyfrowania.

Powiązania: C8, Boneh–Shoup.

Needham–Schroeder: zaszyfrowane, lecz przypisane złej rozmowie

Niech Enc⁡B\operatorname{Enc}_B oznacza szyfrowanie do Boba. W historycznym protokole publicznym Alicja wysyła Enc⁡B(NA,A)\operatorname{Enc}_B(N_A,A), Bob odpowiada Enc⁡A(NA,NB)\operatorname{Enc}_A(N_A,N_B), a Alicja odsyła Enc⁡B(NB)\operatorname{Enc}_B(N_B). Nonce NA,NBN_A,N_B mają wykazać świeżość. Ewa może jednak być legalnym uczestnikiem z własnym kluczem.

Needham–Schroeder: historyczny przepływ: algorytmy i przepływ

Schemat uwierzytelnienia, w którym wykryto atak opisany poniżej. Setup wybiera szyfrowanie publiczne, długość nonce i zaufany rejestr kluczy. KeyGen jest algorytmem wybranego szyfrowania. A i B w komunikatach są tu tożsamościami, a Enc_A i Enc_B szyfrują do ich zaufanych kluczy. Każdy odbiorca lokalnie odszyfrowuje komunikat przed kontrolą.

Π=(Setup,KeyGen,Start,Next)\Pi=(\mathsf{Setup},\mathsf{KeyGen},\mathsf{Start},\mathsf{Next})
StartA(B)\mathsf{Start}_A(B)⟶(M1,stA)\longrightarrow (M_1,st_A)
NA←${0,1}ℓN_A\overset{\$}{\leftarrow}\{0,1\}^{\ell}
M1←EncB(NA,A)M_1\leftarrow\mathsf{Enc}_B(N_A,A)

Stan pamięta N_A i zamierzonego partnera B.

NextB(M1)\mathsf{Next}_B(M_1)⟶(M2,stB)\longrightarrow (M_2,st_B)
(NA,A)=DecB(M1)(N_A,A)=\mathsf{Dec}_B(M_1)
NB←${0,1}ℓN_B\overset{\$}{\leftarrow}\{0,1\}^{\ell}
M2←EncA(NA,NB)M_2\leftarrow\mathsf{Enc}_A(N_A,N_B)

Błędne kodowanie lub deszyfrowanie przerywa sesję.

NextA(stA,M2)\mathsf{Next}_A(st_A,M_2)⟶M3\longrightarrow M_3
(NA′,NB)=DecA(M2)(N_A\prime,N_B)=\mathsf{Dec}_A(M_2)
NA′=?NAN_A\prime\stackrel{?}{=}N_A
M3←EncB(NB)M_3\leftarrow\mathsf{Enc}_B(N_B)

Odpowiedz tylko po zgodności N_A.

NextB(stB,M3)\mathsf{Next}_B(st_B,M_3)⟶b\longrightarrow b
NB′=DecB(M3)N_B\prime=\mathsf{Dec}_B(M_3)
b=[NB′=NB]b=[N_B\prime=N_B]
Needham–Schroeder: historyczny przepływ: czynności i komunikatyAlicjaBobStartPierwszy nonce i tożsamośćNext: odszyfruj i przygotuj nonceBrakuje tożsamości odpowiadającegoNext: sprawdź własny nonceOdpowiedź na nonce BobaNext: sprawdź własny nonce

Needham–Schroeder: historyczny przepływ

Alicja: pp,skA,pkBpp,sk_A,pk_B

Bob: pp,skB,pkApp,sk_B,pk_A

  1. Alicja, Start: NA←${0,1}ℓN_A\overset{\$}{\leftarrow}\{0,1\}^{\ell}
  2. Alicja → Bob: EncB(NA,A)\mathsf{Enc}_B(N_A,A) Pierwszy nonce i tożsamość
  3. Bob, Next: odszyfruj i przygotuj nonce: NB←${0,1}ℓN_B\overset{\$}{\leftarrow}\{0,1\}^{\ell}
  4. Bob → Alicja: EncA(NA,NB)\mathsf{Enc}_A(N_A,N_B) Brakuje tożsamości odpowiadającego
  5. Alicja, Next: sprawdź własny nonce: NA′=?NAN_A\prime\stackrel{?}{=}N_A
  6. Alicja → Bob: EncB(NB)\mathsf{Enc}_B(N_B) Odpowiedź na nonce Boba
  7. Bob, Next: sprawdź własny nonce: NB′=?NBN_B\prime\stackrel{?}{=}N_B
Poprawka Lowe’a dodaje B do drugiego szyfrowanego komunikatu i kontrolę oczekiwanego partnera u Alicji. Sam historyczny przepływ nie zapewnia deklarowanego uwierzytelnienia.
Krok Komunikat Znaczenie dla ataku
1 Alicja → Ewa: Enc⁡E(NA,A)\operatorname{Enc}_E(N_A,A) Alicja świadomie zaczyna rozmowę z Ewą
2 Ewa → Bob: Enc⁡B(NA,A)\operatorname{Enc}_B(N_A,A) Ewa podszywa się pod Alicję
3 Bob → Alicja: Enc⁡A(NA,NB)\operatorname{Enc}_A(N_A,N_B) Ewa przechwytuje, lecz nie odszyfrowuje
4 Ewa → Alicja: ten sam szyfrogram Alicja traktuje go jako odpowiedź Ewy
5 Alicja → Ewa: Enc⁡E(NB)\operatorname{Enc}_E(N_B) Ewa poznaje nonce Boba
6 Ewa → Bob: Enc⁡B(NB)\operatorname{Enc}_B(N_B) Bob błędnie uwierzytelnia Alicję

Szyfrowanie działało zgodnie z przeznaczeniem. Alicja nie potrafiła powiązać drugiej wiadomości z tożsamością odpowiadającego. Poprawka Lowe'a dodaje tę tożsamość: Enc⁡A(NA,NB,B)\operatorname{Enc}_A(N_A,N_B,B). Lokalna sesja Alicji oczekuje Ewy, więc Alicja odrzuca odpowiedź oznaczoną jako pochodzącą od Boba. Jest to naprawa konkretnego przeplotu, nie uniwersalna zasada, że dopisanie nazwiska zawsze zabezpiecza protokół.

Źródło: Gavin Lowe, An Attack on the Needham–Schroeder Public-Key Authentication Protocol. Atak podkreśla, że uwierzytelnianie dotyczy relacji pomiędzy sesjami i uczestnikami, a nie tylko tajności pojedynczych szyfrogramów.