28
1 KRIPTOGRAFIJA U ORACLE BAZI Zlatko Sirotić Istra informatički inženjering d.o.o., Pula e-mail: [email protected] SAŽETAK U radu se prvo prikazuju osnove kriptografije. Prikazuje se razlika između simetričnih kriptosustava (koji koriste isti ključ u procesu kriptiranja i procesu dekriptiranja) i asimetričnih kriptosustava (kriptosustava s javnim ključem). Nešto detaljnije se prikazuje asimetrični kriptosustav RSA. Zatim se prikazuje upotreba kriptografije u Oracle bazi. U prilogu se prikazuje matematička osnova kriptosustava RSA, te njegova programska realizacija (za prezentacijske svrhe). The paper presents the basics of cryptography. Furthermore, it shows the difference between the symmetric cryptosystem (which uses the same key in the encryption and decryption process) and asymmetric cryptosystem (cryptosystem with public key). The asymmetric cryptosystem RSA is explained in detail, as it is the use of cryptography in the Oracle database. The appendix shows the mathematical basis of the RSA cryptosystem and the implementation of its software (for presentation purposes). UVOD Sve do kraja 60-tih godina prošlog stoljeća, kriptografija se uglavnom koristila u vojne i diplomatske svrhe. Tada je došlo do širokog razvoja međunarodnih financijskih transakcija, pa se pojavila potreba za kriptosustavima koje će moći koristiti korisnici širom svijeta. Zato su uvedeni međunarodni standardi u kriptografiji. Prvo su uvedeni simetrični kriptosustavi, koji koriste isti ključ i u procesu kriptiranja i u procesu dekriptiranja, što znači da je ključ poznat i pošiljatelju i primatelju poruke (i samo njima). Kasnije su razvijeni asimetrični kriptosustavi (ili kriptosustavi s javnim ključem). U radu se prvo prikazuju sigurnosne osobine poruka (informacija). Zatim se ukratko prikazuju simetrični i asimetrični kriptosustavi. Iako Oracle baza podataka za sada izravno ne koristi asimetrične kriptosustave, u nastavku se nešto detaljnije prikazuje najčešće korišteni asimetrični kriptosustav RSA. U prilozima se daju i neki matematički pojmovi vezani za RSA kriptosustav, te prezentacijska realizacija RSA kriptosusava u Oracle Forms alatu. U nastavku se prikazuje korištenje kriptografije u Oracle bazi. Kao kod svih baza, tako i kod Oracle baze postoje dvije glavne vrste kriptiranja podataka kriptiranje podataka koji su u tranzitu (data in transit) i kriptiranje podataka koji stoje (data at rest), a kod potonjih se uglavnom radi o podacima baze podataka koji se nalaze na diskovima. Kriptiranje podataka koji stoje radi se u Oracle bazi isključivo pomoću simetrične kriptografije, a moguće je primjenjivati "ručnu" metodu, tj. programiranje pomoću paketa DBMS_CRYPTO, ili dvije metode koje čine tzv. transparentnu enkripciju podataka (Transparent Data Encription, DTE): TDE Column Encryption i TDE Tablespace Encryption. 1. SIGURNOSNE OSOBINE PORUKA (INFORMACIJA) Sigurnost računalnih komunikacija ovisi o sljedećim sigurnosnim osobinama poruka (informacija) ili , drugačije rečeno, o sljedećim zahtjevima nad porukama (informacijama): - povjerljivost (tajnost, privatnost, engl. confidentiality): poruku (informaciju) koju osoba A šalje osobi B ne može pročitati nitko treći; - integritet (besprijekornost, netaknutost, engl. integrity): osoba B je sigurna da poruka (informacija) koju je poslala osoba A nij e promijenjena (od neke treće osobe); - raspoloživost (engl. availability): poruke (informacije) moraju uvijek biti na raspolaganju ovlaštenim osobama, unatoč mogućim nepogodama / nesrećama ili zlonamjernim napadima;

KRIPTOGRAFIJA U ORACLE BAZI - istratech.hr · 1 KRIPTOGRAFIJA U ORACLE BAZI Zlatko Sirotić Istra informatički inženjering d.o.o., Pula e-mail: [email protected] SAŽETAK U

Embed Size (px)

Citation preview

1

KRIPTOGRAFIJA U ORACLE BAZI Zlatko Sirotić Istra informatički inženjering d.o.o., Pula e-mail: [email protected]

SAŽETAK

U radu se prvo prikazuju osnove kriptografije. Prikazuje se razlika između simetričnih kriptosustava (koji koriste isti ključ u procesu kriptiranja i procesu dekriptiranja) i asimetričnih kriptosustava (kriptosustava s javnim ključem). Nešto detaljnije se prikazuje asimetrični kriptosustav RSA. Zatim se prikazuje upotreba kriptografije u Oracle bazi. U prilogu se prikazuje matematička osnova kriptosustava RSA, te njegova programska realizacija (za prezentacijske svrhe).

The paper presents the basics of cryptography. Furthermore, it shows the difference between the

symmetric cryptosystem (which uses the same key in the encryption and decryption process) and asymmetric cryptosystem (cryptosystem with public key). The asymmetric cryptosystem RSA is explained in detail, as it is the use of cryptography in the Oracle database. The appendix shows the mathematical basis of the RSA cryptosystem and the implementation of its software (for presentation purposes).

UVOD

Sve do kraja 60-tih godina prošlog stoljeća, kriptografija se uglavnom koristila u vojne i diplomatske

svrhe. Tada je došlo do širokog razvoja međunarodnih financijskih transakcija, pa se pojavila potreba za kriptosustavima koje će moći koristiti korisnici širom svijeta. Zato su uvedeni međunarodni standardi u kriptografiji. Prvo su uvedeni simetrični kriptosustavi, koji koriste isti ključ i u procesu kriptiranja i u procesu dekriptiranja, što znači da je ključ poznat i pošiljatelju i primatelju poruke (i samo njima). Kasnije su razvijeni asimetrični kriptosustavi (ili kriptosustavi s javnim ključem).

U radu se prvo prikazuju sigurnosne osobine poruka (informacija). Zatim se ukratko prikazuju simetrični i asimetrični kriptosustavi. Iako Oracle baza podataka za sada izravno ne koristi asimetrične kriptosustave, u nastavku se nešto detaljnije prikazuje najčešće korišteni asimetrični kriptosustav RSA. U prilozima se daju i neki matematički pojmovi vezani za RSA kriptosustav, te prezentacijska realizacija RSA kriptosusava u Oracle Forms alatu.

U nastavku se prikazuje korištenje kriptografije u Oracle bazi. Kao kod svih baza, tako i kod Oracle baze postoje dvije glavne vrste kriptiranja podataka – kriptiranje podataka koji su u tranzitu (data in transit) i kriptiranje podataka koji stoje (data at rest), a kod potonjih se uglavnom radi o podacima baze podataka koji se nalaze na diskovima. Kriptiranje podataka koji stoje radi se u Oracle bazi isključivo pomoću simetrične kriptografije, a moguće je primjenjivati "ručnu" metodu, tj. programiranje pomoću paketa DBMS_CRYPTO, ili dvije metode koje čine tzv. transparentnu enkripciju podataka (Transparent Data Encription, DTE): TDE Column Encryption i TDE Tablespace Encryption.

1. SIGURNOSNE OSOBINE PORUKA (INFORMACIJA) Sigurnost računalnih komunikacija ovisi o sljedećim sigurnosnim osobinama poruka (informacija) ili,

drugačije rečeno, o sljedećim zahtjevima nad porukama (informacijama): - povjerljivost (tajnost, privatnost, engl. confidentiality): poruku (informaciju) koju osoba A

šalje osobi B ne može pročitati nitko treći;

- integritet (besprijekornost, netaknutost, engl. integrity): osoba B je sigurna da poruka (informacija) koju je poslala osoba A nije promijenjena (od neke treće osobe);

- raspoloživost (engl. availability): poruke (informacije) moraju uvijek biti na raspolaganju

ovlaštenim osobama, unatoč mogućim nepogodama / nesrećama ili zlonamjernim napadima;

2

- autentičnost (vjerodostojnost, engl. authenticity): osoba B zna da je samo osoba A mogla poslati poruku koju je ona (osoba B) primila;

- neporecivost (nepobitnost, ne-nepriznavanje, engl. non-repudiation): osoba A ne može zanijekati da je poslala poruku koju je osoba B primila (ako ju zaista poslala).

Može se napomenuti sljedeće: - prva tri zahtjeva (povjerljivost, integritet, raspoloživost) se često smatraju osnovnim

zahtjevima;

- raspoloživost se ne može povećati pomoću kriptografije, čak se ponekad može i smanjiti (kriptiranje i dekriptiranje poruka traje neko vrijeme);

- često se navodi i šesti zahtjev, autorizacija (engl. authorization): autentificirani korisnik može

pristupati samo sadržajima koji su mu dopušteni, i to na način koji mu je dopušten; autorizacijom se dodatno osiguravaju povjerljivost i/ili integritet; autorizacija se ne rješava (direktno) pomoću kriptografije;

- zahtjev autentičnosti i neporecivosti (poruke) izgledaju slično, pa se može činiti da su

ekvivalentni; no, autentičnost ne implicira neporecivost, jer bi npr. osoba B mogla sama sebi poslati poruku kriptiranu simetričnim ključem i tvrditi da je poruku poslala osoba A (koja jedina, uz osobu B, zna taj ključ); no, ako se primjenjuje asimetrični kriptosustav, onda osoba B ne može sama sebi poslati kriptiranu poruku u ime osobe A (jer samo osoba A ima tajni ključ) i može se sigurno tvrditi da je to poruka od osobe A; s druge strane, neporecivost ne implicira autentičnost, jer se osoba C može lažno predstaviti kao da je osoba A i koristiti svoj javni i privatni ključ (C može znati javni ključ osobe A, ali ne može znati tajni ključ osobe A).

Drži se da je zahtjev neporecivosti (poruke) jedini zahtjev koji se ne može elegantno riješiti pomoću

simetričnih kriptosustava. No, asimetrični kriptosustavi puno su pogodniji i za rješavanje zahtjeva integriteta i autentičnosti. S druge strane, zahtjev povjerljivosti (naročito kod velikih poruka) najčešće se rješava pomoću simetričnih kriptosustava, koji su puno brži i traže ključeve manjih veličina (za istu razinu sigurnosti) u odnosu na asimetrične kriptosustave. Kod zahtjeva povjerljivosti, asimetrični kriptosustavi se najčešće koriste samo za razmjenu simetričnog ključa (kojim će se kriptirati poruka i osigurati njena povjerljivost). 2. SIMETRIČNI I ASIMETRIČNI KRIPTOSUSTAVI

Do kraja 60-tih godina prošlog stoljeća glavna primjena kriptografije bila je u vojne i diplomatske svrhe, pa su pojedine države (ili čak organizacije) imale svoje specifične kriptosustave. No, tada je došlo do širokog razvoja međunarodnih financijskih transakcija, pa se pojavila potreba za kriptosustavima koje će moći koristiti korisnici širom svijeta, tj. pojavila se potreba uvođenja (međunarodnih) standarda u kriptografiji.

Na temelju programa i javnog natječaja za zaštitu računalnih i komunikacijskih podataka koji je 1972./73. inicirao američki National Bureau of Standard (NBS), 1976. je prihvaćen kao standard kriptosustav koji je dobio ime Data Encryption Standard (DES), a koristi 56-bitne ključeve. Taj je standard bio u širokoj upotrebi sve do kraja 20. stoljeća (iako se koristi i danas), ali je već početkom 90-tih godina postalo jasno da je samo pitanje vremena kad će DES postati nesiguran, što se prvi put javno pokazalo 1998. godine. Zato je 1997. godine National Institute of Standards and Technology (NIST), organizacija koja je naslijedila NBS, raspisala natječaj za kriptosustav koji će naslijediti DES. Kao privremeni standard određen je prošireni DES standard imena 3DES (trostruki DES), koji koristi 168-bitne ključeve. Nasljednik DES-a izabran je 2000. godine i dobio je ime Advanced Encryption Standard (AES), a koristi 128, 192, ili 256-bitne ključeve.

Navedeni kriptosustavi su simetrični kriptosustavi, tj. koriste isti ključ i u procesu kriptiranja (enkripcije, šifriranja) i u procesu dekriptiranja (dekripcije, dešifriranja), što znači da je ključ poznat i pošiljatelju i primatelju poruke (i samo njima). No, taj simetrični ključ ima manu da se mora (na siguran način) razmijeniti među sudionicima u komunikaciji, što nije veliki problem kod zatvorenih sustava s malim brojem sudionika u komunikaciji, ali je problem kod današnjih otvorenih sustava s nepoznatim i velikim brojem sudionika. Zato su razvijeni asimetrični kriptosustavi (ili kriptosustavi s javnim ključem). Glavna ideja je da se konstruiraju kriptosustavi kod kojih je na temelju poznavanja funkcije kriptiranja praktički nemoguće izračunati funkciju dekriptiranja. Svaki sudionik u komuniciranju ima svoj javni ključ,

3

koji može biti poznat svima, i svoj tajni ključ, koji je poznat samo njemu. Kriptiranje se radi javnim ključem primatelja, a dekriptiranje tajnim ključem primatelja (kod digitalnog potpisa je drugačije!), tako da samo primatelj može pročitati poruku. Asimetrični kriptosustavi nisu zamjena za simetrične, već jedni druge nadopunjuju, čime se dobivaju hibridni kriptosustavi.

Može se dati ovakva usporedba između simetričnih kriptosustava (SK) i asimetričnih kriptosustava

(AK): - sigurnost: kod AK, samo privatni ključ mora biti tajan, a javni ključ se može slobodno

distribuirati; kod SK, zajednički (simetrični) ključ mora biti poznat dvjema (ili više) sudionicima u komunikaciji; nije dokazano da su AK sigurni, ali isto vrijedi i za SK, osim u slučaju kada se simetrični ključ upotrebljava samo jedanput;

- dugotrajnost ključa: kod AK, isti par ključeva se može koristiti dugo vremena, a kod SK je poželjno mijenjati ključ kod svake sesije;

- upravljanje ključevima (engl. key management): ako je n broj sudionika u međusobnoj komunikaciji, SK traži ukupno n * (n – 1) / 2 ključeva, pri čemu svaki sudionik mora kod sebe pamtiti (n – 1) ključ; kod AK, treba ukupno n javnih ključeva, koji se mogu slobodno pohraniti na nekom pristupačnom mjestu (bazi javnih ključeva), a svaki sudionik mora pamtiti samo svoj tajni ključ (u pravilu pamti i svoj javni ključ, da ne mora za njega pristupati bazi);

- razmjena ključeva: kod AK se ne moraju razmjenjivati ključevi između sudionika; razmjena

ključeva kod SK je obavezna; budući da je to opasno, upravo se AK koristi za sigurnu razmjenu simetričnog ključa, čime se onda omogućava SK (zajedno je to hibridni kriptosustav);

- efikasnost: AK su značajno sporiji od SK; npr. RSA kriptosustav je oko 1000 puta sporiji od

DES kriptosustava;

- veličina ključeva: ključevi za AK su značajno veći od ključeva za SK (za istu razinu sigurnosti); npr. privatni ključ u RSA mora imati barem 1024 bita, dok je kod većine SK 128 bitova dovoljno.

U nastavku su dati neki vrlo važni pojmovi kod primjene asimetričnih kriptosustava (primjenjuju se

samostalno, ili zajedno sa simetričnim kriptosustavima). Sažetak (hash, digest): za razliku od funkcije kriptiranja, koja je matematički gledano injektivna

funkcija, tj. funkcija koja dva različita X-a preslikava u dva različita Y-a, funkcija sažetka može preslikavati više X-eva u isti Y, što znači da nema inverznu funkciju. Koristi se kao pomoćno sredstvo, npr. kod spremanja hash-a lozinki (umjesto samih lozinki) u bazu podataka, kod digitalnog potpisa i dr.

Digitalna omotnica: njome se postiže povjerljivost poruke. Za to bi se mogli koristiti i samo

simetrični ključevi. No, budući da je razmjena nekriptiranih simetričnih ključeva opasna, pošiljatelj kreira novi simetrični ključ (samo za tu sesiju), pomoću tog ključa kriptira izvornu poruku, a onda simetrični ključ kriptira pomoću javnog ključa primatelja, te onda šalje oboje - poruku kriptiranu simetričnim ključem i kriptirani simetrični ključ. Primatelj prvo dekriptira kriptirani simetrični ključ (svojim tajnim ključem, što znači da samo on to može napraviti), a onda tako dobivenim simetričnim ključem dekriptira izvornu poruku. Navedeno je prikazano na slici 1.

Digitalni potpis: njime se postiže integritet i neporecivost poruke. Pošiljatelj uz izvornu

(nekriptiranu) poruku šalje i izvornu poruku kriptiranu pomoću svog tajnog ključa (suprotno od uobičajene sheme asimetričnog kriptiranja, npr. one kod digitalne omotnice!). Primatelj pomoću javnog ključa pošiljatelja dekriptira poruku i uspoređuje ju s izvornom. Budući da samo pošiljatelj zna svoj privatni ključ, osiguran je integritet i neporecivost poruke. Zapravo, u praksi se najčešće ne kriptira izvorna poruka, već sažetak (hash) izvorne poruke, a razlozi su (barem) sljedeći: sažetak je kraći od izvorne poruke, pa se brže kriptira/dekriptira (važno je, jer su asimetrični kriptosustavi spori), ukupna poruka je kraća, izvorna poruka se može isto kriptirati (što onda čini digitalni pečat). U ovoj varijanti primatelj uspoređuje dobiveni sažetak s onim koji sam izračunava, kako je prikazano na slici 2.

4

Slika 1. Digitalna omotnica; Izvor [8]

Slika 2. Digitalni potpis; Izvor [8] Digitalni pečat: njime se postiže povjerljivost, integritet i neporecivost poruke. Digitalni pečat je

kombinacija digitalne omotnice i digitalnog potpisa, tj. digitalni pečat je digitalno potpisana digitalna omotnica.

Digitalni certifikat: njime se postiže autentičnost poruke. Digitalni certifikat je (specijalna) poruka

koja je (najčešće) digitalno potpisana od certifikacijskog centra (engl. Certification Authority, CA), kome se po definiciji vjeruje. Ta (specijalna) poruka sadrži barem par podataka - identifikator i javni ključ pošiljatelja. U praksi certifikat obično sadrži i podatak o roku valjanosti, primijenjenim algoritmima za sažimanje i kriptiranje kod potpisivanja, i dr. Pomoću digitalnog certifikata primatelj može provjeriti da li je dobiveni (od nekog pošiljatelja) javni ključ jednak onome koji piše u digitalnom certifikatu, tj. da li je pošiljatelj autentičan (onaj kojim se predstavlja).

5

3. OPIS RSA KRIPTOSUSTAVA

Diffie-Hellmanov postupak za razmjenu tajnog ključa

Iako je RSA prvi kriptosustav s javnim ključem (objavljen 1977. godine), začetnicima kriptografije

javnog ključa smatraju se Diffie i Hellman, koji su 1976. godine objavili postupak (protokol) za razmjenu tajnog (simetričnog) ključa. Njihov postupak, iako služi za sigurnu razmjenu simetričnog ključa (tj. kod njihovog postupka se ne radi o javnim i tajnim ključevima, odnosno asimetričnom kriptosustavu), dao je ključnu ideju za realizaciju kriptosustava s javnim ključem – ideju da se konstruiraju kriptosustavi kod kojih bi iz poznavanja funkcije kodiranja bilo praktički nemoguće (u nekom razumnom vremenu) izračunati funkciju dekodiranja. Tada bi funkcija kodiranja mogla biti javna.

Diffie-Hellman postupak za razmjenu ključeva zasnovan je na činjenici da je u nekim grupama potenciranje puno jednostavnije od logaritmiranja (problem diskretnog logaritma).

Kriptosustavi s javnim ključem i RSA kriptosustav

U kriptosustavu s javnim ključem svaki korisnik ima dva ključa: javni EK i tajni DK (slova E i D

označavaju glavnu namjenu tih ključeva: Enkripcija i Dekripcija). Ako Ana želi poslati Branku poruku P,

onda je ona kodira pomoću Brankovog javnog ključa EBK i pošalje Branku šifrat C:

),( EBKPEC .

Branko dekodira šifrat koristeći svoj tajni ključ DBK :

),( DBKCDP tj.

)),,(( DBEB KKPEDP .

Napomena: u engleskoj literaturi uobičajena imena za glavne sudionike u komunikaciju su Alice i

Bob (kod nas Ana i Branko), a ti su likovi uvedeni upravo u prvom radu o RSA kriptosustavu. RSA je prvi i najpoznatiji kriptosustav s javnim ključem, objavljen 1977. godine, a nazvan je po

svojim tvorcima Ronaldu Rivestu, Adi Shamiru i Leonardu Adlemanu. Njegova sigurnost je zasnovana prvenstveno na teškoći faktorizacije velikih prirodnih brojeva. No, otvoreno je pitanje je li razbijanje RSA

kriptosustava, tj. određivanje x iz poznavanja nxe mod ekvivalentno faktorizaciji od n.

Postupak izgradnje RSA kriptosustava

1. Odaberu se dva tajna velika prosta broja p i q, svaki veličine barem 512 bitova (a

preporučljivo je i 1024). 2. Izračunava se umnožak n = p q.

3. Izračunava se umnožak (n) = (p – 1) (q – 1).

4. Odabere se broj e < (n) i relativno prost u odnosu na (n),

tj. takav da je nzd (e, (n)) = 1.

5. Izračunava se broj d < (n) tako da bude:

e d 1 (mod (n)), što se može napisati i kao:

e d k (n) + 1

(može se primijetiti da zato što su broj e i umnožak e d relativno prosti u odnosu na (n),

automatski je i broj d relativno prost u odnosu na (n)). 6. Brojevi e i n se obznanjuju i čine javni ključ. 7. Brojevi p, q, d su tajni, pri čemu je d tajni ključ (zajedno sa n, koji je javno poznat).

6

Kriptiranje se obavlja funkcijom kriptiranja:

,mod),(),( nPKPRSAKPEC e

EE

a dekriptiranje funkcijom dekriptiranja:

nPnnPnCKCRSAKCDP edded

DD modmod)mod(mod),(),( 1 .

U nastavku se pokazuje da je taj postupak korektan, tj. da je:

)(mod nPPed .

Zapravo, mora se primijetiti da je navedeni postupak korektan samo ako je veličina poruke P manja

od n. Ako je poruka P n (što je u pravilu često), onda se izvorna poruka P razbija na poruke

rPPP ,...,, 21 od kojih je svaka manja od n, te se svaka zasebno kriptira i dekriptira.

Provjera korektnosti RSA kriptosustava

Treba pokazati da je:

)(mod nPPed .

Budući da je:

e d k (n) + 1 = k (p – 1) (q – 1) + 1, može se za one P koji nisu kongruentni s 0 (mod p), što znači da nisu višekratnici od p, koristiti mali

Fermatov teorem (prikazan u prilogu A) i dobiti:

)(mod)1()( pPPPPPP 1) -(q k1) - (p 1 1) -(q 1) - (p ked 1) - (q k

.

To je, također, trivijalno ispunjeno i kada je P višekratnik od p, jer je tada:

)(mod0 pP ,

pa općenito vrijedi:

)(mod pPPed.

Analogno vrijedi i za q, pa se iz (posebnog slučaja) kineskog teorema o ostatcima (prilog A) dobiva:

)(mod)(mod)(mod nPPqPPpPP ededed .

Neke praktične napomene vezane za RSA kriptosustav

Važna praktična pitanja su: 1. Kako dobiti dva velika prosta broja p i q?

2. Kako odabrati javni ključ e?

3. Kako izračunati tajni ključ d? Odgovori mogu biti sljedeći: 1. Budući da je teškoća faktorizacije velikih prirodnih brojeva osnova za sigurnost RSA

kriptosustava, ne možemo faktorizacijom naći dokazivo proste brojeve p i q. Zato se nalaze vjerojatno prosti brojevi, npr. pomoću heurističkog ispitivanja po Miller-Rabinu (prikazano u prilozima A i B). Zbog sigurnosti je preporučljivo da p i q ne budu preblizu jedan drugome, da p - 1 i q - 1 imaju barem jedan veliki prosti faktor, ali ne zajednički, jer je poželjno da p - 1 i q - 1 nemaju velikih zajedničkih faktora.

2. Za javni ključ e nekad se preporučivalo uzeti broj 3, ali se pokazalo da nije dobro imati jako mali

broj e, pa se danas preporučuje staviti 655371216 e , što je broj koji je i pogodan za

računanje. No, može ga se i generirati nekim (pseudo)slučajnim postupkom. 3. Tajni ključ d može se izračunati na temelju proširenog Euklidovog algoritma (prilog A i B).

7

Neke druge metode za zasnivanje kriptosustava s javnim ključem RSA kriptosustav spada u asimetrične kriptosustave čija je sigurnost zasnovana prvenstveno na

teškoći faktorizacije velikih prirodnih brojeva. Drži se da je teškoća faktorizacije velikih prirodnih brojeva ekivalentna teškoći nalaženja "klasičnog" diskretnog logaritma, tako da su kriptosustavi koji primjenjuju jednu ili drugu metodu u načelu isto sigurni (kod istih veličina ključeva). Primjer poznatog kriptosustava koji koristi metodu "klasičnog" diskretnog logaritma je kriptosustav ElGamal, nazvan po svom autoru (Taher ElGamal).

No, asimetrični kriptosustavi koji rade na temelju teškoće nalaženja diskretnog logaritma u grupi eliptičkih krivulja nad konačnim poljem K za istu sigurnost traže značajno manje ključeve. Takvi se kriptosustavi zovu kriptosustavi temeljeni na eliptičkim krivuljama (Elliptic Curve Cryptosystem, ECC). Procjenjuje se da su danas (oko 2010. godine) ekvivalentno sigurni RSA ključevi duljine 1369 bita i ECC ključevi duljine 146 bita (ECC su skoro 10 puta manji), a da će 2040. godine (zbog procijenjenog povećanja snage klasičnih, ne-kvantnih računala) ekvivalentno sigurni RSA i ECC ključevi biti duljine 3214 i 191 bita (ECC su skoro 17 puta manji). To je osobito važno kod onih primjena kod kojih je prostor za pohranu ključeva ograničen (npr. kod pametnih kartica). Treba napomenuti da su u Java 7 uvedene funkcije za kriptiranje pomoću eliptičkih krivulja.

4. KRIPTIRANJE PODATAKA U TRANZITU

Kriptiranje podataka koji su u tranzitu nije vezano samo za baze podataka i takvo se kriptiranje uglavnom koristilo i prije kriptiranja podataka koji stoje u bazi. Kada je riječ o Oracle bazi, postoje rješenja kriptiranja podataka u tranzitu koja su vezana uz Oracle bazu, ali postoje i rješenja nezavisna od Oracle baze. No, obje varijante kriptiranja podataka u tranzitu imaju isti cilj, zaštiti tri vrste paketa (podataka baze) koji se prenose mrežom:

1. paketi koji služe za inicijaciju sesije između klijenta i servera baze podataka; 2. paketi koje klijent šalje bazi, uključujući SQL naredbe; 3. paketi koje baza, kao odgovore, šalje klijentu.

Jasno je zašto se želi zaštiti 3.vrstu paketa, jer su to podaci, a i 2.vrstu paketa, SQL naredbe, jer se

i u njima mogu nalaziti neki tajni podaci (npr. broj kreditne kartice u SQL upitu i sl.). No, važno je zaštiti i 1.vrstu paketa (podaci za inicijaciju sesije), bez obzira što Oracle baza uvijek

tokom logon procesa prenosi lozinku u kriptiranom obliku (bez obzira da li je promet mrežom kriptiran ili nije). Ako promet mrežom nije kriptiran, tokom postupka identifikacije/autentikacije na Oracle bazu može se pojaviti jedna potencijalna ranjivost.

Postupak identifikacije/autentikacije (kod baze 11g) pojednostavljeno ide tako da klijent prvo pošalje bazi korisničko ime. Baza na temelju korisničkog imena potraži u sistemskim tablicama hash vrijednost lozinke za tog korisnika (lozinka se nikada ne sprema u Oracle bazu, pa ni kriptirana). Baza generira slučajni ključ za novu sesiju, taj ključ kriptira pomoću hash vrijednosti lozinke (koristeći AES algoritam) i šalje klijentu tako kriptirani ključ sesije. Klijent dekriptira primljeni serverski ključ sesije, koristeći hash vrijednost lozinke koju je korisnik unio. Zatim klijent generira vlastiti (klijentski) ključ sesije, te uz pomoć oba ključa sesije (serverskog i klijentskog) kriptira lozinku (koristeći AES), te ju šalje serveru, zajedno s kriptiranim klijentskim ključem sesije (kojega isto kriptira pomoću hash vrijednost lozinke, koristeći AES). Server sada može dekriptirati klijentski ključ sesije, te uz pomoć njega i svog ključa sesije dekriptirati primljenu lozinku, izračunati njen hash i na kraju ga usporediti sa hash vrijednošću koja je spremljena u bazi. Ranjivost navedenog postupka sastoji se u tome da napadač koji na neki način sazna hash vrijednost lozinke iz baze može, osluškujući mrežu, dekriptirati serverski i klijentski ključ sesije, te onda dekriptirati i lozinku. Ako je promet mrežom kriptiran, te ranjivosti nema. Naravno, može se primijetiti da postoji značajna ranjivost baze ako netko nepozvan može saznati hash vrijednost lozinki iz baze.

Sam proces kriptiranja podataka u tranzitu može se raditi pomoću dva Oracle rješenja, koja se dobivaju samo uz opciju Advanced Security Options (ASO). Jedno je rješenje tzv. Network Data Encryption (NDE), a drugo se zasniva na Secure Socket Layer (SSL). Preporuča se korištenje NDE rješenja, jer je jednostavnije od SSL varijante.

Osim ta dva Oracle rješenja, moguće je koristiti i nezavisna softverska ili hardverska rješenja, npr. različite varijante tuneliranja (jedna od njih je Secure Shell - SSH), Internet Security Protocol (IPSec), ili hardverske akceleratore (koji, za razliku od softverskih rješenja, ne opterećuju procesore klijenta/servera), npr. mrežne kartice koje podržavaju enkripciju/dekripciju.

8

5. KRIPTIRANJE PODATAKA NA DISKOVIMA

Kriptiranje podataka koji nisu u tranzitu, a najčešće je riječ o podacima na diskovima, postalo je predmet velike pažnje zadnjih 10-tak godina. Naime, bez obzira na sve druge načine osiguravanja podataka u bazi, vidjelo se da su jako opasni oni slučajevi u kojima se ukradu podaci na diskovima, pa onda napadači imaju dovoljno vremena i mogućnosti da pristupe osjetljivim podacima i kada nemaju direktan pristup kroz bazu podataka. Podaci iz baze podataka mogu, ako nisu kriptirani, biti relativno lako dostupni i van sustava za upravljanje bazom podataka, npr. može se i sa običnim uređivačem teksta dobiti uvid u podatke, S druge strane, nije dovoljno da budu zaštićeni samo podaci koji se direktno nalaze u bazi podataka, već i podaci koji su nastali npr. backup-om tih podataka.

Poduzeća (ali i druge organizacije) danas pristupaju kriptiranju podataka na diskovima najčešće iz tri razloga (ili kombinacije tih razloga):

- da bi spriječili lošu reputaciju koju dobiju nakon što se otkrije da su napadači otuđili osjetljive

podatke;

- da izbjegnu ili smanje financijske troškove koje imaju zbog odšteta koje su dužne nadoknaditi oštećenim stranama;

- da budu u skladu s različitim regulatornim propisima o zaštiti podataka, naročito zaštiti

privatnih podataka. Kriptiranju podataka na diskovima može se pristupiti na tri različita načina: - "ručno" kriptiranje se radi kroz aplikaciju/aplikacije, programiranjem; dobra strana takvog

načina kriptiranja je da je vrlo fleksibilno – programiranjem se može postići manje-više sve što se želi; loše strane su brojne; kriptiranje kroz aplikaciju ne može se izvesti na brzinu, jer su aplikacije kompleksne i treba puno toga u njima mijenjati; kriptiranje uvijek pogoršava performanse, a kriptiranje vlastitim programiranjem najčešće je najsporije; kod kriptiranja vlastitim programiranjem često se zaboravi neko područje (neka aplikacija), pa onda napadač može iskoristiti tu slabost i kroz nju dobiti nekriptirane podatke; na kraju, najveća mana kriptiranja vlastitim programiranjem je da se ne može na adekvatan način zaštiti ključeve za kriptiranje;

- "automatsko" kriptiranje kroz sustav za upravljanje bazom podataka; bolje je od prethodne varijante; SUBP sustavi danas imaju dosta napredne mogućnosti "transparentnog" kriptiranja, kod kojega aplikacija niti "ne zna" da su podaci kriptirani; no, za razliku od programiranja kroz aplikaciju, "transparentno" kriptiranje ne pomaže kod sakrivanja podataka od onih koji imaju pristup bazi;

- "automatsko" kriptiranje na razini diskovnog sustava; u ovom slučaju ne kriptiraju se samo

podaci u bazi, već svi (željeni) podaci na diskovima, bili u bazi podataka ili ne; ovaj način kriptiranja podataka možda je najtransparentniji (za aplikaciju) i najjednostavniji; u nastavku se ovaj način kriptiranja ne prikazuje, već se prikazuju samo prva dva načina kriptiranja, koja su vezana za bazu podataka.

Kod kriptiranja podataka u bazi podataka, bilo programiranjem ili "automatski" kroz SUBP, postoje

različite varijante korištenja ključeva za kriptiranje (napomena: u načelu se uvijek radi o simetričnom kriptiranju):

- postoji jedan ključ za kriptiranje podataka u cijeloj bazi podataka;

- postoji jedan ključ za svaku tablicu baze podataka (ili neki drugi dio baze podataka, npr. tablespace baze podataka);

- postoji jedan ključ za svaki stupac koji se kriptira;

- postoji jedan ključ za svaki redak koji se kriptira;

- različite kombinacije prethodnog.

9

Također, vrlo je važno (ako ne i najvažnije) pitanje – gdje se sprema ključ (ključevi):

- u bazu podataka; - u datoteke izvan baze podataka (na serveru baze podataka, aplikacijskom serveru ili klijentu): - u programski kod aplikacije; iako ovo rješenje izgleda primamljivo, ono je najlošije, jer postoje

različiti načini dekodiranja (disasembliranja) programa i dolaska do ključa koji je sakriven u programu.

6. KRIPTIRANJE PODATAKA POMOĆU PAKETA DBMS_CRYPTO Kako je već prije navedeno, "ručno" kriptiranje (kroz aplikaciju, programiranjem) podataka u bazi

vrlo je zahtjevno i u načelu se ne preporučuje. Traži puno vremena za izvedbu, ima najlošije performanse, omogućuje ostavljanje "rupa" u kriptiranju, a najveći je problem kod njega – kako upravljati ključevima za kriptiranje. Bez obzira na te mane, u Oracle 11g nekada se mora koristiti "ručno" kriptiranje, a najvažnija dva slučaja jesu:

- na raspolaganju je samo Standard edicija baze, koja nema mogućnosti za "transparentno"

kriptiranje (koje je dodatna opcija u Enterprise ediciji);

- želi se kriptirati (neke) podatke i korisnicima baze - "transparentno" kriptiranje ne može sakriti podatke korisnicima baze.

Za "ručno" kriptiranje koristi se paket (na bazi) DBMS_CRYPTO. DBMS_CRYPTO ima sljedeće mogućnosti: - podržava kriptografske algoritme: DES, 3DES, 3DES_2KEY, AES, RC4; ako nema nekog

posebnog razloga, preporučljivo je koristiti algoritam AES, koji omogućava kriptiranje sa 128, 192 ili 256-bitnim ključevima;

- kriptografski hash algoritmi: MD5, SHA-1, MD4;

- MAC algoritmi (algoritmi za autentikaciju poruka) HMAC_MD5, HMAC_SH1;

- kriptografski generatori pseudoslučajnih brojeva u formatu RAW, NUMBER, BINARY_INTEGER;

- kriptiranje blokova podataka: kriptiranje ulančavanjem blokova (Cipher Block Chaining, CBC)

gdje se prethodni kriptirani blok zbraja (XOR) sa novim blokom prije kriptiranja, dvije varijante koje su slične prethodnom - CFB (Cipher Feedback Chaining) i OFB (Output Feedback Chaining), te varijanta koju bi trebalo izbjegavati – ECB (Electronic Notebook), jer kod nje isti ulaz uvijek daje isti izlaz, pa se na temelju statističke analize teksta može pokušati dekriptirati poruka;

- ispunjavanje (padding) podataka nulama ili pomoću metode PBCS5 (preporučljivo).

U nastavku slijedi prikaz korištenja paketa DBMS_CRYPTO, koji uključuje i usporedbu performansi

bez / sa kriptiranjem. Prvo se radi pomoćni paket:

create or replace package encryption_wrapper as

function encrypt (p_string in varchar2, p_key in varchar2)

return raw;

function decrypt (p_raw in raw, p_key in varchar2)

return varchar2;

end;

10

create or replace package body encryption_wrapper as

g_encrypt_typ constant PLS_INTEGER default

DBMS_CRYPTO.ENCRYPT_AES256

+ DBMS_CRYPTO.CHAIN_CBC

+ DBMS_CRYPTO.PAD_PKCS5;

function padkey (p_key in varchar2)

return raw is

begin

return utl_raw.cast_to_raw(rpad(p_key,32));

end;

function encrypt (p_string in varchar2, p_key in varchar2)

return raw

is

begin

return

dbms_crypto.encrypt

(src => UTL_I18N.STRING_TO_RAW (p_string, 'AL32UTF8'),

typ => g_encrypt_typ,

key => padkey (p_key));

end;

function decrypt (p_raw in raw, p_key in varchar2)

return varchar2

is

begin

return utl_i18n.raw_to_char (

dbms_crypto.decrypt

(src => p_raw,

typ => g_encrypt_typ,

key => padkey (p_key)),

'AL32UTF8');

end;

end;

Prethodni paket koristi se za kriptiranje tablice T (koristi se i pomoćna tablica STAGE, iz koje se puni pomoćna tablica T):

create table stage as

select object_name from all_objects;

create table t (

last_name varchar2(30),

encrypted_name raw(32)); -- ovaj će se stupac kriptirati

Ovo je primjer punjenja tablice T iz tablice STAGE bez kriptiranja, metodom redak po redak, koja

je najsporija:

declare

l_start number := dbms_utility.get_cpu_time;

begin

for x in (select object_name from stage) loop

insert into t (last_name) values ( x.object_name );

end loop;

dbms_output.put_line

((dbms_utility.get_cpu_time - l_start) || ' hsecs' );

end;

431 hsecs (= 4,31 sekundi rada CPU-a).

11

Slijedi primjer punjenja tablice T iz tablice STAGE sa kriptiranjem: truncate table t;

declare

l_start number := dbms_utility.get_cpu_time;

begin

for x in (select object_name from stage) loop

insert into t (encrypted_name)

values (

encryption_wrapper.encrypt

(x.object_name, 'Secret Key Secret Key Secret Key'));

end loop;

dbms_output.put_line

((dbms_utility.get_cpu_time - l_start) || ' hsecs' );

end;

2502 hsecs

Vidi se da je INSERT sa kriptiranjem oko 6 puta sporiji od INSERT-a bez kriptiranja. Daleko veće razlike, na štetu kriptiranja, dobile bi se kada bi se unos podataka radio masovnom (bulk) metodom, tj. više redaka odjednom. Slično kao INSERT ponašaju se i UPDATE i SELECT naredbe. Jedino DELETE ne ovisi o (ne)kriptiranju. 7. PROBLEMATIKA KLJUČEVA I ORACLE WALLET

Kako je već prije navedeno, jedan od najvećih problema kod kriptiranja podataka u bazi je – gdje

spremiti ključ(eve) za kriptiranje. Ključ se može staviti npr. u programe, ali (kako je već navedeno) znalcima je relativno lako doći do ključeva skrivenih u programu. Moguće ih je staviti u bazu podataka, no onda onaj koji ukrade bazu podataka, ukrade i ključeve. Moguće ih je staviti u datoteke izvan baze podataka. No onda te datoteke moraju biti kriptirane, a slijedi pitanje gdje držati ključ za kriptiranje tih datoteka, itd. Također, treba napomenuti da je rješenje po kojemu prije pristupa podacima korisnik (na neki način) predaje ključeve, vrlo nepraktično, osim ako se koristi hardverski modul za sigurnost (Hardware Security Module, HSM).

Osim pitanja gdje spremiti ključ(eve), postavljaju se i neka druga praktična pitanja. Poznato je da ključeve za kriptiranje treba svako toliko mijenjati. No, ako imamo backup(e) podataka koji su kriptirani starim ključem(ključevima), onda imamo potrebu čuvanja tog starog ključa(ključeva).

Uglavnom, vidi se da problem upravljanja ključevima za kriptiranje nije jednostavno riješiti. Oracle u Enterprise ediciji, sa ASO opcijom, nudi jedno rješenje koje naziva Oracle Wallet (novčanik). Wallet je datoteka izvan baze (zapravo, može biti više datoteka, tj. više walleta) koja sadrži ključeve za kriptiranje (i dekriptiranje, jer je riječ o simetričnim algoritmima), a sadržaj te datoteke je kriptiran lozinkom. Lozinka se zadaje prilikom kreiranja walleta, ali se može naknadno mijenjati. Prije nego se otvori baza podataka (iako može i kasnije), administrator baze podataka (ili netko drugi koji zna lozinku) otvori wallet, a onda baza podataka može koristiti ključeve koji su pohranjeni u wallet-u za kriptiranje/dekriptiranje podataka u bazi. Moguće je koristiti i tzv. auto-login wallet, koji se sam pokrene kod startanja baze. Iako može izgledati kako takav auto-login način rada nema smisla, on ima smisla u onim slučajevima kada netko može ukrasti podatke ali ne i server, jer auto-login način rada funkcionira samo na istovjetnom serveru na kojem je instaliran. Postoji i treći način korištenja walleta, koji je zapravo i najsigurniji, a to je da se wallet nalazi na posebnom HSM modulu. HSM modul, osim sigurnosti, može povećati i performanse, jer on može preuzeti na sebe kriptiranje/dekriptiranje podataka i time odteretititi bazu podataka.

No, najčešći način korištenja Oracle Walleta je pomoću lozinke, što se u nastavku ukratko prikazuje. Kao prvo, u Oracle SQLNET.ORA parametarskoj datoteci mora biti zapisano gdje se wallet nalazi, npr.:

ENCRYPTION_WALLET_LOCATION=

(SOURCE=(METHOD=FILE)(METHOD_DATA=

(DIRECTORY=/home/ora11gr2/network/admin/)

))

12

Nakon toga se kreira wallet, sa:

ALTER SYSTEM SET ENCRYPTION KEY

IDENTIFIED BY lozinka_za_wallet;

Kada se starta baza, nakon otvaranja baze mora se pokrenuti otvaranje walleta: ALTER SYSTEM SET ENCRYPTION WALLET OPEN

IDENTIFIED BY lozinka_za_wallet;

Ako se želi privremeno zatvoriti wallet, to se može napraviti sa:

ALTER SYSTEM SET ENCRYPTION WALLET CLOSE

IDENTIFIED BY lozinka_za_wallet;

8. KRIPTIRANJE PODATAKA POMOĆU TDE COLUMN ENCRYPTION

Kao i Oracle Wallet, i Transparent Data Encryption (TDE) Column Security se može koristiti samo u Enterprise ediciji baze, pri čemu je potrebna i ASO opcija. TDE Column Security služi za zaštitu određenih stupaca tablica podataka na disku, u slučaju da netko neovlašteno dođe do tih podataka izvan baze, ali su ti stupci za korisnike baze uvijek transparentno dekriptirani. Treba napomenuti da stupci nisu kriptirani samo u tablicama, već i REDO, UNDO i TEMP pomoćnim strukturama podataka na disku (naravno, i u backup podacima).

Može se kreirati novi kriptirani stupac postojeće tablice, ili kriptirati postojeći stupac, ili kreirati potpuno nova tablica sa kriptiranim stupcem, što se prikazuje u nastavku:

CREATE TABLE t (

c1 varchar2(30),

c2 varchar2(30) ENCRYPT

);

Ako se unese redak u tu tablicu i sa SELECT pogleda sadržaj, činit će se kao da podaci nisu kriptirani – zato jer ih baza sama transparentno dekriptira:

INSERT INTO t VALUES

( '***ovo NIJE kriptirano***', '***ovo JE kriptirano***');

SELECT * from t;

C1 C2

------------------------------ ------------------------------

***ovo NIJE kriptirano*** ***ovo JE kriptirano***

Ako se privremeno zatvori wallet i onda pokuša unijeti novi redak sa oba stupca, vidjet će se da se tada ne može unijeti kriptirani stupac, ali može se unijeti nekriptirani stupac i poslati NULL za kriptirani stupac (jer je kod definicije stupaca omogućena NULL vrijednost). Također, ako je wallet zatvoren ne može se dati SELECT nad kriptiranim stupcima, ali može nad nekriptiranim:

ALTER SYSTEM SET ENCRYPTION WALLET CLOSE

IDENTIFIED BY lozinka_za_wallet;

INSERT INTO t VALUES

( '***ovo NIJE kriptirano***', '***ovo JE kriptirano***');

*

ERROR at line 1:

ORA-28365: wallet is not open

INSERT INTO t VALUES

( '***ovo NIJE kriptirano***', NULL);

13

SELECT c2 FROM t;

*

ERROR at line 1:

ORA-28365: wallet is not open

SELECT c1 FROM t;

C1

------------------------------

***ovo NIJE kriptirano***

***ovo NIJE kriptirano***

Kada se navodi ključna riječ ENCRYPT, postoje tri opcije:

- USING 'algorithm': može se birati AES ili DES enkripcija; u pravilu nema smisla koristiti stari DES algoritam; default je 192-bitni AES (može se birati i 128 ili 256);

- IDENTIFIED BY password: time se može specificirati određeni ključ za enkripciju stupca (i

isto sprema u wallet), a inače se ključ sam generira, za svaki stupac posebno; specificirani ključ je potreban npr. onda kada kriptirane podatke treba seliti na drugu bazu pomoću eksterne tablice;

- SALT ili NO SALT: default je SALT, tj. da baza sama doda određene slučajne (random)

bajtove na početku kriptiranih podataka; time je enkripcija jača, jer istovjetni izvorni podaci nisu više istovjetni nakon kriptiranja, pa je kriptoanaliza otežana; korištenje NO SALT treba ograničiti samo za stupce koji se indeksiraju (indeksirani stupci moraju imati uvijek iste kriptirane podatke za iste izvorne podatke).

TDE Column Security nije bez mana. Jedna mana su smanjene perfomanse u odnosu na bazu bez kriptiranja. To smanjenje performansi

je zavisno od toga što se radi. No, uvijek je brže od rješenja koje se može dobiti programiranjem pomoću paketa DBMS_CRYPTO. Jedan od razloga za gubljenje performansi je i taj što se podaci čuvaju u kriptiranom obliku i u memoriji, tj. u SGA strukturi baze (no, prednost toga je da netko tko bi mogao pristupiti tom dijelu memorije ne bi vidio smislene podatke).

Drugo, zbog potrebe da se kriptirani podaci zaokruže na višekratnik od 16 bajtova, a i zbog dodavanja SALT podataka, TDE Column Security kriptiranje troši i više prostora na disku (i u SGA dijelu memorije).

TDE Column Security ima i neka ograničenja:

- ako kriptirani stupac ima indeks, taj indeks isto mora biti kriptiran (inače kriptiranje gubi smisao), ali onda kriptiranje ne može koristiti SALT opciju, jer indeksirani stupci moraju imati uvijek iste kriptirane podatke za iste izvorne podatke;

- kriptirani indeksi se realno mogu koristiti samo za pretragu određene vrijednosti, ali ne i za

pretragu raspona vrijednosti, jer kriptirani podaci više nemaju smisleni raspon;

- kriptirani stupci se ne mogu koristiti za funkcijske indekse;

- nad kriptiranim stupcima ne mogu se raditi vanjski ključevi.

Kako će se vidjeti u nastavku, TDE Tablespace Security nema gore navedene restrikcije, a i performanse su generalno puno bolje u odnosu na TDE Column Security.

14

9. KRIPTIRANJE PODATAKA POMOĆU TDE TABLESPACE ENCRYPTION

Kao i TDE Column Security, tako se i TDE Tablespace Security može koristiti samo u Enterprise

ediciji baze, pri čemu je potrebna i ASO opcija. TDE Tablespace Security po prvi put je uveden u Oracle bazi 11.1. Kako samo ime kaže, ovdje se ne kriptira samo određeni stupac, već cijeli tablespace.

Za razliku od TDE Column Security, kod TDE Tablespace Security nije moguće kriptirati postojeću tablicu ili postojeći tablespace, već je potrebno kreirati novi kriptirani tablespace i onda u njega kopirati postojeće tablice koje želimo kriptirati. Kreiranje kriptiranog tablespace-a radi se sa:

CREATE TABLESPACE kriptirani_tablespace

DATAFILE ...

ENCRYPTION DEFAULT STORAGE (ENCRYPT);

Kao i kod TDE Column Security, i ovdje je moguće odabrati algoritam za enkripciju, a on može biti 3DES168, AES128, AES192 ili AES256. Default je AES128, a ne AES192 kao kod TDE Column Security, jer je ovdje količina podataka koja se kriptira/dekriptira puno veća - cijeli tablespace, a ne pojedini stupac/stupci.

Svaka tablica koja se kreira u kriptiranom tablespace-u bit će u cijelosti kriptirana. Kriptiranje se radi na razini bloka tablice, a ne retka ili stupca, pa nema potrebe za zaokruživanjem podataka na višekratnik od 16 bajtova, jer je blok podataka sam po sebi višekratnik od 16 bajtova. Također, budući da je svaki blok podataka jedinstven, nije potreban SALT podatak. Rezultat je taj da TDE Tablespace Security ne zauzima dodatni prostor na disku. Dalje, TDE Tablespace Security kriptira podatke prije slanja podataka iz SGA na disk, odnosno dekriptira ih u obrnutom smjeru. To znači da su podaci u SGA u nekriptiranom obliku, što predstavlja potencijalnu ranjivost u slučaju da netko neovlašten može pristupiti SGA području (no, ta je ranjivost samo teoretska, jer takav vjerojatno lako može pristupiti i drugim dijelovima baze, pa i preuzeti DBA prava), ali je prednost u tome da se čitanje/upis u SGA radi brzo.

Za razliku od podataka u SGA, podaci u REDO, UNDO i TEMP pomoćnim strukturama na disku su kriptirani (isto kao i kod TDE Column Security). No, treba uzeti u obzir da nakon kopiranja nekriptirane tablice iz nekriptiranog tablespace-a u kriptirani tablespace, te brisanja nekriptirane tablice, nije sigurno da više nema nekriptiranih podataka (te tablice). Naime, ti podaci ostaju određeno vrijeme u REDO, UNDO i TEMP pomoćnim strukturama. Naravno, ostaju i u backup-iranim podacima. ZAKLJUČAK

Kriptiranje podataka važno je zbog očuvanja privatnosti, integriteta i autentičnosti poruka

(informacija), te zbog osiguranja neporecivosti slanja poruke. Za kriptiranje se koriste simetrični i asimetrični kriptosustavi. Simetrični kriptosustavi su puno brži

(oko 1000 puta), ali asimetrični kriptosustavi omogućavaju razmjenu ključeva među velikim brojem sudionika.

Važno je kriptirati podatke u tranzitu, ali i podatke koji se nalaze na medijima (najčešće diskovima). Podatke na medijima može se kriptirati nezavisno od baze podataka, ili ih se može kriptirati unutar baze podataka.

Oracle baza direktno omogućava simetrično kriptiranje. Kriptografske mogućnosti različitih edicija

Oracle baze 11g su sljedeće:

- Standard edicija baze ima kriptiranje pomoću paketa DBMS_CRYPTO (programiranjem); njime se može postići sve, pa i sakrivanje podataka od (nekih) korisnika u bazi, ali uz lošije performanse i uz otvoreni problem spremanja ključeva za kriptiranje;

- Enterprise edicija sa dodatnom opcijom Advanced Security ima transparentno kriptiranje podataka (TDE); TDE ne služi za sakrivanje podataka od legalnih korisnika baze, već samo za zaštitu podataka u slučaju krađe cijelog računala ili sustava za pohranu podataka; ASO opcija omogućava i dvije varijante kriptiranje podataka u tranzitu - jedno je rješenje tzv. Network Data Encryption (NDE), a drugo se zasniva na Secure Socket Layer (SSL).

Nažalost, značajna je razlika u cijeni između Standard edicije i Enterprise edicije sa dodatnom

opcijom ASO. S druge strane, činjenica je da se vlastitim programiranjem u Standard ediciji vrlo teško može postići sigurnost ključa (ili više ključeva) koju ima skuplja varijanta. No, uvijek postoji i mogućnost korištenja transparentnog kriptiranja na razini diskovnog sustava.

15

LITERATURA

1. Bača, M. (2004): Uvod u računalnu sigurnost, Narodne novine, Zagreb 2. Ben-Natan, R. (2009): HOWTO Secure and Audit Oracle 10g and 11g, Auerbach Publications 3. Budin, L., Golub, M., Jakobović, D., Jelenković, L. (2010): Operacijski sustavi, Element, Zagreb 4. Dujella, A., Maretić, M. (2007): Kriptografija, Element, Zagreb 5. Knox, D. C. (2004): Effective Oracle Database 10g Security by Design, McGraw-Hill 6. Kyte, T. (2009): Expert Oracle Database Architecture, Apress 7. Mollin, R. A. (2007): An Introduction to Cryptography, Chapman & Hall/CRC (Taylor & Francis

Group), Boca Raton 8. Žagar, M. (2008): Otvoreno računarstvo – Sigurnost (prezentacijski materijali), FER, Zagreb 9. Žubrinić, D. (2002): Diskretna matematika, Element, Zagreb Oracle priručnici za bazu 11g Release 2 (2009.): 10. Advanced Security Administrator's Guide

11. Database Security Guide 12. Enterprise User Security Administrator's Guide

16

PRILOG A: Neki matematički pojmovi vezani za RSA kriptosustav

Djeljivost brojeva

Neka su a, d Z. Kaže se da d dijeli a ako je a različito od 0 i ako je d višekratnik od a. Tu činjenicu (da d dijeli a) može se izraziti i na ove načine:

da (d je djelitelj od a; ako d = 1 ili a, zove se trivijalni djelitelj, inače se zove faktor) a = k d (a je višekratnik od d).

Relacija dijeli je refleksivna (aa, tj. svaki broj dijeli sebe samoga), antisimetrična (ako su a i b

različiti i ab, ne može biti da ba) i tranzitivna (ako ab i bc, onda ac). Teorem dijeljenja

Neka su zadani a Z i b N. Onda postoje jedinstveni brojevi q Z i r 0, …, b -1 takvi da je: a = q b + r (q je količnik ili kvocijent, r je ostatak ili reziduum). Činjenica da je r ostatak dijeljenja a sa b može se napisati i ovako: r = a mod b.

Najveći zajednički djelitelj, relativno prosti brojevi

Ako su a, b, d Z i vrijedi da i db tada je d zajednički djelitelj od a i b. Ako je barem jedan od brojeva a, b različit od nule, tada postoji njihov najveći zajednički djelitelj (najveća zajednička mjera). Da je d najveći zajednički djelitelj brojeva a i b, piše se ovako:

d = nzd (a, b) (druga varijanta: d = Nzm (a, b) ). Ako je nzd (a, b) = 1, kaže se da su a i b relativno prosti.

Euklidov algoritam i prošireni Euklidov algoritam

Euklidov algoritam opisan je u Euklidovom djelu Elementi (4. stoljeće p.n.e.). Uobičajeno se koristi za brzo nalaženje najvećeg zajedničkog djelitelja d brojeva a i b.

No, Euklidov algoritam daje i opis efektivnog postupka kojim se može doći do brojeva x, y, c koji zadovoljavaju diofantsku jednadžbu oblika:

a x + b y = c (a i b su zadani, x, y, c se nalaze). Ta jednadžba ima rješenje (koje nije jednoznačno, već postoji beskonačno mnogo rješenja) ako i

samo ako je minimalno rješenje za c jednako nzd (a, b). Tzv. prošireni Euklidov algoritam koristi se da se, uz nzd (a, b), nađu i brojevi x i y koji zadovoljavaju navedenu jednadžbu. Prosti brojevi (prim-brojevi) i osnovni teorem aritmetike

Prosti brojevi su prirodni brojevi veći od 1 koji su djeljivi samo sa 1 i samim sobom, tj. nemaju faktore. Brojevi koji nisu prosti zovu se složeni brojevi (i imaju faktore).

Osnovni teorem aritmetike kaže da se svaki prirodni broj a > 2 može prikazati na jedinstven način kao umnožak potencija svojih prostih djelitelja, pri čemu su prosti djelitelji poredani po veličini (manji lijevo):

....21

21ke

k

eepppa

Ako je broj a složen, to se zove rastav ili faktorizacija broja a na proste faktore. Prostih brojeva ima beskonačno mnogo (dokaz je dat u Euklidovim Elementima). Broj prostih brojeva

koji su manji ili jednaki broju x uobičajeno se označava sa (x). Vrijedi:

(x) x / ln x, kad x . Iz toga proizlazi da je vjerojatnost P da neki slučajno izabrani veliki broj n bude prosti:

P (n je prosti broj) (n / ln n) / n = 1 / ln n.

Ekvivalentnost po modulu (kongruencija po modulu)

Kaže se da su brojevi a, b Z ekvivalenti po modulu m (ili kongruentni po modulu m, ili kongruentni modulo m) ako je njihova razlika djeljiva sa m, tj. ako vrijedi:

m(a – b) (ili a – b = k m). Tada se piše:

a b (mod m) (čita se: a je ekvivalentan (kongruentan) b po modulu m).

17

Može se pokazati da su tada (i samo tada) ostatci dijeljenja a sa m, odnosno b sa m jednaki:

a b (mod m) a mod m = b mod m. Relacija kongruencija po modulu m je refleksivna, simetrična i tranzitivna.

Eulerova (phi) funkcija

Funkcija : N N koja prirodnom broju n pridružuje broj prirodnih brojeva koji su < n i relativno

prosti sa n zove se Eulerova funkcija. Definira se da je (1) = 1.

Ako je n složeni broj, koji ima rastav na proste faktore ,,...,, 21 kppp može se pokazati da je:

./11.../11/11)( 21 kpppnn

Posebno za slučaj kada je n umnožak dva prosta broja p i q (n = p q), vrijedi:

(n) = n (1 – 1/ p) (1 – 1/ q) = p q (1 – 1/ p) (1 – 1/ q) = (p – 1) (q – 1). Posebno za slučaj kada je n prosti broj p, vrijedi

(p) = p – 1.

Eulerova kongruencija (teorem) Ako su a i n relativno prosti prirodni brojevi, onda je:

.mod1)( na n

Mali Fermatov teorem

Za poseban slučaj Eulerove kongruencije kada je n prosti broj p, pa je (p) = p – 1, vrijedi:

pa p mod11 (za svaki a N koji nije višekratnik od p).

Drugi oblik Fermatova teorema vrijedi i ako je a višekratnik od p:

paa p mod (za svaki a N).

Pseudoprosti brojevi

Mali Fermatov teorem može poslužiti (i) kada se treba generirati slučajni veliki broj za koji se sa

velikom vjerojatnošću može tvrditi da je prosti broj (ako je generirani broj mali, lako se može dokazati da li je prosti, postupkom rastava na proste faktore; no, rastav velikih brojeva na proste faktore je složen i na teškoći tog rastava se i zasniva RSA algoritam).

Generira se slučajni veliki neparni broj n i gleda se da li taj broj zadovoljava mali Fermatov teorem za neki slučajno odabrani broj a (koji može biti relativno mali), tj. gleda se da li vrijedi:

naan mod .

Ako gornje ne vrijedi, n sigurno nije prosti broj. Tada se može tražiti dalje, u okolini broja n (npr. tako

da se n poveća za 2, jer nijedan paran broj osim 2 nije prosti). Ako gornje vrijedi, to ne znači da je n sigurno prosti broj! Naime, postoje i pseudoprosti brojevi, za

koje isto vrijedi mali Fermatov teorem za neke baze a. Može se pokazati da za svaku bazu a 2 postoji čak beskonačno mnogo pseudoprostih brojeva. Zbog toga se testiranje prostosti ne radi samo s jednom bazom a, nego se generira veći broj baza (što veći broj baza, to je veća vjerojatnost da je izabrani broj n prosti). Ako provjere sa svim bazama zadovoljavaju mali Fermatov teorem, velika je vjerojatnost da je broj n prosti. Nažalost, postoje i posebni pseudoprosti brojevi, zvani Charmichaelovi brojevi.

18

Charmichaelovi brojevi i heurističko ispitivanje po Miller-Rabinu

Charmichaelovi brojevi su brojevi koji su pseudoprosti u svakoj bazi a, tj. vrijedi:

CaaC mod za svaki a (C je ovdje oznaka za Charmichaelov broj),

odnosno vrijedi:

Ca 1-C mod1 za svaki a koji je relativno prost sa Charmichaelovim brojem.

Korseltov kriterij kaže da je n Carmichaelov ako i samo ako je n složen, kvadratno slobodan (što

znači da je 1 najveći kvadrat koji dijeli n, odnosno eksponenti svih prostih faktora od n su jednaki 1) i za svaki prosti faktor p od n vrijedi da p – 1 dijeli n – 1. Može se pokazati da odavde neposredno slijedi da n mora biti produkt od barem tri različita prosta broja.

Zbog toga što postoje Carmichaelovi brojevi, testiranje prostosti sa različitim bazama a ne može biti dovoljno sigurno. Naime, ako se slučajno naiđe na Carmichaelov broj (istina, vjerojatnost za to je mala, jer iako Carmichaelovih brojeva ima beskonačno mnogo, oni su puno rjeđi od prostih brojeva), onda će testiranje broja C (Carmichaelov broj) u svakoj bazi a pokazati da je zadovoljen Fermatov teorem.

Zbog toga se, osim testiranja na Fermatov teorem sa različitim bazama, radi još jedno testiranje. Gleda se da li za generirani broj n postoji x različit od +1 i –1 koji zadovoljava jednadžbu:

nx2 mod1 (x je različito od +1 i –1).

Ako postoji takav x, tada se kaže da je x netrivijalni drugi korijen od 1 mod n i tada je n sigurno

složen broj. U suprotnom je n možda prosti broj (nije sigurno). Heurističko ispitivanje po Miller-Rabinu zasniva se upravo na navedena dva testa, tj. generirani broj

n je sigurno složen ako: - za neku odabranu bazu a (u više iteracija) nije zadovoljen Fermatov teorem - ili postoji netrivijalni drugi korijen od (1 mod n). U suprotnom se sa velikom vjerojatnošću može tvrditi da je generirani broj n prosti.

Kineski teorem o ostatcima

Kineski teorem o ostacima (engl. Chinese Remainder Theorem - CRT) govori o rješenju sustava linearnih kongruencija. Ime mu se vezuje uz kineskog matematičara iz prvog stoljeća Sun Tzua.

Neka su rmmm ,...,, 21 u parovima relativno prosti prirodni brojevi, te neka su raaa ,...,, 21 cijeli

brojevi. Tada sustav kongruencija:

rr21 maxmaxmax mod...,,mod,mod 21

ima rješenja.

Ako je 0x jedno rješenje, onda su sva rješenja dana sa:

....mod 20 r1 mmmxx

Za poseban slučaj, kada su p i q prosti i kada su svi ia jednaki a, vrijedi:

x a (mod p) x a (mod q) x a (mod p q) što se može koristiti u dokazu korektnosti RSA algoritma.

19

PRILOG B: Implementacija RSA kriptosustava

Implementacija (u Oracle Forms razvojnom alatu) koja se prikazuje ne služi za realne svrhe, već

samo za prezentaciju RSA kriptosustava. Implementacija radi samo s porukama koje su prirodni brojevi manji od broja n. Također, generirani ključevi su relativno mali, iako se mogu povećavati mijenjanjem odgovarajućih konstanti u programu (do granica koje dopušta Forms razvojni alat).

Korisničko sučelje programa izgleda ovako (s primjerom podataka):

Jedino polje koje je unosivo je Izvorna poruka, a ostala polja služe samo za prikaz odgovarajućih

podataka. Funkcije tri gumba su sljedeće: Kriptiraj i dekriptiraj:

- ako je Izvorna poruka prazna, javlja odgovarajuću grešku; - inače gleda da li su ključevi već generirani (ako nisu, generira ih); - kriptira i dekriptira izvornu poruku i prikazuje rezultat na lijevoj strani; - Status sada može biti:

"Kriptiranje / dekriptiranje završeno!" ili "GREŠKA u kriptiranju/dekriptiranju - izvorna poruka je >= n!" ili "NEPOZNATA GREŠKA u kriptiranju/dekriptiranju!" (u slučaju programske greške, ili zbog ograničenja razvojnog sustava).

Generiraj nove ključeve: - briše polja Kriptirana poruka i Dekriptirana poruka (polje Izvorna poruka ne briše); - generira nove ključeve; - prikazuje podatke na desnoj strani ekrana (maske); - ispisuje u polje Status poruku "Generirani novi ključevi!" .

Izađi: izlaz iz programa. U nastavku se prikazuje programski kod s kratkim opisom (programski kod je komentiran).

20

Procedura generiraj_nove_kljuceve poziva se iz istoimenog gumba i radi sljedeće:

PROCEDURE generiraj_nove_kljuceve IS

p INTEGER; q INTEGER; n INTEGER; phi INTEGER;

e INTEGER; d INTEGER; k INTEGER;

BEGIN

/* Prvo se nalazi prosti broj p, u zadanom rasponu */

p := prosti_broj (konstante.min_prosti_broj_k,

konstante.max_prosti_broj_k);

/*

Traži se prosti broj q, takav da je

razlika između p i q >= zadanoj minimalnoj razlici

i da je nzd (p - 1, q - 1) <= zadanom maksimalnom nzd-u

*/

q := p;

WHILE ABS (p - q) < konstante.min_razlika_izmedu_p_q_k OR

nzd (p-1, q-1) > konstante.max_nzd_p_minus_1_q_minus_1_k

LOOP

q := prosti_broj (konstante.min_prosti_broj_k,

konstante.max_prosti_broj_k);

END LOOP;

/* Računaju se n i phi */

n := p * q;

phi := (p - 1) * (q - 1);

/* Računa se e, relativno prost sa phi */

e := vrati_e (phi);

/* Nalaze se k i d, takvi da je e * d = k * phi + 1 */

izracunaj_d_k (phi, e, d, k);

/* Prikaz podataka */

:p := p;

:q := q;

:n := n;

:phi := phi;

:k := k;

:k_puta_phi_plus_1 := k * phi + 1;

:e := e;

:d := d;

:e_puta_d := e * d;

END;

Konstante koje se koriste u programu nalaze se na jednom mjestu (specifikaciji paketa):

PACKAGE konstante IS

/*

Koliko puta se heurističkom metodom provjerava

da li je generirani broj prost

*/

broj_provjera_prostosti_k CONSTANT INTEGER := 10;

/* Granice za generiranje prostih brojeva p i q */

min_prosti_broj_k CONSTANT INTEGER := 10**9;

max_prosti_broj_k CONSTANT INTEGER := 10**10;

21

/*

Minimalna razlika između generiranih prostih brojeva p i q.

Ako je razlika malena, lakša je kriptoanaliza RSA algoritma.

*/

min_razlika_izmedu_p_q_k CONSTANT INTEGER := 1000;

/*

Maksimalni najveći zajednički djelitelj od (p - 1) i (q - 1).

Ako je nzd (p - 1, q - 1) velik,

lakša je kriptoanaliza RSA algoritma.

*/

max_nzd_p_minus_1_q_minus_1_k CONSTANT INTEGER := 100;

/*

Granice za generiranje broja koji će biti

početni broj za generiranje broja e.

Napomena: e ne mora biti prosti broj,

već mora biti relativno prost sa phi.

*/

e_pocetni_min_k CONSTANT INTEGER := 1000;

e_pocetni_max_k CONSTANT INTEGER := 10000;

END;

Funkcija prosti_broj vraća (vjerojatni, ne dokazani) prosti broj u zadanom rasponu:

FUNCTION prosti_broj (min_p INTEGER, max_p INTEGER)

RETURN INTEGER

/* Vraća prosti broj, u zadanim granicama */

IS

broj INTEGER;

BEGIN

/*

Prvo se generira slučajni broj u zadanim granicama.

Ako nije paran, povećava se za 1.

U petlji se provjerava da li je prost.

*/

broj := slucajni_broj (min_p, max_p);

IF broj MOD 2 = 0 THEN

broj := broj + 1;

END IF;

WHILE slozen_broj (broj) LOOP

/*

Početni broj je prost, nije 2, pa je neparan.

Zbog toga se e može u iteraciji povećavati za 2.

*/

broj := broj + 2;

IF broj > max_p THEN

broj := min_p;

END IF;

END LOOP;

RETURN broj;

END;

22

Funkcija slucajni_broj vraća slučajni broj u zadanom rasponu:

FUNCTION slucajni_broj (min_p INTEGER, max_p INTEGER)

RETURN INTEGER

/* Generira slučajni cijeli broj od min do max (uključujući) */

IS

broj INTEGER;

BEGIN

/*

DBMS_RANDOM.VALUE (min_p, max_p) vraća decimalnu vrijednost

između min_p, uključujući, i max_p, isključujući.

Zato se računa DBMS_RANDOM.VALUE (min_p, max_p + 1).

Vraća se u cijeli broj.

*/

broj := DBMS_RANDOM.VALUE (min_p, max_p + 1);

RETURN broj;

END;

Funkcija slozen_broj vraća TRUE ako je broj sigurno složen, a FALSE ako je vjerojatno prosti broj. Ona višekratno poziva funkciju slozen_jednokratna_provjera. Obje zajedno implementiraju heurističko ispitivanje po Miller-Rabinu:

FUNCTION slozen_broj (broj INTEGER) RETURN BOOLEAN IS

slozen BOOLEAN := FALSE;

i INTEGER := konstante.broj_provjera_prostosti_k;

pom INTEGER;

BEGIN

WHILE i > 0 AND NOT slozen LOOP

/* Slučajno se generira broj između 1 i (broj - 1) */

pom := slucajni_broj (1, broj - 1);

slozen := slozen_jednokratna_provjera (pom, broj);

i := i - 1;

END LOOP;

/*

Ako je slozen = TRUE, onda je sigurno složen.

Inače je prost, vrlo vjerojatno.

*/

RETURN slozen;

END;

23

FUNCTION slozen_jednokratna_provjera (pom INTEGER, broj INTEGER)

RETURN BOOLEAN

IS

TYPE binarna_tablica_t IS TABLE OF INTEGER

INDEX BY BINARY_INTEGER;

slozen BOOLEAN := FALSE;

c INTEGER;

c_binarno binarna_tablica_t;

i INTEGER;

d INTEGER;

d_s INTEGER;

BEGIN

c := broj - 1;

/*

Prvo se c pretvara u binarni oblik,

tako da se sprema u niz (tablicu) c_binarno

čiji je prvi element najmanja binarna znamenka,

a zadnji element najveća.

*/

i := 0;

WHILE c > 0 LOOP

i := i + 1;

c_binarno(i) := c MOD 2;

c := FLOOR (c / 2);

END LOOP;

d := 1;

WHILE i > 0 AND NOT slozen LOOP

d_s := d;

d := (d * d) MOD broj;

IF d = 1 AND d_s <> 1 AND d_s <> (broj – 1) THEN

slozen := TRUE;

END IF;

IF c_binarno(i) = 1 THEN

d := (d * pom) MOD broj;

END IF;

i := i - 1;

END LOOP;

IF i = 0 AND d <> 1 THEN

slozen := TRUE;

END IF;

RETURN slozen;

END;

24

Funkcija vrati_e računa javni ključ e:

FUNCTION vrati_e (phi INTEGER) RETURN INTEGER

/* Računa e, relativno prost u odnosu na phi i manji od njega */

IS

e INTEGER;

BEGIN

/*

Prvo se generira slučajni broj u zadanim granicama.

Ako nije paran, povećava se za 1.

U petlji se provjerava se da li je relativno prost sa phi.

*/

e := slucajni_broj (konstante.e_pocetni_min_k,

konstante.e_pocetni_max_k);

IF e MOD 2 = 0 THEN

e := e + 1;

END IF;

WHILE nzd (phi, e) <> 1 LOOP

/*

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

p i q su veliki prosti brojevi, tj. neparni.

Dakle, phi je paran, pa e ne može biti paran,

ako će biti relativno prost u odnosu na phi.

Početni e je neparan.

Zbog toga se e može u iteraciji povećavati za 2.

*/

e := e + 2;

/* Ako dođemo do phi, vraćamo se na donju granicu */

IF e >= phi THEN

e := konstante.e_pocetni_min_k;

IF e MOD 2 = 0 THEN

e := e + 1;

END IF;

END IF;

END LOOP;

RETURN e;

END;

25

Funkcija nzd vraća najveći zajednički djelitelj dva broja (koristeći Euklidov algoritam), a procedura izracunaj_d_k računa tajni ključ d i k, pozivajući proceduru za prošireni Euklidov algoritam: FUNCTION nzd (x INTEGER, y INTEGER)RETURN INTEGER IS

a INTEGER := x;

b INTEGER := y;

t INTEGER;

BEGIN

WHILE b > 0 LOOP

t := b;

b := a MOD b;

a := t;

END LOOP;

RETURN a;

END;

PROCEDURE izracunaj_d_k (

phi INTEGER, e INTEGER,

d OUT INTEGER, k OUT INTEGER)

IS

nzd_pom INTEGER;

minus_k INTEGER;

BEGIN

/*

Pomoću proširenog Euklidovog algoritma nalaze se d i minus_k,

takvi da je e * d + phi * minus_k = nzd (e, phi).

Pritom je, specifično, nzd (e, phi) = 1

(jer su e i phi relativno prosti).

*/

prosireni_Euklidov_algoritam (e, d, phi, minus_k, nzd_pom);

/*

d bi mogao ispasti negativan,

pa se d i minus_k povećavaju, dok d ne bude pozitivan

*/

WHILE d <= 0 LOOP

d := d + phi;

minus_k := minus_k - e;

END LOOP;

k := - minus_k; -- tj. e * d = k * phi + 1

END;

26

Procedura prosireni_Euklidov_algoritam općenito nalazi x i y u diofantskoj jednadžbi koja ima oblik a x + b y = c, a vraća i c, koji je zapravo nzd (a, b). U konkretnom slučaju procedura izracunaj_d_k šalje ovoj proceduri e i phi kao parametre a i b, a u povratu od nje dobiva d i –k (dobiva i nzd (e, phi), ali je on po definiciji jednak 1, jer e i phi moraju biti relativno prosti):

PROCEDURE prosireni_Euklidov_algoritam (

a INTEGER, x OUT INTEGER,

b INTEGER, y OUT INTEGER, g OUT INTEGER

)

/* vraća x, y i g takve da a * x + b * y = nzd (a, b) */

IS

u INTEGER;

v INTEGER;

w INTEGER;

q INTEGER;

xt INTEGER;

yt INTEGER;

gt INTEGER;

ut INTEGER;

vt INTEGER;

wt INTEGER;

BEGIN

x := 1;

y := 0;

g := a;

u := 0;

v := 1;

w := b;

WHILE w > 0 LOOP

q := FLOOR (g / w);

/* Pamtimo stare vrijednosti */

xt := x;

yt := y;

gt := g;

ut := u;

vt := v;

wt := w;

/* Nove vrijednosti */

x := ut;

y := vt;

g := wt;

u := xt - q * ut;

v := yt - q * vt;

w := gt - q * wt;

END LOOP;

END;

27

Procedura kriptiraj_i_dekriptiraj se poziva iz istoimenog gumba. Ona samo poziva funkcije kriptirana_poruka i dekriptirana_poruka, koje pozivaju funkciju modulo_potencije. Funkcija modulo_potencije služi za brzo modularno potenciranje:

PROCEDURE kriptiraj_i_dekriptiraj

(izvorna_poruka INTEGER, n INTEGER, e INTEGER, d INTEGER)

IS

kp INTEGER;

dp INTEGER;

BEGIN

kp := kriptirana_poruka (izvorna_poruka, e, n);

dp := dekriptirana_poruka (kp, d, n);

/* prikaz podataka */

:kriptirana_poruka := kp;

:dekriptirana_poruka := dp;

END;

FUNCTION kriptirana_poruka

(izvorna_poruka INTEGER, e INTEGER, n INTEGER)

RETURN INTEGER

IS

BEGIN

RETURN modulo_potencije (izvorna_poruka, e, n);

END;

FUNCTION dekriptirana_poruka

(kriptirana_poruka INTEGER, d INTEGER, n INTEGER)

RETURN INTEGER

IS

BEGIN

RETURN modulo_potencije (kriptirana_poruka, d, n);

END;

28

FUNCTION modulo_potencije

(baza INTEGER, potencija INTEGER, modulo INTEGER)

RETURN INTEGER

IS

TYPE binarna_tablica_t IS TABLE OF INTEGER

INDEX BY BINARY_INTEGER;

potencija_binarno binarna_tablica_t;

pom INTEGER;

i INTEGER;

rezultat INTEGER;

BEGIN

/*

Prvo se potencija pretvara u binarni oblik,

tako da se sprema u niz (tablicu) potencija_binarno

čiji je prvi element najmanja binarna znamenka,

a zadnji element najveća.

*/

pom := potencija;

i := 0;

WHILE pom > 0 LOOP

i := i + 1;

potencija_binarno(i) := pom MOD 2;

pom := FLOOR (pom / 2);

END LOOP;

/*

Sada se niz (tablica) potencija_binarno

koristi za nalaženje modula potencije,

kao da radimo (baza ** potencija) MOD modulo.

*/

rezultat := 1;

WHILE i > 0 LOOP

rezultat := MOD (rezultat * rezultat, modulo);

IF potencija_binarno(i) = 1 THEN

rezultat := (rezultat * baza) MOD modulo;

END IF;

i := i - 1;

END LOOP;

RETURN rezultat;

END;