Sunteți pe pagina 1din 2

Sisteme de criptare cu cheie publica

El-Gamal

Luciana Morogan

ATM

1 Parte teoretica sistemul de criptare cu cheie publica


El-Gamal
1. Decodificati mesajul criptat (17, 9) folosind El-Gamal cu parametrii: p =
47, g = 4, x = 2.
R: 8

2. Codificati mesajul M = 5 folosind El-Gamal cu parametrii: p = 23, g =


14, x = 2, k = 7.
R: (y1 , y2 ) = (19, 11)

3. Aratati ca functiile de criptare si decriptare sunt functii inverse.

4. Se presupune existenta a doua mesaje m1 si m2 criptate folosindu-se un sis-


tem El-Gamal cu anumiti parametrii. Se presupune ca la criptarea mesajelor
se foloseste acelasi parametru ales k. Aratati ca in aceasta situatie sis-
temul este vulnerabil.
Hint: Daca un atacator intercepteaza ciphertextul si afla unul dintre mesaje,
fie acesta m1 , atunci va gasi cu usurinta mesajul m2 .

2 Parte practica
1. Scrieti un program care sa calculeze logaritmii discreti modulo un numar
prim p. Fie g ∈ Zp∗ si un h ∈ Zp∗ a.i. h = g x unde 1 ≤ x ≤ 240 . Scopul este sa
determinati acei x, mai exact, daca intrarile in program vor fi p, g, h.

Algoritmul trivial consta in a incerca toate cele 240 puteri ale lui x pana ce
va fi gasita valoarea buna (pana cand va fi gasit acel x care satisface relatia
h = g x in Zp ). Acest algoritm presupune un numar de 240 de inmultiri. In
acest exercitiu, veti implementa un algoritm care va rula intr-un timp de

240 = 220 folosind un atac de tip ”meet in the middle” dupa cum urmeaza
descris in cele de mai jos.

Fie B = 220 . Cum x < B 2 , puteti scrie baza necunoscauta ca x = x0 B + x1


cu x0 , x1 ∈ [0, B − 1]. Astfel, h = g x = g x0 B+x1 = (g B )x0 g x1 ∈ Zp =⇒
h/g x1 = (g B )x0 in Zp . Variabilele din aceasta ecuatie sunt x0 si x1 , restul
2 LM

(g, h, B) fiind cunoscut. Puteti gasi acum o solutie folosind ”meet in the
middle”:
– Construiti o functie hash cu toate valorile posibile din partea stanga a
ecuatiei pentru x1 ∈ 0, ..., 220
– Pentru fiecare x0 ∈ 0, ..., 220 , verificati daca membrul drept al ecuatiei se
gaseste in aceasta tabela hash construita deja. Daca da, atunci ati gasit
o solutie (x0 , x1 ) de unde puteti calcula x-ul cerut (x = x0 B + x1 ).

In total vor fi necesare un numar de 220 de inmultiri pentru constructia


tabelei si alte 220 de look-up-uri in aceasta (a se vedea exemplul descris la
curs de calcul a logaritmului discret).

Acum, cu logaritmul calculat, iata problema pe care va trebui sa o rezolvati:


Se considera valorile de mai jos de aproximativ 153 digiti:

p=134078079299425970995740249982058461274793658205923933 \
77723561443721764030073546976801874298166903427690031 \
858186486050853753882811946569946433649006084171

g=11717829880366207009516117596335367088558084999998952205 \
59997945906392949973658374667057217647146031292859482967 \
5428279466566527115212748467589894601965568

h=323947510405045044356526437872806578864909752095244 \
952783479245297198197614329255807385693795855318053 \
2878928001494706097394108577585732452307673444020333

Gasiti acel x a.i. h = g x ∈ Zp .

Hint: Pentru rezolvarea acestui exercitiu se recomanda folosirea unui mediu


care suporta aritmetica modulara:
– In Python: gmpy2 sau numbthy (le puteti folosi pentru invversiunea
modulara si exponentiere)
– In C: GMP sau OpenSSL
– In Java: o clasa BigInteger care poate calcula operatiile mod, modPow
si modInverse.