You are on page 1of 18

Generisanje velikih prostih brojeva sa

RSA algoritmom

Zilha Omerović
Univerzitet Donja Gorica
email: zilha.omerovic@udg.edu.me
http://www.udg.edu.me

Apstrakt: Predmet ovog rada je metoda generisanja velikih prostih


brojeva sa RSA algoritmom.Tajnost kriptosistema sa javnim ključem za-
sniva se na teško rješivim ili još uvijek nerješivim matematičkim prob-
lemima. Rezultat toga je da brojevi i njihova složenost imaju veoma
veliku ulogu u održavanju sigurnosti sistema. Za asimetrične šifarske al-
goritme, kao što je RSA, po značaju se posebno izdvaja jedna klasa bro-
jeva - prosti brojevi. Ako bi postojao efikasan algoritam za faktorizaciju
prostih brojeva, sigurnost asimetričnih algoritama bila bi dovedena u pi-
tanje. U većini asimetričnih algoritama za generisanje ključeva se koriste
veliki prosti brojevi sa stotinu i više decimalnih cifara.

Ključne riječi: RSA algoritam · Prosti brojevi · generisanje · testovi


· Digitalni potpis

1 Uvod
Najpoznatiji algoritam iz asimetrične kriptografije, RSA, dobio je
naziv po početnim slovima njegovih autora (Rivest, Šamir i Adle-
man). Asimetrično zapravo znači da radi na dva različita ključa,
odnosno javni ključ i privatni ključ. Sam naziv kaže da se javni ključ
daje svima, a privatni ključ se čuva privatnim. To je prvi algoritam
za koji se zna da je pogodan za šifrovanje kao i za digitalno potpi-
sivanje. Zasniva se na matematički složenom postupku faktorizacije
(rastavljanja) proizvoda dva velika prosta broja na njegove faktore
(činioce). Problem kod ovog pristupa je u tome što ne postoji čvrsti
matematički dokaz da ne postoji kraći put za faktorizaciju. Ideja
RSA se zasniva na činjenici da je teško rastaviti veliki cijeli broj
na faktore. Javni ključ se sastoji od dva broja gdje je jedan broj
proizvod dva velika prosta broja. I privatni ključ je takođe izveden
iz ista dva prosta broja. Dakle, ako neko može faktorisati veliki broj,
privatni ključ je kompromitovan. Stoga snaga šifrovanja u potpunosti
zavisi od veličine ključa. Snaga ključa se eksponencijalno povećava.
RSA ključevi obično mogu biti dugi 1024 ili 2048 bita, ali stručn-
jaci vjeruju da bi 1024-bitni ključevi mogli biti razbijeni u bliskoj
budućnosti. Ali za sada se čini da je to neizvodljiv zadatak [1].

2 Matematički prikaz
U ovom dijelu se razmatraju osnovni pojmovi koji su povezani sa
generisanjem velikih prostih brojeva sa RSA algoritmom. Ovi poj-
movi su ključni za razumijevanje ostalih poglavlja vezanih za RSA
algoritam.

2.1 RSA algoritam


Prije svega, pažnja je posvijećena matematičko-teoretskom alatu
koji je neophodan da bi se shvatio, a potom i dokazao mehanizam
funkcionisanja RSA algoritama. Najvažnije matematičke teoreme na
kojima se zasniva RSA algoritam jesu Euklidov algoritam i Ojlerova
teorema.

Definicija 1: (Djeljivost) Za date brojeve n, m ∈ Z\{0}


kažemo da n dijeli m, odnosno da je m djeljivo sa n ukoliko postoji
cio broj b takav da važi m = b ∗ n. To označavamo sa n | m. Ako n
ne dijeli m, onda pišemo n ∤ m. Ako n | m onda još kažemo da je n
djelilac od m, odnosno da je m sadržalac od n.

Definicija 2: Broj n ∈ Z\{−1, 0, 1} je prost broj ukoliko je


djeljiv samo sa ±1 i ±n, odnosno,

∄m ∈ Z\{±1, ±n} : m | n.
Broj koji nije prost naziva se složen.

Definicija 3: Za date n, m ∈ Z zajednički djelilac je priro-


dan broj d takav da važi d | n i d | m. Ako je barem jedan
od brojeva n i m različit od nule, onda postoji konačno mnogo
zajedničkih djelilaca brojeva n i m. Najveći među njima zove se
najveći zajednički djelilac brojeva n i m i označava se sa N ZD(n, m).

Definicija 4: Cijeli brojevi n i m su uzajamno (relativno)


prosti ukoliko je N ZD(n, m) = 1.

Teorema 1: (Teorema o dijeljenju sa ostatkom) Za proizvoljan


prirodan broj b i cijeli broj a postoje jedinstveni cijeli brojevi q i r
takvi da je:
a = q · b + r, 0 ≤ r < b.
Broj q se zove količnik, a r je ostatak pri dijeljenju a sa b.

Teorema 2: Neka su a, b, q i r cijeli brojevi takvi da je


b > 0, 0 ≤ r < b, a = b · q + r. Tada je N ZD(a, b) = N ZD(b, r).

Lema 1: Ako je a = bq i b ≥ 0, onda je N ZD(a, b) = b.


Dokaz: b | a jer a = bq, a očigledno je da je b najveći mogući
djelilac samog sebe. Iz toga slijedi da je N ZD(a, b) = b. ■

Sledeća teorema, odnosno, Euklidov algoritam za nalaženje


najvećeg zajedničkog djelioca dva prirodna broja je najstariji
algoritam koji je i danas u upotrebi. Ovaj algoritam se zasniva na
prethodno navedenim teoremama i lemi 1.

Teorema 3: (Euklidov algoritam) Neka su a, b > 0 prirodni


brojevi. Pretpostavimo da je uzastopnom primjenom teoreme o
dijeljenju sa ostatkom dobijen niz jednakosti

a = b · q 1 + r1 , 0 ≤ r1 < b
b = r1 · q2 + r2 , 0 ≤ r2 < r1
r1 = r2 · q3 + r3 , 0 ≤ r3 < r2
rj−2 = rj−1 · qj + rj , 0 ≤ rj < rj−1
rj−1 = rj · qj+1
tada je N ZD(a, b) jednak rj , odnosno, posljednjem ostatku raličitom
od nule.
Dokaz: Niz ostataka ri , i = {1, . . . , j}, j ∈ N je konačan jer je strogo
opadajući niz prirodnih brojeva te je odozdo ograničen nulom (ne
može biti negativan broj). Zato je svaki par prirodnih brojeva a i
b moguće predstaviti jednačinama iznad u konačno mnogo koraka.
Na osnovu Teoreme 2. za niz jednakosti navedenih u Euklidovom
algoritmu važi sljedeće:
N ZD(a, b) = N ZD (b, r1 ) = . . . = N ZD (rj−2 , rj−1 ) = N ZD (rj−1 , rj ) .
Pošto rj | rj−1 iz Leme 1 dobijamo i N ZD(a, b) = rj , što je i trebalo
pokazati. ■

Definicija 5: Neka je n ∈ N, n > 1. Ojlerova funkcija pred-


stavlja ukupan broj prirodnih brojeva koji nisu veći od n, a koji
su uzajamno prosti sa n, odnosno broj elemenata svedenog sistema
ostataka po modulu n i označava se sa φ(n).

U sljedećoj tabeli date su vrijednosti Ojlerove funkcije za prvih


nekoliko prirodnih brojeva:
n 1 2 3 4 5 6 7 8 9 10
φ(n) 1 1 2 2 4 2 6 4 6 4
Tabela 1: Tabela sa vrijednostima Ojlerove funkcije za prvih 10
prirodnih brojeva.

Slijede dvije bitne osobine Ojlerove funkcije:


• Ukoliko je n prost broj, onda je
φ(n) = n − 1,
jer ukoliko je n prost broj, ne dijeli ga ni jedan broj iz skupa
{1, 2, . . . , n − 1}, a ni njihovi faktori. Stoga su sa brojem n svi
elementi skupa {1, 2, . . . , n − 1} uzajamno prosti, a kako je kar-
dinalnost tog skupa n−1, lako je zaključiti da je ovaj identitet tačan.

• Neka su n, m ∈ Z uzajamno prosti. Tada je:


φ(n ∗ m) = (n − 1) ∗ (m − 1).
U suštini ova formula predstavlja specijalan slučaj teoreme koja
govori o Ojlerovoj funkciji broja koji se može predstaviti u kanonsko-
faktorisanom obliku.
Lema 2: Osobine relacije kongruencije:
1. a ≡ b (mod m) ako i samo ako je a = b + mt za neki t ∈ Z,
odnosno m | (a − b).
2. Ako je N ZD(a, m) = 1 i ax ≡ ay (mod m), onda je x ≡ y(mod
m).
3. Ako je a ≡ b (mod m) i c ≡ d (mod m) onda je ia · c ≡ b · d
(mod m).

Lema 3: Neka je N ZD(a, m) = 1 i neka je {α1 , α2 , . . . , αk }


proizvoljan potpun (sveden) sistem ostataka po modulu m. Tada je
{aα1 , aα2 , . . . , aαk } isto tako potpun (sveden) sistem ostataka po
modulu m.

Teorema 4: (Ojlerova teorema) Ako je N ZD(a, m) = 1,


onda je

aφ(m) ≡ 1 (mod m).


n o
Dokaz: Neka je α1 , α2 , . . . , αφ(m) svedeni sistem ostataka po mod-
n o
ulu m. Onda je prema Lemi 3 i aα1 , aα2 , . . . , aαφ(m) svedeni sistem
ostataka po modulu m. Zato, za svaki broj αi postoji samo jedan broj
αj takav da važi aαj ≡ αi (mod m).
Kako ima φ(m) takvih brojeva, ima toliko i kongruencija:

α1 ≡ aα1 (mod m)
α2 ≡ aα2 (mod m)
...

αφ(m) ≡ aαφ(m) (mod m).

Pomnoživši sve ove kongruencije dobija se sljedeća kongruencija:

aφ(m) α1 α2 · · · αφm ≡ α1 α2 · · · αφ(m) (mod m),


a kako je ispunjen uslov leme 3. odnosno, (αi , m) = 1, i =
1, 2, . . . , φ(m) može se izvršiti skraćivanje, pa konačno se dobija:
aφ(m) ≡ 1 (mod m).

2.2 Mehanizam kriptovanja RSA algoritmom


Mehanizam enkripcije i dekripcije kod RSA algortima zasniva se
na modularnoj aritmetici. U nastavku je opisan taj mehanizam po
koracima.

1. Prvo što je potrebno jesu dva velika prosta broja (svaki veličine
makar 150 decimalnih cifara). Za njihovo generisanje potreban
pseudo je slučajni generator (algoritam koji na neki, ne potpuno
proizvoljan način bira brojeve iz nekog skupa, ali na dovoljno do-
bar način da običan statistički test ne razlikuje taj broj odabran
pseudo random generatorom od potpuno proizvoljno odabranog
broja iz skupa. Pseudo slučajnim generatorom upotrebljavaju se
zato što je u teoriji kompjuterskih nauka praktično nemoguće
na potpuno proizvoljan način odabrati element iz skupa pa se
zbog toga implementiraju pseudo slučajnim algoritmom koji su
"dovoljno dobri" da zamijene potpuno proizvoljno biranje). Uz
pomoć pseudo slučajnog generatora bira se proizvoljan broj n,
a potom se uz pomoć kompjuterskog programa provjerava da li
je broj n prost. Ukoliko nije, provjerava se da li je n + 1 prost.
Ukoliko nije provjerava se da li je n + 3 prost i tako dalje. Teo-
rema o prostim brojevima tvrdi da je, za dovoljno veliko n ∈ N,
vjerovatnoća da je slučajno odabran broj n baš prost broj jednaka
1
log n
, tako da ne bi trebalo da ima previše problema oko odabira
velikog prostog broja p. Na analogan način biće odabran i drugi
veliki prost broj q, takav da važi q ̸= p.
2. Množenjem tih brojeva dobija se njihov proizvod n = p · q.
3. Prvo se računa Ojlerova funkcija broja n, φ(n). Odabrani p i q su
prosti brojevi sami za sebe, samim tim, oni su i uzajamno prosti,
odnosno N ZD(p, q) = 1. Taj uslov olakšava računanje Ojlerove
funkcije n, te kako je n = p ∗ q onda je
φ(n) = (p − 1) ∗ (q − 1).
4. Sada je potrebno odabrati eksponent enkripcije e. Broj e je
odabran proizvoljno iz skupa {1, . . . , φ(n) − 1}, takav da je uza-
jamno prost sa brojem φ(n).
5. Zatim slijedi računanje eksponenta dekripcije d. Uz pomoć
proširenog Euklidovog algoritma, neka bude određen jedinstven
cio broj d iz skupa {1, . . . , φ(n)}, takav da važi:

e·d≡1 (mod φ)(n) ⇒ e · d = k · φ(n) + 1, k ∈ Z.

6. Generisani su svi potrebni parametri za kriptovanje RSA


metodom, stoga slučajno generisane brojeve p i q treba obrisati
kako kriptoanalitičari ne bi došli do informacija koje bi im u
znatnoj mjeri povećale vjerovatnoću uspješnosti napada na ovaj
algoritam.

Kako su izračunati svi parametri iz prethodnih koraka, javni i pri-


vatni ključ za RSA algoritam se može konačno definisati. Uređeni
par (n, e) parametara definisanih u koracima 2. i 4. predstavlja javni
ključ za RSA metodu i svako na taj način može da šifruje podatke.
S druge strane, uređeni par (n, d) definisan u koracima 4. i 5. pred-
stavlja privatni ključ dostupan samo kreatoru brojeva sa kojima je
čitav algoritam i počeo, p i q. RSA algoritam pripada blokovnim
šiframa, stoga, prije postupka enkripcije, uz pomoć ranije defin-
isanog ključa, potrebno je otvorenu poruku m podijeliti na blokove
mi dužine ne veće od n. Da bi se otvoreni teks mogao kriptovati,
uvijek se prvo prevodi u numerički ekvialent. Taj niz se dijeli na
blokove tako što se nađe najveći stepen j broja 2 koji zadovoljava
uslov 2j < n, te se potom otvoreni tekst dijeli u blokove dužine j.
Ukoliko ukupna dužina niza (otvorenog teksta) nije djeljiva sa bro-
jem j, otvoreni tekst se dopunjuje do prvog broja h > n takvog da
j | h. Nakon dijeljenja na blokove, sa mi se oynačava proizvoljan blok
dužine j otvorenog teksta, i sa ci njemu odgovarajući blok šifrata, pri
čemu i ∈ {1, 2, . . . , t}, gdje t predstavlja ukupan broj blokova dužine
j otvorenog teksta, odnosno šifrata. Algoritam enkripcije blokova
otvorenog teksta mi u blokove šifrata ci je sljedeći:
f (mi ) = ci = mei (mod n),
dok je algoritam dekripcije:
f −1 (ci ) = mi = cdi (mod n).
Na ovaj način je pokazano da je algoritam za šifrovanje dobro defin-
isan. Prije nego što započnemo dokaz, moramo imati u vidu identitet
iz tačke 5. i Ojlerovu teoremu, kao dvije osnovne stvari koje koristimo
u nizu sljedećih jednakosti:
k
3.1

cd = (me )d = med = mk·φ(n)+1 = mφ(n) · m2.1.7 = 1k · m = m,
čime je pokazano da je RSA zapravo šifra [1].

2.3 Miler-Rabinov test


Zbog svoje jednostavnosti ovo je najčešće korišten probabilistički test
za ispitivanje da li je broj prost. Naziva se još i "jaki pseudoprosti
test" jer se zasniva na nekim osobinama jakih pseudoprostih brojeva.
Predstavimo broj n u obliku n − 1 = 2s∗ r gdje je s najveći stepen
broja 2 koji dijeli n−1. Jasno je da je r neparan broj. Jak pseudoprost
broj za bazu a je neparan složeni broj n, ako postoji broj j, 0 ≤ j ≤
j∗r
s − 1, takav da vrijedi ili ar ≡ 1 mod n ili a2 ≡ n − 1 mod n. Broj
a se naziva "jakim lažovom" da je broj n prost. Ako je ar ̸= 1 mod n
s∗
i a2 ̸= n − 1 mod n za sve j, 0 ≤ j ≤ s − 1, onda je a "jak svjedok"
da je n složen broj [2].

3 Generisanje velikih prostih brojeva sa RSA


algoritmom
Sigurnost RSA algoritma je zasnovana na teškoći faktorisanja veoma
velikih brojeva. Podešavanje RSA kriptosistema uključuje gener-
isanje dva velika prosta broja, recimo p i q, iz kojih se RSA modul
računa kao n = p∗ q. Što je veća veličina modula, veći je nivo sig-
urnosti RSA sistema. Preporučena veličina RSA modula za većinu
podešavanja je 2048 do 4096 bita. Dakle, prosti brojevi koji se gener-
išu moraju biti dugi od 1024 do 2048 bita. Za sintezu tako velikih
prostih brojeva, umjesto da zavise od determinističkih metoda, oslan-
jaju se na pronalaženje brojeva koji su prosti sa zadovoljavajuće vi-
sokim nivoom vjerovatnoće [3].

3.1 Procedura generisanja velikih prostih brojeva


Cilj je da se efikasno izračunaju veoma veliki slučajni prosti bro-
jevi sa određenom veličinom bita. Standardni metod ručne imple-
mentacije generatora slučajnih prostih brojeva koji može da gener-
iše proste vrijednosti sa zadovoljavajućim nivoom tačnosti je dat na
sljedeći način:
1. Unaprijed izaberite nasumični broj sa željenom veličinom bita.
2. Uvjerite se da izabrani broj nije djeljiv sa prvih nekoliko stotina
prostih brojeva (oni su unaprijed generisani).
3. Primijenite određeni broj iteracija Rabin-Millerovog testa pros-
tosti, na osnovu prihvatljive stope greške, da biste dobili broj koji
je vjerovatno prost.

Slika 1: Koraci generisanja velikih prostih brojeva sa RSA algorit-


mom

3.2 Slijede koraci za implementaciju prethodne procedure


1. Odabir slučajnog prostog broja
Generisanje slučajnog broja sa n-bita znači da je slučajni broj u
opsegu 0 i (2n−1 ). Neka razmatranja prilikom generisanja slučajnog
broja su:
1. Biranje malih prostih brojeva, kao što su 3, 5, 7 . . ., mora se izb-
jegavati jer bi faktorizacija RSA modula postala trivijalna. Stoga
se mora voditi računa da nema previše vodećih nula. Ovo se može
uraditi tako što se uvijek pravi bit najvišeg reda bit = 1.
2. Pošto su svi prosti brojevi (> 2) neparni, za bolje performanse
može se izabrati samo neparan broj.

Dakle, biramo bilo koji slučajni broj u opsegu (2n−1 + 1, 2n − 1) .


Python implementacija generisanja slučajanog broja sa n bita:
1
2 def n a s u m i c a n _ b r o j _ s a _ n B i t a _ i _ p a r a m e t r o m ( n ) :
3 # Vraca nasumican broj sa n bita izmedju 2**( n -1) +1 i 2**
n -1
4 return n as um ic an_ br oj _iz me dj u (2**( n -1) +1 , 2** n -1)

Kod 1.1: Implementacija generisanja slučajanog broja sa n bita


label

2. Podjela sa prvim prostim brojem (test prostosti niskog


nivoa)
Ovaj korak je test niske priostost koji zahtijeva da se prvih nekoliko
stotina prostih brojeva unaprijed izračuna (koristeći Eratostenovo
sito). Prost broj se dijeli unaprijed generisanimm prostim brojevima
kako bi se provjerila djeljivost. Ako je prost broj savršeno djeljiv s
bilo kojim od ovih unaprijed generisanih prostih brojeva, test ne uspi-
jeva i novi prost broj se mora odabrati i testirati. Ovo se ponavlja sve
dok se ne pronađe vrijednost koja je relativno prost broj svim pros-
tim brojevima u našoj generisanoj listi prostih brojeva. Python kod
koji definiše funkciju prostBrojDjeljivSaMalimProstimBrojevima(n)
koja generiše kandidata za prost broj koji je djeljiv sa prvih nekoliko
prostih brojeva:
1
2 def p r o s t _ b r o j _ d j e l j i v _ s a _ m a l i m _ p r o s t i m _ b r o j e v i m a ( n ) :
3 ’’’ Generise kandidata za prost broj koji je djeljiv
4 sa prvih nekoliko prostih brojeva ’’’
5 # Ponavljati sve dok se ne pronadje broj koji zadovoljava
test
6 while Tacno :
7
8 # Generisati slucajan broj
9 prost_kandidat = n a s u m i c a n _ b r o j _ s a _ n B i t a _ i _ p a r a m e t r o m ( n )
10
11 # Provjeriti da li je djeljiv sa prvih nekoliko prostih
brojeva
12
13 for d j e l i l a c _ u _ p r v o j _ l i s t i _ p r o s t i h _ b r o j e v a :
14 if prost_kandidat % djeliocem == 0
15 and djelilac **2 <= prost_kandidat :
16 break
17 # Ako nijedan djelilac nije pronadjen , vrati
vrijednost
18 else : return prost_kandidat
Kod 1.2: Python kod koji definiše funkciju koja generiše kandidata
za prost broj koji je djeljiv sa prvih nekoliko prostih brojeva.

3. Rabin-Milerov test za proste brojeve


Prost kandidat koji prođe test niskog nivoa se zatim ponovo testira
koristeći Rabin-Milerov test za proste brojeve. Za izuzetno velike
brojeve, kao što su oni koji se koriste u RSA, determinističko testi-
ranje toga da li je izabrana vrijednost prosta ili ne, je veoma neprak-
tično jer zahtijeva pretjeranu količinu računarskih resursa. Kao takav
se preferira probabilistički pristup. Ako unesena vrijednost prođe
jednu iteraciju Rabin-Milerovog testa, vjerovatnoća da je broj prost
je 75%. Dakle, kandidat koji prođe test, adekvatan broj puta, može se
smatrati prostim brojem sa zadovoljavajućim nivoom vjerovatnoće.
Obično, u komercijalnim aplikacijama, zahtijevamo da vjerovatnoća
1
greške bude manja od 2128 .
Python kod koji definiše funkciju MilerRabinovTest koja testira da li
je kandidat za prost broj zadovoljio Rabin-Milerov test za prostost:
1 def Miler_Rabinov_test ( mi le r_r ab in ov_ ka nd id at ) :
2
3 ’’’ Pokreni 20 iteracija Rabin Miller testa za proste
brojeve ’’’
4
5 maksimalni_broj_dijeljenja_sa_dva = 0
6 parna_komponenta = miler_rabinov_kandidat -1
7
8
9 while parna_komponenta % 2 == 0:
10 parna_komponenta > >= 1
11 m a k s i m a l n i _ b r o j _ d i j e l j e n j a _ s a _ d v a += 1
12 assert (2** m a k s i m a l n i _ b r o j _ d i j e l j e n j a _ s a _ d v a *
parna_komponenta == miler_rabinov_kandidat -1)
13
14
15 def probna_kombinacija ( test1 ) :
16 if pow ( test1 , jednaka_komponenta ,
17 m i l e r _ r a b i n o v a _k o m p o n e n t a ) == 1:
18 return Netacno
19 for i in range ( m a k s i m a l n i _ b r o j _ d i j e l j e n j a _ s a _ d v a ) :
20 if pow ( test1 , 2** i * jednaka_komponenta ,
21 mi le r_ rab in ov _k and id at )
22 == miler_rabinov_kandidat -1:
23 return Netacno
24 return Tacno
25
26
27 # Ovdje postaviti broj pokusaja
28 b r o j _ R a b i n o v i h _ te s t i r a n j a = 20
29 for i in range ( b r o j _ R a b i n o v i h _ t e s t i r a nj a ) :
30 test1 = na su mi can _b ro j_ izm ed ju (2 , mi le r_ ra bin ov _k and id at )
31 if probna_kombinacija ( test1 ) :
32 return Netacno
33 return Tacno
Kod 1.3: Python kod koji implementira Rabin-Mlerov test prostosti
broja
4. Kombinovanje prethodnih koraka za generisanje koda
Konačno, možemo kombinovati gore navedene funkcije da bismo
kreirali proces u tri koraka za generisanje velikih prostih brojeva.
Koraci bi bili:
1. Generisanje slučajnih brojeva pozivanjem:
nasumicanBrojSanBitaIparametromn
2. Osnovni test djeljenja pozivanjem:
prostBrojDjeljivSaMalimProstimBrojevima(n).
3. Rabin-Millerov test pozivanjem:
MilerRabinovTest.
Ako izabrana nasumična vrijednost prođe sve testove prostosti, ona
se vraća kao n-bitni prost broj. U suprotnom, u slučaju neuspjeha
testa, bira se nova nasumična vrijednost i testira se na prostost.
Proces se ponavlja dok se ne pronađe željeni prost broj[3].

Python implementacija kompletnog procesa:


1 # Generisanje velikih prostih brojeva
2 import slucajno
3
4 # Prethodno generisani prosti brojevi
5
6
7 p_l_p_b = [2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 ,
8 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 ,
9 71 , 73 , 79 , 83 , 89 , 97 , 101 , 103 ,
10 107 , 109 , 113 , 127 , 131 , 137 , 139 ,
11 149 , 151 , 157 , 163 , 167 , 173 , 179 ,
12 181 , 191 , 193 , 197 , 199 , 211 , 223 ,
13 227 , 229 , 233 , 239 , 241 , 251 , 257 ,
14 263 , 269 , 271 , 277 , 281 , 283 , 293 ,
15 307 , 311 , 313 , 317 , 331 , 337 , 347 , 349]
16
17
18 def n a s u m i c a n _ b r o j _ s a _ n B i t a _ i _ p a r a m e t r o m ( n ) :
19 return n as um ic an_ br oj _iz me dj u (2**( n -1) +1 , 2** n - 1)
20
21
22 def p r o s t _ b r o j _ d j e l j i v _ s a _ m a l i m _ p r o s t i m _ b r o j e v i m a ( n ) :
23 ’’’ Generisani prosti broj je djeljiv sa prvim prostim
brojem ’’’
24 while Tacno :
25 # Dobijeni slucajni broj
26 pk = n a s u m i c a n _ b r o j _ s a _ n B i t a _ i _ p a r a m e t r o m ( n )
27
28 # Test djeljivosti prethodno generisanim prostim
brojevima
29
30 for d j e l i l a c _ u _ p r v o j _ l i s t i _ p r o s t i h _ b r o j e v a :
31 if pk % djeliocem == 0 i djelilac **2 <= pk :
32 break
33 else :
34 return pk
35
36
37 def Miler_Rabinov_test ( mrk ) :
38 ’’’ Pokreni 20 iteracija Rabin Miler testa za proste
brojeve ’’’
39 maksimalni_broj_dijeljenja_sa_dva = 0
40 jk = mrk -1
41 while jk % 2 == 0:
42 jk > >= 1
43 maxDivisionsByTwo += 1
44 assert (2** m a k s i m a l n i _ b r o j _ d i j e l j e n j a _ s a _ d v a * jk == mrk
-1)
45
46 def probna_kombinacija ( test1 ) :
47 if pow ( test1 , jk , mrk ) == 1:
48 return Netacno
49 for i in range ( m a k s i m a l n i _ b r o j _ d i j e l j e n j a _ s a _ d v a ) :
50 if pow ( test1 , 2** i * jk , mrk ) == mrk -1:
51 return Netacno
52 return Tacno
53
54 # Ovdje postaviti broj pokusaja
55 b r o j _ R a b i n o v i h _ te s t i r a n j a = 20
56 for i in range ( b r o j _ R a b i n o v i h _ t e s t i r a nj a ) :
57 test1 = na su mi can _b ro j_ izm ed ju (2 , mrk )
58 if probna_kombinacija ( test1 ) :
59 return Netacno
60 return Tacno
61
62
63 if __ime__ == ’ __glavni__ ’:
64 while Tacno :
65 n = 1024
66 prost_kandidat =
prost_broj_djeljiv_sa_malim_prostim_brojevima (n)
67 if nije m il er _r abi no v_ kan di da t ( prost_kandidat ) :
68 continue
69 else :
70 stampa (n , " Prosti bit je : \ n " , prost_kandidat )
71 break
Kod 1.4: Implementacija generisanja slučajanog broja sa n bita

4 Primjena RSA algoritma


4.1 RSA i digitalni potpis
Kao što sam naziv kaže, digitalni potpisi su nova alternativa za
digitalno potpisivanje dokumenata. Oni osiguravaju da je poruka
poslata od strane namjeravanog korisnika bez ikakvog falsifikovanja
od treće strane (napadača). Jednostavno rečeno, digitalni potpisi se
koriste za provjeru autentičnosti poruke koja se šalje elektronski.
RSA: To je najpopularniji asimetrični kriptografski algoritam.
Uglavnom se koristi za šifrovanje poruka, ali se može koristiti i
za izvođenje digitalnog potpisa preko poruke. U daljem tekstu
je pojašnjeno kako se RSA može koristiti za izvođenje digitalnih
potpisa korak po korak. Pretpostavljeno je da postoji pošiljalac (A)
i primalac (B). A želi poslati poruku (P) B-u zajedno s digitalnim
potpisom (DP) izračunatim preko poruke[4].

Korak 1: Pošiljalac A koristi SHA-1 algoritam za izračunavanje


sažetka poruke (SP1) preko originalne poruke P.
Slika 2: Postupak računanja sažetka poruke
Korak 2: A sada šifrira sažetak poruke sa svojim privatnim ključem.
Rezultat ovog procesa naziva se digitalni potpis (DP) od A.

Slika 3: Kreiranje digitalnog potpisa


Korak 3: Sada pošiljalac A šalje digitalni potpis (DP) zajedno s
originalnom porukom (P) za B.

Slika 4: Prenos originalne poruke i digitalnog potpisa istovremeno


Korak 4:Kada B primi originalnu poruku (P) i digitalni potpis (DP)
od A, najprije koristi isti algoritam za izračunavanje sažetka poruke
koji je koristio i A, i računa svoj sopstveni sažetak poruke (SP2) za
P.
Slika 5: Primalac računa sopstveni sažetak poruke

Korak 5: Sada B koristi javni ključ od A za dešifrovanje digitalnog


potpisa jer ga je šifrovao privatnim ključem od A. Rezultat ovog
procesa je originalni sažetak poruke (SP1) koji je izračunao A.

Slika 6: Primalac preuzima sažetak poruke pošiljaoca

Korak 6: Ako je SP1 == SP2, sljedeće činjenice su uspostavl-


jene na sljedeći način. B prihvata originalnu poruku P kao ispravnu,
neizmijenjenu poruku od A. To takođe osigurava da je poruka došla
od A, a ne od nekoga ko se predstavlja kao A.

Slika 7: Provjera digitalnog potpisa


Sažetak poruke (SP1) je šifrovan korištenjem privatnog ključa
A za proizvodnju digitalnog potpisa. Stoga se digitalni potpis može
dešifrovati korištenjem A-ovog javnog ključa (zbog asimetričnog ob-
lika RSA ). Ako je primalac B u stanju da dešifruje digitalni potpis
koristeći A-ov javni ključ, to znači da je poruka primljena od samog
A i sada A ne može poreći da nije poslao poruku.Takođe se dokazuje
da originalna poruka nije mijenjana jer kada primalac B pokuša
pronaći svoj vlastiti sažetak poruke SP2, podudara se sa SP1 od
A. Pretpostavimo da zlonamjerni korisnik pokuša pristupiti origi-
nalnoj poruci i izvršiti neke izmjene. Sada će on/ona izračunati novi
sažetak poruke preko izmijenjene poruke. Možda se tiče integriteta
i povjerljivosti podataka, ali ovdje je caka. Napadač mora potpisati
izmijenjenu poruku koristeći A-ov privatni ključ kako bi se primaocu
B predstavio kao pošiljalac A. Međutim, napadač ne može potpisati
poruku privatnim ključem A jer je on poznat samo A-u. Dakle, RSA
potpis je prilično jak, siguran i pouzdan[4].

4.2 Napadi na RSA potpis:

Napadi na RSA potpis: Postoje neki napadi koje napadači mogu


pokušati na RSA digitalne potpise. Neki od njih su navedeni u nas-
tavku.
1. Napad s odabranom porukom
U napadu izabrane poruke, napadač kreira dvije različite poruke,
P1 i P2, i nekako uspijeva da ubijedi pravog korisnika da potpiše
obje poruke koristeći RSA šemu digitalnog potpisa. Treba razmotriti-
poruku P1 i poruku P2, dakle, napadač računa novu poruku P = P 1
x P 2 i zatim tvrdi da je pravi korisnik potpisao poruku P .

2. Napad samo ključem

U ovom napadu, pretpostavka je da napadač ima pristup javnom


ključu pravog korisnika i pokušava da dobije poruku i digitalni pot-
pis. Samo napadač tada pokušava kreirati drugu poruku PP tako da
izgleda da isti potpis S vrijedi na PP. Međutim, nije lako pokrenuti
napad jer je matematička složenost izvan ovoga prilično visoka.
3. Napad sa poznatom porukom
U napadu sa poznatom porukom, napadač pokušava da koristi
funkciju RSA pri čemu se dvije različite poruke koje imaju dva ra-
zličita potpisa mogu kombinovati tako da se i njihovi potpisi kom-
binuju. Za primjer, recimo da imamo dvije različite poruke P1 i P2
sa odgovarajućim digitalnim potpisima kao S1 i S2. Tada ako je
P = (P 1 × P 2) mod n, matematički je S = (S1 ̸= S2) mod n.
Dakle, napadač može izračunati P = (P 1 × P 2) mod n, a zatim
S = (S1 × S2) mod n da bi lažirao potpis.

5 Zaključak
Generisanje velikih prostih brojeva predstavlja ključni korak u pro-
cesu implementacije RSA algoritma. Ovaj korak složen i vremen-
ski zahtjevan, ali je od vitalnog značaja za osiguranje sigurne ko-
munikacije putem RSA algoritma. Iako postoji nekoliko drugih al-
goritama za generisanje prostih brojeva, RSA algoritam se i dalje
smatra jednim od najboljih načina za osiguravanje sigurne komu-
nikacije u digitalnom svijetu. Međutim, važno je napomenuti da je
važnost sigurnosnih mjera još više porasla u današnjem dobu digi-
talne tehnologije, gdje se često javljaju prijetnje sigurnosti i napadi
na privatne informacije. Stoga je važno da se postupak generisanja
velikih prostih brojeva u okviru RSA algoritma se obavlja pažljivo
i sa punom pažnjom, kako bi se osigurala sigurna komunikacija u
svim digitalnim transakcijama.

Literatura
1. M Veinović, S Adamović - Beograd: Univerzitet Singidunum, 2013, str 127-132
2. D Divjakovic, str 21-25, str 36-40
3. https://www.geeksforgeeks.org/how-to-generate-large-prime-numbers-for-rsa-
algorithm/?ref=rp
4. https://www.geeksforgeeks.org/rsa-and-digital-signatures/?ref=rp

You might also like