Lab5 PARI i algorytmy szyfrowe v1 2

background image

Podstawy Ochrony

Nazwisko: _______________________

Informacji (POI)

Rok/grupa: _______________________

Zima 2012/2013

Ć

wiczenie laboratoryjne V

Implementacja i analiza algorytmów szyfrowych

kryptografii asymetrycznej



To jest laboratorium ćwiczeniowe. Należy jest wykonać w czasie trwania zajęć. Zadanie
to nie powinno zająć więcej czasu niż czas trwania laboratorium. Jeśli zadanie zostanie
zakończone wcześniej, to można kontynuować prace dotyczące poprzedniego
laboratorium lub pracy semestralnej.

1. Wstęp

Przedmiotem laboratorium jest zaimplementowanie i przetestowanie w środowisku
PARI/GP trzech następujących algorytmów szyfrowych:

− algorytmu szyfrowania i podpisu cyfrowego RSA

− algorytmu uzgadniania kluczy Diffie-Hellmana

− algorytm szyfrowania i podpisu cyfrowego ElGamala.

1.1 Algorytm szyfrowania RSA

RSA jest najszerzej używanym kryptosystemem klucza publicznego, nazwanym tak na
cześć jego odkrywców R. Rivesta, A. Shamira i L. Adlemana. Jego użycie zapewnia
zarówno poufność, jak też możliwość tworzenia podpisów cyfrowych, zaś jego
bezpieczeństwo jest oparte na trudności rozwiązania problemu faktoryzacji liczby
całkowitej.

Algorytm Generowanie kluczy do szyfrowania kluczem publicznym RSA

STRESZCZENIE: każdy podmiot tworzy klucz publiczny RSA i
odpowiadający mu klucz prywatny. Każdy podmiot A powinien wykonać
następujące czynności:

1. Wygenerować dwie duże losowe (i różne) liczby pierwsze p i q, każda w

przybliżeniu o tym samym rozmiarze.

2. Obliczyć n = pq i

φ

= (p – 1)(q – 1)

.

3. Wybrać losowa liczbę całkowitą e, 1 < e <

φ

, taką że nwd(e,

φ

) = 1.

4. Użyć rozszerzonego algorytmu Euklidesa (Algorytm 2.107) do obliczenia

unikalnej liczby całkowitej d, 1 < d <

φ

, takiej że ed

1 (mod

φ

)

.

5. Kluczem publicznym podmiotu A jest (n, e), zaś jego kluczem

prywatnym (n, d).

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 2

Algorytm Szyfrowanie kluczem publicznym RSA

STRESZCZENIE: B szyfruje wiadomość m przesyłaną podmiotowi A, który ją
deszyfruje.

1. Szyfrowanie. B powinien wykonać następujące czynności:

(a) Uzyskać autentyczny klucz publiczny (n, e) podmiotu A.
(b) Przedstawić wiadomość m jako liczbę całkowitą z przedziału [0, n-1].
(c) Obliczyć c = m

e

mod n

.

(d) Wysłać szyfrogram c podmiotowi A.

2. Deszyfrowanie. Podmiot A, aby odtworzyć tekst m na podstawie c,

powinien wykonać następujące czynności:

(a) Użyć klucza prywatnego d do odtworzenia m = c

d

mod n.

1.2 Algorytm podpisu cyfrowego RSA z załącznikiem

Przestrzenią wiadomości oraz przestrzenią szyfrogramów schematu RSA szyfrowania
kluczem publicznym RSA jest zbiór Z

n

= {0, 1, 2, ..., n-1}, gdzie n = pq jest iloczynem

dwóch losowo wybranych różnych liczb pierwszych. Schemat podpisu RSA jest
deterministycznym schematem podpisu cyfrowego, zapewniającym odtworzenie
wiadomości.

Algorytm Generowanie klucza w schemacie podpisu RSA

STRESZCZENIE: każdy podmiot A generuje klucz publiczny RSA i
odpowiadający mu klucz prywatny. Każdy podmiot A powinien wykonać, co
następuje:

3. Wygenerować dwie różne losowe liczby pierwsze o dużej wartości p i q,

każda w przybliżeniu o tym samym rozmiarze.

4. Obliczyć n = pq i

φ

= (p -1)(q - 1).

5. Wybrać losową liczbę całkowitą e, 1< e <

φ

taką, że nwd(e,

φ

) = 1.

6. Zastosować rozszerzony algorytm Euklidesa do obliczenia unikalnej liczby

całkowitej d, 1< d <

φ

takiej, że ed

≡ 1 (mod

φ

).

7. (n, e) jest publicznym kluczem pomiotu A, zaś d jest jego kluczem

prywatnym.

Algorytm Tworzenie podpisu RSA z załącznikiem i jego weryfikacja

STRESZCZENIE: podmiot A podpisuje wiadomość m

M.

Dowolny podmiot

B

może zweryfikować podpis użytkownika A, a następnie odtworzyć z podpisu

wiadomość m.

1. Tworzenie podpisu. Podmiot A powinien wykonać, co następuje:

a) Obliczyć wartość skrótu

m

~

= h

(m).

b) Obliczyć s =

m

~

d

mod n.

c) Podpisem podmiotu A jest s.

2. Weryfikacja. Aby zweryfikować podpis A, podmiot B powinien wykonać,

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 3

co następuje:
a) Pobrać autentyczny klucz publiczny (n, e) podmiotu A.
b) Obliczyć

m

~

= s

e

mod n.

c) Obliczyć wartość skrótu '

m

~ = h(m).

d) Zweryfikować czy

m

~

= '

m

~ ; jeśli

m

~

'

m

~

,

to odrzucić podpis.

1.3 Algorytm uzgadniania kluczy Diffie-Hellmana

Algorytm uzgadniania kluczy Diffie-Hellmana zapewnił pierwsze praktyczne
rozwiązanie problemu dystrybucji kluczy, pozwalając dwóm stronom, które nigdy
wcześniej się nie spotkały ani nie udostępniały sobie materiału kluczowego, ustanowić
wspólny sekret poprzez wymianę wiadomości w kanale otwartym. Bezpieczeństwo
algorytmu opiera się na trudności problemu Diffie-Hellmana oraz powiązanego problemu
obliczenia logarytmu dyskretnego.

Algorytm uzgadniania kluczy Diffie-Hellmana

STRESZCZENIE: A i B wysyłają sobie wiadomość kanałem otwartym. W
efekcie ustanawiają współdzielony sekret K znany obu stronom, A i B.

1) Jednorazowa konfiguracja (set-up). Wybierana jest właściwa liczba

pierwsza p oraz generator α należący do

*

n

Z

,

taki że (2 ≤ α ≤ p-2).

2) Komunikaty protokołu.

A → B : α

x

mod p (1)

A ← B : α

y

mod p (2)

3) Działanie protokołu. Wykonaj następujące kroki za każdym razem gdy

potrzebny jest klucz współdzielony.
a) A wybiera sekretną liczbę losową x, taką że 1≤ x ≤ p – 2, i wysyła B

wiadomość (1)

b) B wybiera sekretną liczbę losową y, taką że 1≤ y ≤ p – 2, i wysyła A

wiadomość (2)

c) B otrzymuje α

x

i oblicza klucz współdzielony jako K=( α

x

)

y

mod p

d) A otrzymuje α

y

i oblicza klucz współdzielony jako K=( α

y

)

x

mod p

1.4 Algorytm szyfrowania ElGamala

Schemat ElGamala szyfrowania kluczem publicznym może być rozpatrywany jako
uzgadnianie kluczy Diffiego-Hellmana w trybie przesyłania klucza. Jego bezpieczeństwo
jest oparte na trudności rozwiązania problemu logarytmu dyskretnego oraz problemu
Diffiego-Hellmana.

Algorytm Generowanie kluczy do szyfrowania kluczem publicznym ElGamala

STRESZCZENIE: każdy podmiot tworzy klucz publiczny i odpowiadający mu
klucz prywatny. Każdy podmiot A powinien wykonać następujące czynności:

1. Wygenerować dużą liczbę losową p oraz utworzyć generator

α

grupy

multiplikatywnej

*

n

Z

liczb całkowitych modulo p.

2. Wybrać liczbę losową a, 1

a p-2 i obliczyć

α

a

mod p

.

3. Kluczem publicznym podmiotu A jest (p,

α

, y

); zaś jego kluczem

prywatnym a.

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 4

Algorytm Szyfrowanie ElGamala

STRESZCZENIE: B szyfruje wiadomość m przesyłaną podmiotowi A, który ją
deszyfruje.

1. Szyfrowanie. B powinien wykonać następujące czynności:

(a) Pobrać autentyczny klucz publiczny (p,

α

, y

) podmiotu A.

(b) Przedstawić wiadomość m jako liczbę całkowitą z zakresu {0, 1, ..., n-

1}

.

(c) Wybrać liczbę losową k, 1

k p-2.

(d) Obliczyć

γ =

α

k

mod p

oraz

δ = m (y)

k

mod p

.

(e) Wysłać szyfrogram c = (

γ, δ) podmiotowi A.

2. Deszyfrowanie. Podmiot A, aby odtworzyć tekst m na podstawie c,

powinien wykonać następujące czynności:
(a) Użyć klucza prywatnego a do obliczenia

γ

p-1-a

mod

p

(zauważmy:

ak

a

a

p

=

=

α

γ

γ

1

).

(b) Odtworzyć m, obliczając (

γ

-a

)

δ mod p.

1.5 Algorytm podpisu cyfrowego ElGamala

Schemat podpisu ElGamala jest mechanizmem podpisu randomizowanego. Tworzy on
podpisy cyfrowe z załącznikiem dla wiadomości binarnych o dowolnej długości i
wymaga użycia funkcji skrótu h: {0, 1}*

Z

q

, gdzie p jest dużą liczbą pierwszą.

Algorytm Generowanie klucza w schemacie podpisu ElGamala

STRESZCZENIE: każdy podmiot generuje klucz publiczny i odpowiadający
mu klucz prywatny. Każdy podmiot A powinien wykonać, co następuje:

1. Utworzyć losową liczbę pierwszą p o dużej wartości i generator

α

multiplikatywnej grupy Z

q

* (stosując algorytm 4.84).

2. Wybrać losową liczbę całkowitą a taką, że 1

ap -2.

3. Obliczyć y =

α

a

mod p.

4. Kluczem publicznym podmiotu A jest (p,

α

, y), zaś jego kluczem

prywatnym

α

.

Algorytm Tworzenie podpisu ElGamala i jego weryfikacja

STRESZCZENIE: podmiot A podpisuje binarną wiadomość m o dowolnej
długości. Dowolny podmiot B może zweryfikować podpis podmiotu A stosując
jego klucz publiczny.

1. Tworzenie podpisu. Użytkownik A powinien wykonać, co następuje:

(a) Wybrać losową tajną liczbę całkowitą k, 1

kp - 2, spełniającą

zależność nwd(k, p - 1) =1.

(b) Obliczyć r =

α

k

mod p.

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 5

(c) Obliczyć k

-1

mod (p - 1).

(d) Obliczyć s = k

-1

{h(m) - ar} mod (p - 1).

(e) Podpisem podmiotu A wiadomości m jest para (r, s).

2. Weryfikacja. Aby zweryfikować podpis (r, s) podmiotu A złożony na

wiadomości m, podmiot B powinien wykonać, co następuje:

(a) Pobrać autentyczny klucz publiczny (p,

α

, y).

(b) Zweryfikować czy 1

rp - 1; jeśli warunek ten nie jest spełniony, to

odrzucić podpis.

(c) Obliczyć v

1

= y

r

r

s

mod p.

(d) Obliczyć h(m) i v

2

=

α

h(m)

mod p.

(e) Zaakceptować podpis wtedy i tylko wtedy, gdy v

1

= v

2

.

2. Opis pakietu PARI/GP

PARI/GP jest komputerowym systemem algebraicznym dostosowanym do badań w
zakresie teorii liczb. Może być używany jako potężny kalkulator biurkowy, jako
narzędzie wspomagające studentów w nauce teorii liczb, lub jako środowisko
programistyczne do studiowania teoretycznych kryptosystemów numerycznych.
PARI/GP jest dostępny bez opłat i może być pobrany ze strony:

http://pari.math.u-bordeaux.fr

Domyślny interfejs PARI/GP jest oparty o linię poleceń, ale są też dostępne interfejsy
graficzne. Rys. 1 przedstawia przykładową sesję PARI/GP pod Linux i Windows.

Rys. 1 Ilustracja interfejsu pakietu PARI/GP

Poniżej

przedstawiono

podstawowe

informacje

o

wbudowanych

funkcjach

obliczeniowych oraz języku programowania.

2.1 Instrukcje sterujące

if(a, {seq1 }, {seq2 }): oblicza sekwencję wyrażeń seq1 jeśli a jest niezerowe, w
przeciwnym razie oblicza wyrażenie seq2. Oczywiście, seq1 albo seq 2 mogą być puste:

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 6

if (a,seq)

oblicza seq jeśli a jest różne od zera (nie trzeba pisać drugiego przecinka), i nie

robi nic w przeciwnym razie.

if (a,,seq)

oblicza seq jeśli a jest równe zero, i nie robi nic w przeciwnym razie. Ten sam

rezultat można uzyskać za pomocą operatora ! (negacja): if (!a,seq).

for(X = a, b, seq): oblicza seq, dla zmiennej X zmienianej w przedziale od a do b. Jeśli
a>b, to nie jest wykonywana żadna operacja.

Należy pamiętać, że w konstrukcji tpyu

for (X = a,b, seq)

zmienna X jest lokalna dla pętli, co prowadzi do potencjalnie nieprzewidywalnego zachowania:

gp > n = 5;
gp > for (n = 1, 10, if (coś_ciekawego(), break););

gp > \\ w tym momencie n jest równe 5 !

Jeśli sekwencja seq modyfikuje indeks pętli, to pętla jest modyfikowana następująco:

gp > for (n = 1, 10, n += 2; print(n))
3
6
9
12

until(a, seq): oblicza seq dopóki a nie jest równe 0 (np. dopóki a jest prawdziwe). Jeśli a
pierwotnie nie jest równe 0, to seq jest obliczany raz (warunek jest sprawdzany po
wykonaniu seq, a nie przed jak w while).

while(a, seq): gdy a jest niezerowe, oblicza sekwencję wyrażeń seq. Sprawdzenie
warunku jest wykonywane przed obliczaniem seq, stąd jeśli a jest pierwotnie równe zero,
seq

nie będzie obliczony wcale.

2.2 Podstawowe funkcje obliczeniowe

bezout(x, y): znajduje takie dwie minimalne liczby całkowita u i v, że
x * u + y * v = nwd(x, y). Oba argumenty muszą być całkowite lub oba muszą być
wielomianami, a wynik jest wektorem z trzema elementami u, v i nwd(x, y).

lift(x, {v}): zawraca element x = a mod n z Z/nZ dla a z Z, podobnie zwraca reszty
wielomianowe w przypadku wykonywania operacji obliczania reszty z dzielenia dwóch
wielomianów (o ile v jest pominięte). Na przykład:

gp > lift(Mod(5,3))
%1 = 2

gp > lift(3 + O(3^9))
%2 = 3

gp > lift(Mod(x,x^2+1))
%3 = x

gp > lift(x * Mod(1,3) + Mod(2,3))
%4 = x + 2

gp > lift(x * Mod(y,y^2+1) + Mod(2,3))
%5 = y*x + Mod(2, 3) \\ czy to rozumiesz?

gp > lift(x * Mod(y,y^2+1) + Mod(2,3), x)
%6 = Mod(y, y^2+1) * x + Mod(2, y^2+1)

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 7

z

nprimroot(n): zwraca generator dla (Z/nZ)

*

, zawsze gdy druga grupa jest cykiczna (n =

4 lub n = 2p

k

lub n = p

k

, gdzie p jest nieparzystą liczbą pierwszą, a k

≥ 0).

2.3 Funkcje użytkownika:

W pakiecie PARI można na bieżąco definiować funkcje, które można później
wielokrotnie wywoływać. Na przykład, poniższa funkcja oblicza rekurencyjnie wartość
silni:

f(n) = if(n<0,print("Zly
argument!”),if(n==0,return(1),return(n*f(n-1))))

Jak łatwo zauważyć, bardzo szybko wyrażenia te, szczególnie nawiasy, są niemożliwe do
ś

ledzenia. Byłoby o wiele prościej, gdyby zapisywać swoje funkcje i/lub program w

odrębnym pliku i ładować go do PARI. Można najpierw napisać to co potrzebujesz w
edytorze tekstowym (dla komputerów z Windows: użyj notatnika) bez uruchamiania
PARI a następnie zapisz plik.

Na przykład, powiedzmy, że masz następujący plik o nazwie fact.gp:

f(n) = {
if(n<0,
print("Zly argument!"),
if(n==0,
return(1),
return(n*f(n-1))
)
)
}

Wówczas można wczytać funkcję z pliku i i wywoływać ją:

gp > \r c:\pari\fact.gp

gp > f(3)

%2 = 6

3. Przykłady implementacji algorytmu RSA

Poniżej przedstawiono dwa przykłady implementacji algorytmu szyfrowania RSA.
W pierwszym z przykładów zastosowano bezpośrednie, ale nieefektywne potęgowanie w
arytmetyce modularnej. Z kolei w drugim z przykładów najpierw zaimplementowano
algorytm szybkiego potęgowani modularnego, a następnie wykorzystano go w
obliczeniach.

Uwaga 1. Bezpośrednie potęgowanie w arytmetyce modularnej jest nie tylko
nieefektywne, ale może prowadzić także do przepełnienia stosu.

Uwaga 2. Algorytm szybkiego potęgowania wyrażeń y = g

x

mod n

ma postać:

Algorytm Powtarzany algorytm potęguj-i-mnóż do potęgowania w Z

n

.

WEJŚCIE: a

Z

n

, liczba całkowita 0≤k<n, której reprezentacja binarna ma

postać Σ

t

i=0

k

i

2

i

.

WYJŚCIE: a

k

mod n

1. Ustaw b ←1. Jeśli k=0 to return(b).

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 8

2. Ustaw A←a.

3. Jeśli k

0

=1

to ustaw b←a.

4. Dla i od 1 do t wykonaj:

4.1. Ustaw A←A

2

mod n

4.2. Jeśli k

i

= 1 to ustaw b←A · b mod n.

5.

Return(b).

Przykład 1 (bez zastosowania algorytmu szyfrowania):

gp > p=nextprime(random(10^30)) \\ wybiera losową liczbę
pierwszą mniejszą niż 10^30
%1 = 738873402423833494183027176953

gp > q=nextprime(random(10^25))
%2 = 3787776806865662882378273

gp > setrand(2) \\ aby zmienić punkt startowy generatora liczb
losowych
%3 = 2

gp > p=nextprime(random(10^30))
%4 = 420829752590518623220964128931

gp > q=nextprime(random(10^25)) \\ dla bezpieczeństwa, lepiej
wybierać liczby pierwsze różnych rzędów.
%5 = 118661898673302028252493

gp > n=p*q
%6 = 49936457460606882603937486236150029895426667874174983

gp > e=random(n)
%7 = 27911888897893919924427824802746641865747755531264298

gp > phin=(p-1)*(q-1)
%8 = 49936457460606882603937065406278777478130144881793560

gp > while(gcd(e,phin)!=1, e=e+1) \\ by zapewnić liczby
względnie pierwsze

gp > e \\ jak widać, jest o 1 większa
%9 = 27911888897893919924427824802746641865747755531264299

gp > d=lift(Mod(e,phin)^(-1)) \\ lift zmienia wejście w liczbę
całkowitą,
NIE jest już liczbą mod
e
%10 = 24004316919709947998922871438864307780709766943417672

gp > (e*d)%phin \\ zawsze dobrze to sprawdzić

%11 = 1

gp > log(n)/log(27) \\ podaje liczę znaków które możemy
zaszyfrować
%12 = 36.81692875661933554457136534

gp > m=5+21*27+12*27^2+5*27^3+18*27^4 \\ szyfrowany tekst
m=EULER
%13 = 9673673

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 9

gp > E(x)=lift(Mod(x,n)^e) \\ szyfruje przy użyciu danych
powyżej

(00:29) gp > D(x)=lift(Mod(x,n)^d) \\ Deszyfruje przy użyciu
danych powyżej

(00:29) gp > secret=E(m) \\ To jest szyfrogram
%14 = 24150232700102980434440083538785706321933018688396212

gp > D(secret) \\ Przy odrobinie szczęścia, to powinniśmy
otrzymać "EULER"
%15 = 9673673

gp > m+O(27^5) \\ Odtworzenie znaków tekstu jawnego "EULER"
%16 = 5 + 21*27 + 12*27^2 + 5*27^3 + 18*27^4 + O(27^5)

gp > factor(n)
%18 =
[118661898673302028252493 1]
[420829752590518623220964128931 1]

(00:42) gp > ##
*** last result computed in 28,190 ms.

Przykład 2 (z zastosowaniem algorytmu szybkiego potęgowania):

Algorytm szybkiego potęgowania został zaimplementowany następująco:

/* Potęgowanie modulo przez powtarzane podnoszenie do kwadratu.
*/
/* Obliczamy a^b mod n. */
modexp (a, b, n) = {
local(d, bin );
d = 1;
bin = binary (b);
for (i = 1, length (bin),
d = Mod(d*d, n);
if (bin[i] == 1,
d = Mod(d*a, n);
);
);
return (d);
}

Po zapisaniu powyższego algorytmu w pliku modexp.gp można użyć go w poniższej
implementacji algorytmu szyfrowania RSA, a następnie zaszyfrowania tekstu
HELLOWORLD

. Przyjmuje się przy tym, że szyfrowane są kody ASCII odpowiadające

poszczególnym znakom szyfrowanego tekstu (zwróć uwagę, że jest to inny sposób
szyfrowania tekstu niż ten, który został zastosowany w przykładzie 1). Odpowiednie
kody ASCII można znaleźć w poniższej tabeli.

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 10

Rys. 1 Tabela podstawowych kodów ASCII

Szyfrowanie tekstu HELLOWORLD przebiega następująco:

gp > p = (2^31) - 1
%6 = 2147483647

gp > isprime(p)
%7 = 1

gp > q = (2^61) - 1
%8 = 2305843009213693951

gp > isprime(q)
%9 = 1

gp > n = p*q
%10 = 4951760154835678088235319297

gp > e = random(eulerphi(n));
gp > while (gcd(e, eulerphi(n)) != 1, e = random(eulerphi(n)))
gp > e
%12 = 4048613754158036308925952619

gp > bezout(e, eulerphi(n))
%13 = [-2467255312924178983708448021,
2017255175378597045689617010, 1]

gp > Mod(-2467255312924178983708448021, eulerphi(n))
%14 = Mod(2484504839605656093165693679,
4951760152529835076874141700)

gp > d = 2484504839605656093165693679
%15 = 2484504839605656093165693679

gp > Mod(d * e, eulerphi(n))
%16 = Mod(1, 4951760152529835076874141700)

gp > m = 72697676798779827668
%17 = 72697676798779827668

gp > Mod(m^e, n)
*** length (lg) overflow

gp > \r c:\pari\modexp.gp
gp > modexp(m, e, n)

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 11

%18 = Mod(359367672514946173472712696,
4951760154835678088235319297)

gp > c = 359367672514946173472712696
%19 = 359367672514946173472712696

gp > modexp(c, d, n)
%22 = Mod(72697676798779827668, 4951760154835678088235319297)

5. Ćwiczenia

Czynności wstępne:

• Ćwiczenie można wykonywać w środowisku MS Windows lub Linux Ubuntu.

• W przypadku systemu MS Windows należy sprawdzić, czy pakiet PARI/GP jest

zainstalowany w systemie. Jeśli nie, to należy pobrać program spod adresu
http://pari.math.u-bordeaux.fr i zainstalować.

• W przypadku systemu Linux Ubuntu należy utworzyć nową lub uruchomić

istniejącą maszynę wirtualną Linux Ubuntu w programie Virtual Box z
domyślnymi ustawieniami.

• Z menu Oracle VirtualBox wybrać Ustawienia, a następnie za pomocą opcji

zarejestrować nośnik USB.

• Po zainstalowaniu i uruchomieniu systemu Linux Ubuntu przejść do konsoli

i zainstalować pakiet PARI/GP

$ sudo apt-get install pari-gp pari-doc

Zadania do wykonania

1. Zaimplementować algorytm podpisu cyfrowego RSA z załącznikiem (patrz

rozdz.1.2), podpisać cyfrowo swoje imię i nazwisko, a następnie zweryfikować
podpis. Uwaga! Przyjąć, że używana w tym algorytmie funkcja skrótu jest
funkcja tożsamościową, a weryfikacja podpisu zwraca prawdę lub fałsz.

2. Zaimplementować

algorytm

szyfrowania

ElGamala

(patrz

rozdz.1.4),

zaszyfrować swoje imię i nazwisko, a następnie na podstawie uzyskanego
kryptogramu uzyskać pierwotny tekst jawny.

3. Zaimplementować algorytm podpisu cyfrowego ElGamala z załącznikiem (patrz

rozdz.1.5), podpisać cyfrowo swoje imię i nazwisko, a następnie zweryfikować
jego poprawność.

4. Zaimplementować schemat uzgadniania kluczy Diffie-Hellmana i na wybranych

przykładach pokazać jego poprawność. Następnie uzgodniony klucz proszę
zastosować w roli klucza prywatnego w algorytmie szyfrowania ElGamala i
zaszyfrować najpierw za jego pomocą swoje imię i nazwisko, zaś później dane te
odszyfrować.

Problemy do dyskusji

1. Dlaczego problem znalezienia logarytmu dyskretnego (indeksu) jest problemem

trudnym obliczeniowym? Pokaż przykładowe obliczenia za pomocą pakietu PARI
wraz z czasami obliczeń dla liczb o różnych rozmiarach (w bitach). Uwaga.
Zaimplementuj własne rozwiązanie problemu logarytmu dyskretnego, a następnie

background image

POI

Zima, 2012/2013

Ć

wiczenie laboratoryjne V

strona 12

w celu porównania czasów obliczeń skorzystaj z funkcji znlog, wbudowanej w
pakiet PARI.

2. Omów podstawowe trudności napotkane podczas implementacji algorytmów

z rozdz.1.

Sprawozdanie z ćwiczenia

W trakcie ćwiczenia należy notować wszystkie czynności oraz uzyskiwane wyniki. Po
zakończeniu ćwiczenia należy przygotować sprawozdanie z przebiegu ćwiczenia,
zawierające m.in. krótki opis ćwiczenia, uzyskane wyniki oraz podsumowanie i wnioski
z ćwiczenia.

Literatura

1. Alfred J. Menezes, Paul C. van Oorschot, Scott A. Vanstone Kryptografia

stosowana

, WNT 2005

2. J. Pieprzyk, T. Hardjono, J. Seberry Teoria bezpieczeństwa systemów

komputerowych

, Wydawnictwo Helion, 2005.


Wyszukiwarka

Podobne podstrony:

więcej podobnych podstron