Inzynieria bezpieczenstwa

Transkrypt

Inzynieria bezpieczenstwa
Koncepcja systemu kryptograficznego z kluczem jawnym (zwanym inaczej systemem
kryptograficznym z kluczem publicznym lub asymetrycznym systemem kryptograficznym)
została po raz pierwszy zaprezentowana przez Diffiego i Hellmana w 1976 r. W systemie
tego typu stosuje się dwa róŜne klucze: szyfrujący oraz deszyfrujący. Schemat blokowy
algorytmu asymetrycznego przedstawia poniŜszy schemat:
R
y
s
u
n
e
k
1
S
c
h
e
m
a
t
b
l
o
k
o
w
y
a
l
g
o
r
y
t
m
u
a
s
y
m
e
t
r
y
c
z
n
e
g
o
Generator klucza kryptograficznego generuje dwa klucze: szyfrujący K1 oraz deszyfrujący
K2. Klucz szyfrujący jest nazywany
i przesyła się go do nadawcy
informacji zwykłym, niezabezpieczonym kanałem transmisyjnym. KaŜdy nadawca
informacji moŜe uŜyć tego klucza, obliczając:
C = EK1 (M )
Algorytmy z kluczem publicznym są pomyślane tak, Ŝe odwrócenie operacji szyfrującej jest
niemoŜliwe w rozsądnym czasie. Aby odczytać zaszyfrowaną wiadomość, naleŜy znać klucz
K2, który jest nazywany
i nie moŜna go otrzymać znając klucz jawny K1.
Proces deszyfrowania określa zaleŜność:
M = DK 2 (C )
Oba przekształcenia (E oraz D) muszą być operacjami jednoznacznie odwracalnymi.
Systemy kryptograficzne z kluczem jawnym są inaczej zwane systemami asymetrycznymi, w
odróŜnieniu od systemów symetrycznych, uŜywających jednego klucza zarówno do operacji
szyfrowania, jak i deszyfrowania (do algrytmów symetrycznych naleŜy np. DES).
k
k
l
u
c
z
e
m
t
a
j
n
y
l
u
c
z
e
m
j
a
w
n
y
m
m
Systemy kryptograficzne z kluczem jawnym opierają się na tzw.
(z ang. trapdoor one-way functions). Obliczenie wartości takiej
n
i
e
o
d
w
r
a
c
a
l
n
y
c
h
f
u
n
k
c
j
a
c
h
z
a
p
a
d
k
o
w
y
c
h
-1-
funkcji jest łatwe, ale odwrócenie operacji okazuje się być praktycznie niemoŜliwe.
Algorytmy z kluczem jawnym są algorytmami blokowymi.
Większość algorytmów z kluczem jawnym bazuje na jednym z trzech problemów trudnych,
do których naleŜą:
• Problem plecakowy;
• Problem logarytmu dyskretnego;
• Problem faktoryzacji.
Siła dowolnego algorytmu z kluczem jawnym zaleŜy od złoŜoności obliczeniowej problemu,
na którym algorytm ten bazuje.
Pierwszy algorytm kryptograficzny z kluczem publicznym zaprojektowali w 1978 r. Merkle i
Hellman. Zaproponowali oni szyfr, opierający się na problemie plecakowym, będącym
zagadnieniem klasy NP-zupełnej. Pojęcie NP pochodzi z teorii złoŜoności, która umoŜliwia
analizowanie złoŜoności obliczeniowej algorytmów kryptograficznych. Algorytmy
klasyfikuje się w zaleŜności od ich złoŜoności czasowej lub przestrzennej, wyraŜonej jako
funkcja argumentu n. Algorytm jest liniowy jeśli jego złoŜoność rośnie liniowo wraz
ze wzrostem n; podobnie algorytmy mogą być kwadratowe, wykładnicze itp. Algorytmy
z kluczem jawnym mają zwykle złoŜoność wykładniczą.
Trudność obliczenia logarytmu dyskretnego wykorzystano m.in. w algorytmie ElGamala,
a problem faktoryzacji w algorytmie RSA. Część bezpiecznych i praktycznych algorytmów
asymetrycznych nadaje się tylko do szyfrowania danych, inne tylko do podpisów cyfrowych.
Jedynie dwa algorytmy (RSA i ElGamal) mogą być uŜyte w obu tych zastosowaniach.
Do podpisów cyfrowych uŜywany jest takŜe często algorytm DSA (ang. Digital Signature
Algorithm).
Wszystkie algorytmy z kluczem jawnym działają bardzo wolno w porównaniu
do algorytmów symetrycznych.
W algorytmie tym wykorzystano problem plecakowy, zwany inaczej problemem
upakowania. Problem ten przedstawia się następująco: do dyspozycji mamy
nieuporządkowany zbiór przedmiotów, kaŜdy o innej wadze. Z tego zbioru naleŜy wybrać
podzbiór o zadanej z góry łącznej wadze. Sformułowanie problemu w dziedzinie liczb
wygląda następująco: mamy dodatnią liczbę całkowitą s i dla danego ciągu a szukamy
wektora dwójkowego m = (m1, m2, …, mn) spełniającego równanie:
n
s = ∑ ai mi
i =1
Wartości mi naleŜą do zbioru {0,1} . Wartość 1 wskazuje, Ŝe dany element jest składnikiem
sumy, a wartość 0 – Ŝe nie jest. Np. jeśli a = (1191, 171, 459, 4517, 2410, 197) a s = 3798,
to moŜna znaleźć rozwiązanie s = 1191+2410+197. Wtedy m = (1, 0, 0, 0, 1, 1).
Znalezienie właściwego podzbioru jest zagadnieniem trudnym, gdyŜ naleŜy przeszukać 2n
moŜliwych podzbiorów i nie znaleziono dotychczas lepszego algorytmu, rozwiązującego ten
problem. ZłoŜoność problemu opisuje funkcja wykładnicza. Dla n = 200 zadanie staje się
nierozwiązywalne metodą ataku brutalnego, jeśli natomiast liczba n = 1000, to moŜliwych
podzbiorów będzie 21000, przy czym liczba atomów we Wszechświecie szacowana jest
na 2256.
-2-
Merkle i Hellman pokazali, Ŝe problem plecakowy o złoŜoności wykładniczej moŜna
przekształcić w problem o złoŜoności liniowej. W tym celu generuje się dwa klucze: jawny,
słuŜący do szyfrowania, oraz tajny, deszyfrujący. Deszyfrowanie z kluczem jawnym jest
problemem o złoŜoności wykładniczej i złamanie szyfru staje się bardzo trudne. Gdy
do deszyfrowania uŜywany jest klucz tajny, problem ma złoŜoność liniową, dzięki czemu
jest łatwy do rozwiązania.
PoniŜszy rysunek przedstawia schemat blokowy algorytmu Merklego – Hellmana:
R
y
s
u
n
e
k
2
S
c
h
e
m
a
t
b
l
o
k
o
w
y
p
o
d
p
i
s
y
w
a
n
i
a
i
n
f
o
r
m
a
c
j
i
a
l
g
o
r
y
t
m
e
m
M
e
r
k
l
e
g
o
H
e
l
l
m
a
n
a
Klucz tajny generowany jest za pomocą generatora liczb losowych i zawiera ciąg liczb
losowych K ' = (k1 ' , k 2 ' ,.., k n ' ) oraz liczbę pierwszą m i liczbę losową w. Elementy ciągu K’ są
tak dobrane, aby kaŜdy element ciągu był większy od sumy elementów poprzedzających
(ciąg taki nazywany jest ciągiem superrosnącym), natomiast liczba pierwsza m i liczba
losowa w spełniając zaleŜności:
n
m > ∑ ki '
i =1
1< w < m
-1
Dla liczby w oblicza się odwrotność w (mod m) za pomocą wzoru:
w × w −1 mod m = 1
Elementy klucza jawnego K = (k1, k2, …, ki) są obliczane z ciągu K’ z zaleŜności:
ki = ki '×w(mod m)
Klucz jawny jest przesyłany do nadawcy informacji kanałem niezabezpieczonym. Klucz
tajny musi pozostać u odbiorcy.
Szyfr Merklego – Hellmana jest szyfrem blokowym, szyfrującym ciągi binarne. Ciąg m1, m2,
… dzieli się na bloki M = (m1, m2, …, mn) zawierające po n bitów. Szyfrowanie bloków
odbywa się z uŜyciem klucza jawnego K wg wzoru:
C = ∑ ki × mi
i
-3-
W procesie deszyfrowania wykorzystuje się klucz tajny K’. Najpierw obliczane jest C’:
C ' = C × w −1 (mod m)
Znając C’ i K’, moŜna wyznaczyć elementy wiadomości.
Poprawność algorytmu Merklego – Hellmana moŜna sprawdzić, podstawiając wzory
ki = ki '×w(mod m) oraz C = ∑ ki × mi do wzoru C ' = C × w −1 (mod m) :
i
n
n
(
)
C ' = w −1 ∑ k i × mi (mod m) = ∑ ki '×mi × w × w −1 (mod m) (mod m)
i =1
i =1
Korzystając ze wzoru w × w −1 mod m = 1 , moŜna napisać, Ŝe:
n
C ' = ∑ ki '×mi (mod n)
i =1
n
PoniewaŜ m > ∑ ki ' , moŜna napisać:
i =1
n
C ' = ∑ ki '×mi
i =1
Szyfr Merklego – Hellmana został złamany cztery lata po opublikowaniu. Okazało się, Ŝe
na podstawie klucza jawnego moŜna znaleźć klucz, zbliŜony do klucza tajnego, który
umoŜliwia zdeszyfrowanie zaszyfrowanych wiadomości. Oprócz szyfru Merklego –
Hellmana opracowano takŜe inne szyfry plecakowe, które takŜe zostały złamane. Obecnie
bezpieczną odmianą szyfrów plecakowych jest algorytm Chora – Rivesta, którego realizacja
wymaga jednak tak duŜego nakładu obliczeniowego, Ŝe algorytm ten jest bardzo rzadko
stosowany w praktyce.
P
r
z
y
k
ł
a
d
d
z
i
a
ł
a
n
i
a
a
l
g
o
r
y
t
m
u
M
e
r
k
l
e
g
o
–
H
e
l
l
m
a
n
a
.
Dany jest ciąg binarny M = (1, 0, 0, 1, 1, 1, 0, 1). Dysponując wygenerowanymi elementami
klucza tajnego K’ = (3, 5, 11, 21, 39, 77, 153, 311) oraz w = 167 i m = 673 sprawdzamy
działanie algorytmu.
Obliczamy w-1, korzystając z algorytmu Euklidesa. Najpierw wyznaczamy NWD(167, 673):
673 = 4×167+5
167 = 33×5+2
5 = 2×2+1
-1
Aby znaleźć w , naleŜy rozwiązać równanie:
w −1 × 167 − t × 673 = 1
W celu przedstawienia liczby 1 jako liniowej kombinacji liczb 167 i 673, wykorzystujemy
ciąg równości od ostatniej do pierwszej w algorytmie Euklidesa. W kaŜdym kroku
zapisujemy liczbę 1 za pomocą wcześniejszych reszt, aŜ dojdziemy do samych liczb 167
i 673:
1 = 5–2×2 = 5–2(167–33×5) = 67×5–2×167 = 67(673–4×167)–2×167 = 67×673 - 270×167
Zmiana znaków w ostatniej części wyraŜenia wymaga dodania i odjęcia od tego wyraŜenia
liczby równej 167×673.
1 = 67×673–167×673+673×167–270×167 = 403×167–100×673
Szukana odwrotność w-1 wynosi zatem 403.
-4-
Elementy klucza jawnego obliczamy wykorzystując klucz tajny i zaleŜność
ki = ki '×w(mod m) . Kluczem jawnym będzie ciąg K = (501, 162, 491, 142, 456, 72, 650,
116).
Kryptogram obliczamy ze wzoru C = ∑ ki × mi :
i
8
C = ∑ ki × mi = 501 + 142 + 456 + 72 + 116 = 1287
i =1
W procesie deszyfrowania najpierw obliczamy C’ ze wzoru C ' = C × w −1 (mod m) :
C ' = C × w −1 (mod m) = 1286 × 403(mod 673) = 451
Wykorzystując klucz K moŜna wyrazić liczbę C’ jako sumę elementów tego klucza. Biorąc
elementy klucza od ostatniego do pierwszego stwierdzamy, Ŝe 451 jest sumą liczb 311, 77,
39, 21 i 3, co zapisać moŜna w postaci:
451 = 1×3+0×5+0×11+1×21+1×39+1×77+0×153+1×311
Zatem informacja, otrzymana w wyniku deszyfrowania, ma postać M = (1, 0, 0, 1, 1, 1, 0, 1).
MoŜna stosować ten algorytm zarówno do szyfrowania danych, jak i podpisów cyfrowych.
Moc algorytmu ElGamala wynika z trudności obliczania logarytmów dyskretnych. Problem
ten moŜna sformułować w sposób następujący: jeśli p jest liczbą pierwszą, a g i m są
liczbami całkowitymi, naleŜy znaleźć takie x, Ŝe g x = m mod p .
Schemat algorytmu ElGamala, zastosowanego do podpisywania dokumentów:
R
y
s
u
n
e
k
3
S
c
h
e
m
a
t
b
l
o
k
o
w
y
p
o
d
p
i
s
y
w
a
n
i
a
i
n
f
o
r
m
a
c
j
i
a
l
g
o
r
y
t
m
e
m
E
l
G
a
m
a
l
a
-5-
Aby wygenerować parę kluczy, jawny i tajny, losujemy liczbę pierwszą p oraz dwie liczby g
oraz x spełniające warunek g < p ∧ x < p . Następnie obliczamy:
y = g x mod p
Kluczem jawnym są liczby: p, g oraz y. Kluczem tajnym jest x. Liczby p i g mogą być
wykorzystywane przez grupę uŜytkowników.
W celu podpisania wiadomości m ∈{0, p − 1} nadawca losuje liczbę k względnie pierwszą z
liczbą p-1 i oblicza:
a = g k mod p
Następnie oblicza on liczbę b z następującego równania:
m = ( x × a + k × b ) mod( p − 1)
Do rozwiązywania równania stosuje się rozszerzony algorytm Euklidesa, którego dokładny
opis moŜna znaleźć np. w [6.2]. Podpis stanowi para liczb a i b. Liczba k musi być
utrzymywana w tajemnicy, gdy Ŝ jest ona prywatnym kluczem podpisującego dokument.
Odbiorca dokumentu weryfikuje poprawność podpisu, sprawdzając równość:
( y a × a b ) mod p = g m mod p
Algorytm ElGamala moŜna stosować równieŜ do szyfrowania wiadomości m wyraŜonych w
postaci liczb naleŜących do zbioru {0, p − 1} . Schemat blokowy algorytmu jest bardzo
podobny do algorytmu podpisywania z rys. nr 3, z tym, Ŝe zamiast podpisywania i
weryfikacji podpisu stosuje się operację szyfrowania i deszyfrowania. Szyfrogram złoŜony z
liczb a i b obliczany jest z zaleŜności:
a = g k mod p
b = (m × y k ) mod p
Do wyznaczenia postaci jawnej wiadomości m z kryptogramu stosuje się wyraŜenie:
b
m = x mod p
a
Odwrotność mod p obliczamy na podstawie funkcji Eulera (ze wzoru a −1 ≡ aϕ ( n ) −1 (mod n) ).
Poprawność algorytmu wynika z przekształcenia:
b m × y k m × g x× k
=
=
= m mod p
ax
ax
g k×x
f
P
r
z
y
k
ł
a
d
d
z
i
a
ł
a
n
i
a
a
l
g
o
r
y
t
m
u
E
l
G
a
m
a
l
a
d
o
p
o
d
p
i
s
ó
w
c
y
r
o
w
y
c
h
.
Zakładamy p = 11, g = 2 oraz x = 8. Obliczamy y ze wzoru y = g x mod p :
y = g x mod p = 28 mod11 = 3
Kluczem jawnym są liczby: p = 11, g = 2 i y = 3.
Aby podpisać wiadomość m = 5, wybieramy liczbę k = 9 i sprawdzamy,
Ŝe NWD(k, p-1) = NWD(9, 10) = 1.
Obliczamy a ze wzoru a = g k mod p :
a = g k mod p = 29 mod11 = 6
Oraz liczbę b z równania m = ( x × a + k × b ) mod( p − 1) :
m = (x × a + k × b ) mod( p − 1)
5 = (8 × 6 + 9 × b ) mod(10), b = 3
-6-
Liczbę b moŜna znaleźć numerycznie, rozwiązując równanie 8×6+9×b–10×x=5 w dziedzinie
liczb całkowitych.
Aby zweryfikować podpis,
( y a × a b ) mod p = g m mod p :
naleŜy
potwierdzić,
Ŝe
spełnione
jest
równanie
(36 × 63 ) mod11 = 25 mod11
Algorytm Ronalda Rivesta, Adi Shamira i Leonarda Adelmana, zwany od nazwisk twórców
algorytmem RSA, pojawił się wkrótce po opublikowaniu algorytmu Merklego – Hellmana.
Algorytm ten nadaje się do szyfrowania danych i podpisów cyfrowych. Jest on algorytmem
wykładniczym z kluczem publicznym. Bezpieczeństwo RSA opiera się na trudności
faktoryzacji duŜych liczb.
Schemat blokowy algorytmu:
R
y
s
u
n
e
k
4
–
S
c
h
e
m
a
t
b
l
o
k
o
w
y
s
z
y
f
r
o
w
a
n
i
a
a
l
g
o
r
y
t
m
e
m
R
S
A
Klucze tajny i jawny szyfru RSA są funkcjami pary duŜych liczb pierwszych. W celu
wygenerowania kluczy odbiorca kryptogramu losuje dwie liczby pierwsze p i q oraz liczbę e.
Iloczyn n = p×q oraz liczba e stanowią klucz publiczny, z tym, Ŝe liczba e musi być
względnie pierwsza z funkcją Eulera ϕ (n) . Spełnione są więc zaleŜności:
n = p×q
ϕ (n) = ( p − 1)(q − 1)
NWD (e, ϕ (n)) = 1
Kluczem tajnym, słuŜącym do deszyfrowania kryptogramu, są liczby d oraz n. Liczba d
spełnia zaleŜność:
e × d mod ϕ (n) = 1
Po obliczeniu kluczy liczby p oraz q naleŜy zniszczyć tak, aby nigdy nie zostały ujawnione.
-7-
W celu zaszyfrowania informacji, naleŜy przedstawić ją w postaci liczb z zakresu od 0 do n1. Elementy kryptogramu ci odpowiadające wiadomości mi oblicza się z zaleŜności:
e
ci = mi mod n
Odszyfrowywanie przeprowadzane jest wg wzoru:
d
mi = ci mod n
Wiadomość moŜna równieŜ zaszyfrować za pomocą klucza tajnego (liczby d), a odszyfrować
za pomocą klucza jawnego (liczby e).
Funkcję szyfrującą moŜna zrealizować za pomocą następującego algorytmu numerycznego:
1) Liczbę e przedstawiamy w postaci binarnej: e = ek , ek −1 ,..., e1 , e0
2) Podstawiamy ci = 1
3) Powtarzamy w pętli od 0 do k następujące operacje:
2
a. ci = ci mod n
b. JeŜeli ei = 1, to ci = ci × m mod n
Funkcja szyfrująca i deszyfrująca są wzajemnie odwrotne. Poprawność algorytmu moŜna
e
d
pokazać, podstawiając wzór opisujący szyfrowanie ci = mi mod n do wzoru mi = ci mod n ,
otrzymując:
e× d
mi = mi mod n
Ze wzoru e × d mod ϕ (n) = 1 wynika, Ŝe e × d = t × ϕ (n) + 1 dla pewnego t, będącego liczbą
całkowitą, a zatem:
mi
t ×ϕ ( n ) +1
mod n = mi × mi
t ×ϕ ( n )
(
mod n = mi × mi
ϕ (n)
)
t
mod n mod n
Wykorzystując uogólnienie Eulera małego twierdzenia Fermata ( aϕ ( n ) (mod n) ≡ 1 ),
otrzymujemy:
ed
mi = mi mod n = mi mod n = mi
Na bezpieczeństwo szyfru wpływa dobór liczb pierwszych p i q – powinny to być liczby o
długości ponad 100 cyfr. W celu lepszego zabezpieczenia n przed rozkładem na czynniki
pierwsze zaleca się, aby:
• Liczby p i q róŜniły się o kilka cyfr;
• Zarówno p–1 jak i q–1 miały duŜe czynniki pierwsze;
• Wartość NWD(p–1, q–1) była niewielka.
W realizacji praktycznej algorytmu występuje problem wyboru algorytmu generowania liczb
pierwszych i realizacji funkcji szyfrującej. Do generowania duŜych liczb pierwszych nie
nadaje się klasyczna metoda sita Eratostenesa [6.3], nie powinno się równieŜ uŜywać
powszechnie znanych liczb pierwszych, takich, jak np. liczby pierwsze Fermata lub
Mersenna. Liczb pierwszych dla celów kryptograficznych poszukuje się poprzez losowanie
nieparzystych liczb, a następnie poddawania liczb tych tzw. testom pierwszości [6.3]. Jeśli
wylosowana liczba przejdzie testy pomyślnie, to jest duŜa szansa, Ŝe jest ona liczbą pierwszą.
Znanych jest klika testów pierwszości. Jeden z tych testów opiera się na małym twierdzeniu
Fermata, które głosi, Ŝe liczba pierwsza p spełnia zaleŜność a p −1 mod p = 1 dla a
całkowitych, niepodzielnych przez p. Na przykład dla p = 5 i a = 4 otrzymamy
4 4 = 256(mod 5) ≡ 1 .
-8-
Szyfr RSA został złamany w 1994 r. – odczytano wtedy wiadomość, zaszyfrowaną przez
twórców RSA siedemnaście lat wcześniej. Przy łamaniu pracowało przez osiem miesięcy
600 osób na pięciu kontynentach, korzystając z Internetu. Mimo to algorytm RSA jest
obecnie uwaŜany za bezpieczny, dla odpowiednio duŜej wielkości klucza (co oznacza
stosowanie bardzo duŜych – nawet kilkusetcyfrowych – liczb pierwszych).
P
r
z
y
k
ł
a
d
d
z
i
a
ł
a
n
i
a
a
l
g
o
r
y
t
m
u
R
S
A
.
Niech informacja mi = 3. Przyjąć, Ŝe p = 5, q = 7 i e = 11. Dla przyjętych wartości naleŜy
obliczyć: n = p × q = 35 i ϕ (n) = ( p − 1) × (q − 1) = 24 .
Obliczamy d, wykorzystując algorytm Euklidesa. Najpierw wyznaczamy NWD(11,24):
24 = 2×11+2
11 = 5×2+1
Aby znaleźć d, naleŜy rozwiązać równanie e × d mod ϕ (n) = 1 :
11 × d − t × 24 = 1
W celu przedstawienia liczby 1 jako liniowej kombinacji liczb 11 i 24 wykorzystujemy ciąg
równości od ostatniej do pierwszej w algorytmie Euklidesa. W kaŜdym kroku zapisujemy
liczbę 1 za pomocą wcześniejszych reszt, aŜ dojdziemy do samych liczb 11 i 24:
1 = 11–5×2 = 11–5×(24–2×11) = 11×11–5×24
Zatem szukana liczba d = 11.
e
Szyfrowanie informacji przeprowadza się wg wzoru ci = mi mod n :
e
ci = mi mod n = 311 mod 35 = 177147 mod 35 = 12
W celu przeprowadzenia operacji deszyfrowania kryptogramu naleŜy skorzystać ze wzoru
d
mi = ci mod n :
d
mi = ci mod n = 1211 mod 35 = 743008370688 mod 35 = 3
5.1.Zapoznać się z materiałami (pod kątem wejściówki)
5.2.Dokonać implementacji algorytmu RSA, uŜywając dowolnej biblioteki
obsługującej operacje na duŜych liczbach (np. MIRACL http://indigo.ie/~mscott/). Implementacja powinna obsługiwać szyfrowanie
oraz podpisywanie dowolnych plików.
6.1.Mochnacki W. „Kody korekcyjne i kryptografia”, Oficyna Wydawnicza
Politechniki Wrocławskiej, Wrocław 1997
6.2.Denning D.E.R. „Kryptografia i ochrona danych”, WNT, Warszawa 1992
6.3.Schneier B. „Kryptografia dla praktyków”, WNT, Warszawa
-9-