SVEUČILIŠTE U ZAGREBU

FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DIPLOMSKI RAD br. 1218

IZRADA SAMOSTALNOG KRIPTOGRAFSKOG MODULA

Tomislav Šakić

 

 

 

 

 

 

 

 

 

 

 

 

 

Zagreb, rujan 2000.


SVEUČILIŠTE U ZAGREBU

FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA

 

 

 

 

 

 

SADRŽAJ

 

1.     Uvod.. 1

2.     Osnove kriptografije.. 3

2.1.      Povijest kriptografije. 3

2.2.      Definicija kriptografije. 4

2.3.      Definicija enkripcije i dekripcije. 6

2.3.1.     Simetrični algoritmi 9

2.3.2.     Asimetrični algoritmi 11

2.4.      Generator kriptografsko sigurnih pseudo-slučajnih brojeva.. 12

2.5.      Jednostrana hash funkcija.. 13

2.6.      Digitalno potpisivanje poruka.. 14

2.7.      Kriptoanaliza.. 15

3.     Sučelje modula.. 18

3.1.      Početak rada  - postavljanje konteksta.. 18

3.1.1.     Funkcija CPAcquireContext 18

3.2.      Kreiranje ključeva.. 20

3.2.1.     Funkcija CPGenKey. 21

3.3.      Razmjena kriptografskih ključeva.. 24

3.3.1.     Funkcija CPExportKey. 24

3.3.2.     Funkcija CPImportKey. 26

3.4.      Enkripcija i dekripcija podataka.. 27

3.4.1.     Funkcija CPEncrypt 27

3.4.2.     Funkcija CPDecrypt 30

3.5.      Hash-vrijednosti i digitalno potpisivanje. 31

3.5.1.     Funkcija CPHashData. 31

3.5.2.     Funkcija CPSignHash. 32

3.6.      Usporedba s CryptoAPI sučeljem.. 34

4.     Implementacija modula.. 36

4.1.      Osnovni razredi 37

4.1.1.     Razred za rad sa kontekstima: CContextManager. 37

4.1.2.     Razred za rad sa ključevima: CKeyDataManager. 38

4.1.3.     Razred za rad sa generatorom slučajnih brojeva: CRandomNumberGenerator. 39

4.1.4.     Razred za rad sa hash-vrijednostima: CHashDataManager. 40

4.2.      Simetrični algoritam IDEA.. 41

4.2.1.     Opis algoritma. 41

4.2.2.     Kriptoanaliza algoritma IDEA.. 43

4.2.3.     Načini rada algoritma IDEA.. 45

4.3.      Asimetrični Algoritam RSA.. 46

4.3.1.     Problem faktoriziranja velikih brojeva. 47

4.4.      SHA hash algoritam.. 48

4.5.      RND-WIN32 generator slučajnih brojeva.. 50

5.     Programski primjer.. 54

5.1.      Opis programa.. 54

5.2.      Deklaracija varijabli i inicijalizacija sučelja.. 57

5.3.      Izmjena javnih ključeva.. 58

5.4.      Kreiranje i izmjena sjedničkog ključa.. 59

5.5.      Spajanje klijenta i poslužitelja.. 60

5.6.      Slanje i primanje podataka.. 61

5.7.      Brisanje korištenih varijabli 62

6.     Zaključak.. 63

Literatura.. 64


1.       Uvod

 

U današnjem informacijskom dobu svjedoci smo razvoja elektroničkih puteva koji prenose ogromne količine vrijednih komercijalnih, znanstvenih i osobnih informacija između pojedinaca, financijskih ustanova, tvrtki i vladinih organizacija. Velike računalne mreže kao što je Internet, s velikim stupnjem pristupa podacima, čine ove podatke ranjivim s obzirom na privatnost, vjerodostojnost i krađu. Kao rezultat, na svjetskom tržištu postoji veliki pritisak da se elektroničke transakcije načine sigurnima. Skupina velikih američkih računalnih tvrtki Computer Systems Policy Project [1] procjenjuje potencijalni porast prihoda koji se stvara zbog većih sigurnosnih zahtjeva samo u SAD-u na oko 30-60 milijardi dolara do godine 2000. Procjenjuju i da će potencijalna izloženost globalnih korisnika zbog nedostatka sigurnosti biti između 320 i 640 milijardi dolara do godine 2000.

Kriptografija[2] istražuje metode zaštite informacije, njene vjerodostojnosti i porijekla. U informacijskom društvu, kriptografija je kritična komponenta. Kriptografija je toliko zapanjujuća i zbog velike povezanosti između teorije i prakse. Napredak u teoriji jedne godine, već se iduće godine upotrebljava u proizvodima i standardima. Svaki teorijski napredak ponekad znači da je prošlogodišnji prijedlog imao neočekivane slabosti. Kako teorija brzo napreduje, često mnogi prijedlozi zavise o još nedokazanim pretpostavkama. Teorijski rad unaprijeđuje praktični, a praktični dio pruža izazov i nadahnuće teorijskom dijelu. Svaki put kada se neka metoda zaštite pokaže nedovoljnom, nešto se nauči i to se znanje upotrijebi za izradu nove i bolje metode.

Napredak u postojećim kriptografskim mehanizmima nastavlja se sa stalno rastućim tempom, da bi zadovoljio potrebe širenja informacijskog društva u kojem živimo. Teško je danas zamisliti ozbiljnu poslovnu aplikaciju koja u sebi nema riješen sigurnosni podsustav, počev od bankarskih aplikacija, internet-dućana, pa sve do samih operacijskih sustava. Upravo zbog tako brzog razvoja i promjena kriptografskih algoritama javlja se smjernica odvajanja kriptografskog podsustava od ostatka aplikacije. Time se olakšava zamjena i unapređivanje kriptografskog sustava, bez veće promjene glavne aplikacije.

Odvojeni kriptografski modul s jednostavnim sučeljem visoke razine omogućava programeru bez prethodnog iskustva u kriptografiji laku i brzu ugradnju kriptografskih algoritama u njegov proizvod. Laka i brza ugradnja znači i manje troškove razvoja proizvoda. Vanjska implementacija modula omogućava laganu modularnu zamjenu kriptografskog algoritma kada je vrijeme za nadogradnju uz minimalne promjene na proizvodu.

U ovom radu se opisuje izrada kriptografskog modula CryptoLib koji implementira po jedan algoritam za učinkovito kriptiranje podataka[3], razmjenu ključeva i potpisivanje. Pri odabiru algoritama koji su bili dostupni presudila je njihova sigurnost. Po mišljenjima većine poznatih stručnjaka u kriptografiji, jedan od najboljih algoritam za simetrično kriptiranje podataka je IDEA, koja se do danas pokazala bez većih slabosti. Nepisani standard za razmjenu ključeva je RSA algoritam, koji je, iako star više od 20 godina, još uvijek siguran za dovoljno dugačke ključeve. Najbolji odabir algoritma za pripremanje poruka za potpis je SHA.

Sučelje kriptografskog modula CryptoLib je izvedeno iz funkcija već postojećeg CryptoAPI[4] sučelja radi pojednostavljenja upotrebe kriptografskog modula. Slični nazivi funkcija i isti parametri omogućavaju veliku brzinu implementacije novog kriptografskog modula u već postojeće proizvode koji rade sa CryptoAPI sučeljem. Ipak, sučelje CryptoLib je bitno pojednostavljeno u odnosu na CryptoAPI  i oblikovano je u smjeru konkretne primjene, a to je u ovom slučaju sigurna komunikacija između dva korisnika.

Cilj ovog rada je razmotriti sve mogućnosti i probleme pri izradi kriptografskog modula u višekorisničkom i višezadaćnom operacijskom sustavu.


2.       Osnove kriptografije

 

2.1.    Povijest kriptografije

Kriptografija ima dugu i zanimljivu, ali prilično tajnovitu prošlost. Počev od starih Egipćana prije nekih 4000 godina, pa sve do dvadesetog stoljeća, kada je igrala ključnu ulogu u ishodima oba svjetska rata. Najvažniji nosioci razvoja kriptografije su bili vojska i diplomatske službe, tj. državne organizacije uopće. Kriptografija je korištena kao alat za zaštitu državnih tajni. Zbog toga je njen razvoj sve do druge polovice dvadesetog stoljeća bio praćen s rijetkim publikacijama, od kojih se ističu dvije povijesno značajne: William F. Friedman: The Index of Coincidence and Its Applications in Cryptography[5] (1918); i Claude Shannon: The Communication Theory of Secrecy Systems[6] (1949). Zanimljivo je da su obje publikacije došle nakon svjetskog rata i da u sebi sadrže pregled napretka koji je učinjen u sklopu vojnih istraživanja za vrijeme rata.

Razvoj i širenje računalnih i komunikacijskih sustava u 1960-tim godinama donio je veći interes za zaštitu podataka iz privatnog sektora. Početak razvoja na tom polju označio je Feistel u IBM-u ranih 1970-tih godina, a kulminacija njegovog rada došla je 1977., kada je usvojen američki standard za kriptiranje podataka pod imenom DES (Data Encryption Standard). Taj je standard postao najpoznatiji kriptografski algoritam u povijesti, i još uvijek se koristi kao uobičajeni način osiguravanja elektroničkog poslovanja u mnogim financijskim institucijama širom svijeta.

No ipak, najveći napredak u povijesti kriptografije donijeli su 1975. Diffie i Hellman u članku New Directions in Cryptography[7], opisujući revolucionarni novi koncept kriptografije s javnim i privatnim ključem. Ovaj način kriptografije rješio je mnoge probleme koji su prije postojali s distribucijom ključeva. Iako sami autori članka nisu predložili konkretni algoritam za realizaciju, ideja je bila prilično jasna i stvoreni su preduvjeti za razvoj novih i boljih kriptografskih sustava.

Već 1978. godine Rivest, Shamir i Adleman su objavili prvi praktični algoritam s javnim i privatnim ključem, koji se naziva po prvim slovima njihovih imena RSA. Algoritam se bazira na teško rješivom matematičkom problemu faktoriziranja velikih cijelih brojeva. Široka upotreba ovog algoritma dovela je do popularizacije ovog matematičkog problema i već su u 1980-im godinama izvedene nove i učinkovitije metode faktoriziranja cijelih brojeva, koje ipak nisu uspjele kompromitirati sigurnost algoritma RSA. 1985. godine je objavljen još jedan prilično dobar algoritam s javnim i privatnim ključem pod nazivom El Gamal.

U proteklim stoljećima razvijen je široki spektar protokola i mehanizama za zaštitu sigurnosti informacije u obliku fizičkog dokumenta. Često se cilj zaštite ne može postići samo matematičkim algoritmima ili protokolima, nego traži određene postupkovne tehnike i poštivanje zakona da bi se došlo do traženog rezultata. Na primjer, privatnost pisama je osigurana sa zatvaranjem omotnice koju je isporučila provjerena poštanska služba. Fizička sigurnost omotnice je, zbog praktičnih razloga, ograničena i tako je uveden zakon koji proglašava krivičnim prekršajem pokušaj otvaranja tuđe pošte. S druge strane, ponekad se sigurnost postiže s posebnim tehnološkim postupkom. Na primjer, papirnata valuta zahtjeva specijalnu tintu i materijal da se spriječi krivotvorenje.

Način na koji se informacija zapisuje se dramatično promijenio kroz vrijeme. Gdje se prije informacija uobičajeno zapisivala na papir i slala putem obične pošte, danas se zapisuje na magnetski medij i šalje telekomunikacijskim sustavom. S druge strane, velika promjena je u mogućnosti umnožavanja i izmjene informacije. Vrlo je jednostavno napraviti tisuće identičnih kopija informacija koje je kasnije nemoguće odvojiti od originala. S informacijom na papiru, to je puno teže napraviti. Zbog toga je društvu koje ovisi o informacijama u elektroničkom obliku potreban način da osigura informaciju koji će biti nezavisan o mediju snimanja ili slanja - što znači da se sva zaštita mora nalaziti u samoj informaciji.

Jedan od osnovnih načina zaštite vjerodostojnosti informacije je potpis. To je osnovni element za mnoge usluge zaštite kao što je nemogućnost krivog predstavljanja, provjera porijekla informacije, identifikacija, svjedočenje i druge. Potpis treba biti jedinstven i služi prilikom identifikacije, autorizacije i provjere pojedinca. Kod elektroničke informacije, koncept potpisa se mijenja. Potpis više ne smije biti jedinstven osobi koja potpisuje i u isto vrijeme nezavisan o informaciji koja se potpisuje, jer je elektronička kopija potpisa identična originalu i potpisivanje neovlaštenih dokumenata time postaje trivijalno.

 Za zaštitu informacije u elektroničkom obliku potrebni su protokoli koji će zamijeniti papirnate protokole i koji će biti barem toliko sigurni kao oni koje zamjenjuju. Tu je i jedinstvena prilika za napredak i povećanje sigurnosti. Da bi se do tog cilja došlo u modernom elektroničkom društvu, potrebno je riješiti problem s tehnološke i s pravne strane. Tehnološku stranu predstavlja kriptografija.

Kriptografija je dugo vremena bila vještina koja se razvijala ad hoc tehnikama da se zadovolje određeni sigurnosni zahtjevi. Zadnjih dvadesetak godina bio je prijelazni period kada kriptografija prelazi iz vještine u znanost. Sada postoji nekoliko međunarodno priznatih skupova posvećenih isključivo kriptografiji i međunarodnih znanstvenih organizacija posvećenih razvoju kriptografije, jedna od kojih je International Association for Cryptologic Research (IACR).

 

 

2.2.    Definicija kriptografije

Kriptografija je znanost koja proučava matematičke tehnike povezane sa sigurnosti infomacije: vjerodostojnost, tajnost, provjera porijekla informacije i identita korisnika, te dokazivanje odgovornosti korisnika za određenu radnju.

1.         Vjerodostojnost (engl. Data integrity) se brine o tome da ne dođe do neovlaštene promjene informacije, kao što su ubacivanje informacije, brisanje informacije i zamjena informacije. Da bi se osigurala vjerodostojnost, mora postojati način provjere da li je informacija promijenjena od strane neovlaštene osobe.

2.         Tajnost (engl. Confidentiality) osigurava da je sadržaj informacije dostupan samo onima koji su za to ovlašteni. Postoje brojni načini zaštite tajnosti, počev od fizičke zaštite do matematičkih algoritama koji sakrivaju podatke od neovlaštenih osoba.

3.         Provjera identiteta (engl. Autentification) se koristi na razini korisnika i na razini informacije. Dva korisnika koja počinju komunikaciju se trebaju predstaviti jedan drugome. Prije početka rada većine operacijskih sustava, zahtjeva se predstavljanje korisnika, da bi se mogao odrediti dopušteni sigurnosnu razinu rada. Predstavljanje na razini informacije znači da za informaciju koja prolazi komunikacijskim kanalom treba provjeriti odakle dolazi, tko je vlasnik informacije, kojeg datuma je stigla, kojeg je tipa, koliko je stara itd.

4.         Nemogućnost izbjegavanja odgovornosti (Non-repudiation) je vrlo važna osobina sigurnog sustava u financijskom svijetu. Primjer za to može biti podizanje elektroničkog novca iz banke. Nakon što je potrošio sav novac, neodgovrni korisnik može tvrditi da on nije obavio tu radnju i poželi povrat novca na svoj račun od banke. Banka u tom slučaju mora imati mehanizam dokazivanja da je upravo taj korisnik odgovoran za tu radnju. Razriješenje situacije se najčešće postiže korištenjem nezavisnog posrednika kojem svi vjeruju (trusted party).

Kriptografija pokušava riješiti ove probleme u teoriji i u praksi. Cilj kriptografije je zaštita od i otkrivanje prisluškivanja, varanja i krivog predstavljanja u modernim elektroničkim sustavima.

Alati kojima se kriptografija pri tome služi nazivamo kriptografskim mehanizmima. Podjela kriptografskih mehanizama je dana slikom 2.1.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Slika 2.1  Podjela kriptografskih mehanizama.


Ovi mehanizmi se trebaju promotriti u odnosu na sljedeće kriterije:

1.      Razina zaštite. Jedno od mogućih objašnjenja ovog kriterija je koliko je operacija potrebno (koristeći najbolje trenutno dostupne metode) da se skine zaštita i time kompromitira sigurnost zaštićenog objekta;

2.      Funkcionalnost. Način na koji mehanizam funkcionira. Gdje se sve može upotrijebiti;

3.      Način upotrebe. Jedna te ista funkcija može dati sasvim različite rezultate ovisno o odabranom načinu upotrebe;

4.      Učinkovitost. Odnosi se na učinkovitost u točno određenom načinu upotrebe. Na primjer, u slučaju kriptografskog algoritma, učinkovitost se može mjeriti u broju kriptiranih bitova po sekundi;

5.      Lakoća implementacije. Opisuje koliko je teško implementirati određeni algoritam u programskom, odnosno sklopovskom okružju.

Relativna važnost tih čimbenika uvelike ovisi o primjeni za koju razvijamo sigurnosni podsustav i o količini resursa kojim raspolažemo. Na primjer, u okružju gdje je ograničena razina procesorske moći kojom raspolažemo biti će nužno napraviti kompromis između visoke razine zaštite i učinkovitosti cijelog sustava kao cjeline.

 

 

2.3.    Definicija enkripcije i dekripcije

Dvije osnovne operacije koje se koriste u kriptografiji su:

·        kriptiranje ili šifriranje (engl. encryption, enciphering)

·        dekriptiranje ili dešifriranje (engl. decryption, deciphering).

 

Neka je A konačni skup simbola definicije. Na primjer, A={0,1}, je često korišteni binarni skup simbola definicije. Svaki drugi skup simbola se može kodirati u binarni skup. Abeceda s 30 različitih znakova se može kodirati s binarnim skupom dužine pet bitova.

 

Neka je M skup koji se zove prostor poruke. M se sastoji od niza simbola iz skupa simbola definicije. Element u skupu M se zove poruka napisana jasnim tekstom (engl. plain text, clear text).

 

Neka je C skup koji se zove prostor kriptirane poruke. C se sastoji od niza simbola iz skupa simbola definicije A, koji se razlikuju od simbola iz skupa M. Element skupa C se zove kriptirani tekst (engl. ciphertext).

 

K je skup prostora ključa. Element skupa K se zove ključ (engl. key).

Svaki element eÎ K određuje funkciju iz  M→C, koja se označava s Ee i naziva se funkcijom enkripcije. Funkcija Ee mora biti bijekcija da bi se mogao naći inverz koji će za svaki različiti kriptirani tekst naći izvornu poruku u jasnom tekstu. Postupak preslikavanja elementa mÎ  M u element cÎ C koristeći funkciju Ee se naziva enkripcija ili kriptiranje.

 

(2.1)

 

 

Za svaki dÎ  K,  određena je bijekcija Dd iz C → M, a naziva se funkcijom dekripcije. Postupak preslikavanja elementa c Î C u element m Î M koristeći funkciju Dd se naziva dekripcija ili dekriptiranje.

 

(2.2)

 

 

Kriptografski algoritam se sastoji od funkcije enkripcije {Ee : eÎ  K} i odgovarajuće funkcije dekripcije {Dd : dÎ K} sa svojstvom da za svaki eÎ K postoji jedinstveni ključ
d
Î  K, takav da je Dd  = Ee-1, tj.

 

 M

(2.3)

 

 

Ključevi e i d se nazivaju par ključeva i označavaju se sa (e,d). Moguće je da su u nekim slučajevima ključevi e i d isti.

Kako bi se izbjeglo lako otkrivanje kriptiranih poruka, prostor kriptirane poruke mora biti dovoljno velik što omogućava kriptiranje na velik broj načina. Veći prostor kriptirane poruke označava i veći ključ, pa je već uobičajena mjera za sigurnost većine algoritama dužina ključa.

Zbog praktičnosti izvedbe, kriptografski algoritam mora zadovoljiti osnovne zahtjeve:

1.         Algoritmi kriptiranja moraju se moći učinkovito izvoditi na računalima. To znači da se algoritam treba prilagoditi programskoj ili sklopovskoj izvedbi na računalu.

2.         Algoritmi su javni, a tajnost podataka je zaštićena s tajnim ključevima.

3.         Kriptografski sustav mora biti siguran, tj. otkrivanje ključa mora biti vrlo teško. Mjera težine je složenost postupka otkrivanja.


Jedna od mogućih upotreba kriptografskog algoritma u komunikaciji dva korisnika preko nesigurnog kanala prikazana je na slici 2.2. Korisnik A i B žele sudjelovati u sigurnoj komunikaciji, ali na raspolaganju im je samo nesigurni kanal, tj. kanal koji je moguće prisluškivati i mijenjati od strane neovlaštenog korisnika.

 

 

 

 

 

 

 

 

 

 

 

 

 


Slika 2.2  Skica upotrebe kriptografskog algoritma.

 

Prije početka komunikacije, korisnik A i B moraju na siguran način razmijeniti par ključeva (e, d) koji će koristiti za komunikaciju. Pretpostavimo da korisnik A započinje komunikaciju sa korisnikom B. Jasan tekst poruke m se kriptira sa ključem e i šalje u obliku kriptirane poruke c do korisnika B. Korisnik B prima kriptiranu poruku i dekriptira je pomoću ključa d i dobiva izvornu poruku m u jasnom tekstu.

Neovlašteni korisnik ima mogućnost prisluškivanja i utjecanja na komunikacijski kanal, što kanal čini nesigurnim. Neovlašteni korisnik se može predstaviti kao pošiljatelj ili primatelj, primati i slati kriptirane poruke c. Dobar kriptografski algoritam na osnovi tajnosti para ključeva (e,d) omogućiti će korisnicima A i B da otkriju pokušaj neovlaštenog korisnika da utječe na tajnost i vjerodostojnost njihove komunikacije. Da bi neovlašteni korisnik doznao sadržaj izvorne poruke, mora nekako otkriti ključ d i dekriptirati kriptiranu poruku c. Da bi se neovlašteni korisnik predstavio kao korisnik A, potrebno je doznati ključ e kojim će neovlašteni korisnik kriptirati svoju, promijenjenu poruku m'. Sve se to mora desiti u određenom, konačnom vremenskom intervalu. Postoje različite metode kojima se neovlašteni korisnik može poslužiti za napad na kriptografske algoritme, čime se posebno bavi poglavlje o kriptoanalizi.

Postoje dva osnovna tipa kriptografskih algoritama: simetrični i asimetrični.


2.3.1.     Simetrični algoritmi

Kod simetričnih algoritama za svaki par ključeva (e,d), na osnovi poznatog ključa e lako je izračunati ključ d, i na osnovi poznatog ključa d lako je izračunati ključ e. To znači da je dovoljno znati samo jedan od dva ključa iz para ključeva (e,d). Kod većine simetričnih algoritama u pitanju je jedan te isti ključ, tj. e=d. Zbog sigurnosnih razloga taj se ključ mora držati u tajnosti i mora biti moguća njegova česta promjena. Ovdje do izražaja dolazi i najveći problem ovog tipa kriptografskog algoritma, a to je distribucija ključa. Pretpostavimo da nemamo mogućnost otvaranja sigurnog kanala do korisnika s druge strane. Da bi se mogao koristiti simetrični algoritam, potrebno je nekako dostaviti tom korisniku ključ e. Pri tome mogu pomoći različite metode, od kojih je najvažnija i najčešća upotreba asimetričnih algoritama.

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Slika 2.3  Skica upotrebe simetričnog kriptografskog algoritma.

 

Skica upotrebe je dana na slici 2.3. Razlika u odnosu na prethodnu skicu je u korištenju istog ključa e za kriptiranje i dekriptiranje podataka. Da bi korisnik A poslao korisniku B taj ključ potreban je sigurni komunikacijski kanal, kao i u prethodnom primjeru. Nakon toga oba korisnika mogu koristiti isti ključ za kriptiranje i dekriptiranje podataka. U praksi preporuča se česta izmjena zajedničkog ključa e kako bi se osigurala sigurnost komunikacije. Obično se svaki put kod otvaranja komunikacijske sjednice između dva korisnika stvara novi ključ e koji se koristi samo za vrijeme trajanja sjednice. Po tome je simetrični ključ dobio još jedan naziv: sjednički ključ (engl. session key).

Relativna brzina simetričnih algoritama i njihova prilagodljivost za računalnu primjenu upućuju na njihovo korištenje za kriptiranje, odnosno dekriptiranje velike količine podataka. Problem distribucije ključa rješava se upotrebom asimetričnih algoritama.

Ovisno o granuliranosti ulaznog niza podataka, simetrični algoritmi se dalje mogu podijeliti na algoritme za kriptiranje niza bitova i na algoritme za kriptiranje blokova podataka.

Algoritmi za kriptiranje niza bitova kriptiraju u teoriji jedan po jedan bit podataka i relativno su jednostavni za sklopovsku implementaciju. Niz jasnog teksta ulazi u algoritam za kriptiranje, a niz kriptiranih podataka izlazi iz algoritma. U teoriji riječ je o bitovima, dok je u praksi riječ uvijek o oktetima. Nisu toliko sigurni kao algoritmi za kriptiranje blokova podataka, iako to može itekako ovisiti o tipu algoritma. S druge strane, oni su brži i veličina kriptiranog teksta je uvijek ista kao veličina nekriptiranog teksta. Širenje greške je obično manje kada se koriste ovi algoritmi. Ako se bit šifriranog teksta ne može pročitati, mnogi algoritmi za šifriranje niza bitova će pogriješiti samo u tom bitu. Kod algoritama za kriptiranje blokova podataka, ako se jedan bit kriptiranog teksta promijeni, krivo će se dekriptirati najmanje jedan blok podataka. Jedan primjer algoritama za kriptiranje niza bitova je RC4.

Algoritmi za kriptiranje blokova podataka su u praksi puno rašireniji i lakši za programsku implementaciju jer kriptiraju podatke po blokovima obično veličine 64 bita.

 

Tablica 2.1  Pregled simetričnih kriptografskih algoritama blokova podataka.

Algoritam

Veličina ključa (bit)

Veličina bloka (bit)

Blowfish

448

64

CAST-128

128

64

DES

56

64

Triple DES

112/168

64

IDEA

128

64

RC2

1024

64

RC5

832

64

Safer

128

64

Safer-SK

128

64

Skipjack

80

64

 

Sigurnost simetričnih algoritama ovisi o sigurnosti samog algoritma i o dužini ključa. Algoritam je prilično siguran ako ne postoji nikakav način za pronalaženje tajnih ključeva na osnovi informacija koje se prenose, koji bi bio brži od pretraživanja svih mogućih ključeva. Vrijeme koje je potrebno da se pretraže svi mogući ključevi ovisi samo o dužini ključa i to eksponencijalno. DES kao najpoznatiji simetrični algoritam nije siguran zbog više razloga: ima relativno mali ključ od 56 bita i pronađeno je nekoliko uspješnih napada kriptoanalizom. Dužine ključeva poznatih simetričnih algoritama danes su tablicom 2.1.

 


2.3.2.     Asimetrični algoritmi

Asimetrični algoritam ima svojstvo da je ključ e kojim se kriptiraju podaci različit od ključa d kojim se dekriptiraju podaci. Štoviše, na osnovi poznatog ključa e nije moguće (ili bar ne u razumnoj količini vremena) doći do vrijednosti ključa d.  Asimetrični algoritmi se još zovu i algoritmi s javnim ključem (engl. public-key algorythms), zbog njihovog svojstva da je ključ e kojim se kriptiraju podaci slobodno može otkriti. Potpuni stranac može koristiti ključ e da kriptira poruku, ali samo će određena osoba s odgovarajućim parom ključa d moći dekriptirati poruku. Ključ za kriptiranje e se naziva javnim ključem (engl. public key), dok se ključ za dekriptiranje d naziva privatnim ključem (engl. private key). Matematička funkcija kojoj se inverz uz pomoć posebnog parametra može izračunati lako, a inače vrlo teško, zove se jednosmjerna funkcija s tajnim vratima (engl. trap-door function). Najkorišteniji asimetrični algoritmi se baziraju na problemu faktoriziranja velikih brojeva koji su umnožak dvaju prim-broja.

Algoritmi kriptiranja i dekriptiranja s javnim ključem su razmjerno složeni i stoga nisu prikladni za prenošenje veće količine podataka. Najčešće se koriste kao sredstvo prenošenja ključeva simetričnih algoritama, kojima se dalje nastavlja kriptiranje podataka. Asimetrični algoritmi imaju također veliku primjenu u digitalnom potpisivanju dokumenata.

 

 

 

 

 

 

 

 

 

 

 

 

 


Slika 2.4  Skica upotrebe asimetričnog kriptografskog algoritma.

 

Skica upotrebe je dana slikom 2.4. Da bi korisnik A mogao poslati poruku korisniku B, prvo treba od njega dobiti njegov javni ključ e. S tim ključem se kriptiranjem poruke m dobije kriptirana poruka c koja se šalje korisniku B. Korisnik B dekriptira poruku c sa svojim privatnim dekripcijskim ključem d. Kako su oba kanala nesigurna, neovlašteni korisnik može lako doći do javnog ključa e i do kriptirane poruke c. No da bi saznao tekst poruke m, neovlašteni korisnik treba pronaći vrijednost ključa d, što je iz poznatih informacija vrlo teško. Neovlašteni korisnik je u ovom slučaju označen kao pasivni zato jer ne mijenja podatke na komunikacisjkim kanalima. U slučaju kada bi on bio aktivan, vrlo bi lako zamijenio javni ključ korisnika B sa svojim javnim ključem e' i nakon toga presreo kriptiranu poruku c namijenjenu korisniku B i dekriptirao je svojim ključem d'. To se naziva krivim predstavljanjem (engl. impersonation) i primjer je neuspjeha protokola razmjene ključeva. Do rješenja tog problema dolazi se razvojem protokola razmjene ključeva, tj. niza postupaka koji se moraju izvoditi jedan nakon drugog, a koji za cilj imaju sigurnu i uspješnu distribuciju ključeva potrebnih za komunikaciju.  Nakon uspostave sigurne komunikacije preko nesigurnog kanala s asimetričnim algoritmom, obično se kao poruka šalje ključ simetričnog algoritma es koji se dalje koristi za enkripciju i dekripciju podataka. Time se koriste dobre strane oba algoritma, asimetrični algoritam se upotrebljava za razmjenu ključeva, dok se simetričnim algoritmom zaštićuju sami podaci.

 

Tablica 2.2  Uobičajene veličine ključeva različitih asimetričnih kriptografskih algoritama.

Algoritam

Veličina ključa (bit)

Diffie-Hellman

1024

DSA

1024

ElGamal

1024

RSA

1024

 

Sigurnost asimetričnog algoritma obično se oslanja na sigurnost rješavanja nekog matematičkog problema, kao što je faktoriziranje velikih brojeva i postoje načini da se dođe do rješenja lakše nego da se provjerava svaki mogući ključ. Kako znanost napreduje, tako se nalaze sve bolji i brži načini rješavanja matematičkog problema, što uvjetuje i povećanje drugog sigurnosnog čimbenika, veličine ključa. Zbog toga je prosječna veličina ključa asimetričnog algoritma prilično veća od prosječne veličine ključa simetričnog algoritma.

 

 

2.4.    Generator kriptografsko sigurnih pseudo-slučajnih brojeva

Generator slučajnih brojeva je važan dio kriptografskog mehanizma. Koristi se za stvaranje ključeva koji moraju biti nepredvidljivi potencijalnom napadaču na sigurnost sustava. Kako su računala deterministička[8], pravi slučajni niz podataka je nemoguće stvarati bez nekakvog vanjskog izvora entropije. Takav izvor entropije može biti senzor koji prati termički šum ili neku drugu veličinu u prirodi koju ne možemo predvidjeti. No za većinu praktičnih primjena jedino će biti dostupna programska izvedba generatora slučajnih brojeva.

Svaki programski izvedeni generator pseudo-slučajnih brojeva radi na sličan način. Kreće od stvarno slučajnog broja koje se naziva sjeme (engl. seed) i na osnovu njega koristi posebni algoritam za kreiranje pseudo-slučajnog niza bitova. Najteži dio ovog procesa je naći sjeme koje je uistinu slučajan broj. Za sjeme se obično uzima neki vanjski izvor entropije, kao što je interakcija korisnika s nekakvim vanjskim uređajem ili nešto slično.

·        Pseudo-slučajni niz bitova je onaj niz koji izgleda slučajno. Period ponavljanja niza mora biti dovoljno velik da se niti jedan dio niza ne ne ponovi u izlaznom nizu. To se može provjeriti različitim statističkim testovima slučajnosti. Na primjer, binarni pseudo-slučajni niz treba imati otprilike isti broj nula i jedinica, oko pola binarnih nizova koji se ponavljaju duljine 1 (znak 0 ili 1), četvrtinu nizova koji se ponavljaju s dužinom 2 (niz: 00 ili 11), osminu nizova koji se ponavljaju s dužinom 3 (000 ili 111) i tako dalje.

·        Kriptografsko siguran pseudo-slučajan niz je onaj koji je nepredvidiv. To znači da uz kompletno poznavanje algoritma ili sklopovlja koje kreira slučajan niz i svih brojeva koje su dosad stvarani pseudo-slučajnim generatorom, nije moguće predvidjeti idući slučajni bit u nizu. Kao i svaki drugi kriptografski algoritam, generator kriptografsko sigurnih pseudo-slučajnih brojeva je isto moguće napasti i kompromitirati nepredvidivost generatora.

·        Generator brojeva je stvarno slučajan ako se uz iste ulazne parametre ne može pouzdano dobiti isti niz slučajnih bitova dva puta. Rezultati trebaju biti dva potpuno nepovezana slučajna niza podataka.

Izlaz iz generatora koji zadovoljava sve te kriterije je dovoljno dobar za većinu kriptografskih primjena.

 

 

2.5.    Jednostrana hash funkcija

Jednostrana hash-funkcija (engl. one-way hash function, message digest, fingerprint), ima veliku praktičnu primjenu u modernoj kriptografiji. U suradnji s ostalim kriptografskim alatima, koristi se za utvrđivanje vjerodostojnosti podataka i njihovog porijekla.

Učinkovita funkcija koja preslikava niz proizvoljne duljine u binarni niz fiksne duljine zove se jednostrana hash-funkcija. Binarni niz fiksne duljine se zove hash-vrijednost (engl. hash-value) i uobičajeno je duljine 128 ili 160 bitova.

Važne karakteristike hash-funkcije su sljedeće:

·     Sve hash-funkcije su jednosmjerne. Počev od hash-vrijednosti, nemoguće je doći do originalne poruke (ili je vrlo vrlo teško).

·     Svaki par različitih poruka se treba preslikati u različite hash-vrijednosti, čak i ako se poruke razlikuju za samo jedan bit. U stvarnosti, postoje parovi poruka koje rezultiraju istom hash-vrijednošću, ali vjerojatnost mora biti mala da će taj par biti sastavljen od smislenih podataka (teksta npr.)

·     Svaki put kad se ista poruka pusti kroz istu hash funkciju, rezultira točno istom hash-vrijednošću

·     Duljina hash-vrijednosti je određena samim hash algoritmom i ne mijenja se s dužinom poruke koja se obrađuje. Najčešće duljine hash-vrijednosti su 128 i 160 bita.

Tablica 2.3  Usporedba dužine hash-vrijednosti različitih algoritama.

Algoritam

Hash vrijednost (bit)

MD2

128

MD4

128

MD5

128

MDC-2

128

RIPEMD-160

160

SHA

160

 

Budući da je algoritam hash-funkcije javan, njena sigurnost leži u jednosmjernosti, jer nije moguće dobiti originalni niz podataka iz same hash-vrijednosti. Najčešće korištenje hash funkcija je u osiguravanju vjerodostojnosti podataka, na primjer, zaštiti datoteka od promjene, zaštiti elektroničkih financijskih radnji od zlonamjerne manipulacije i slično. U kombinaciji s asimetričnim kriptografskim algoritmima, hash-vrijednost se koristi i za osiguravanje porijekla informacije preko sustava digitalnih potpisa.

 

 

2.6.    Digitalno potpisivanje poruka

Digitalni potpis osnovna je metoda za provjeru porijekla informacije. Svaki korisnik u globalnom elektroničkom sustavu treba imati svoj digitalni potpis, koji je zapravo njegov osobni identitet. Pomoću svog potpisa korisnik ovlašćuje neku radnju i preuzima odgovornost za nju.  Zahtjevi koji se postavljaju pred digitalni potpis:

 

1.      Vjerodostojnost. Potpis uvjerava primatelja dokumenta da je potpisani namjerno potpisao dokument;

2.      Nemogućnost krivotvorenja. Potpis je dokaz da je upravo potpisani autor dokumenta, i da nitko drugi umjesto njega nije stavio njegov potpis;

3.      Nemogućnost ponovnog korištenja. Potpis je izveden iz dokumenta i ne može se samo prebaciti na drugi dokument;

4.      Vjerodostojnost potpisanog dokumenta. Jednom kada je dokument potpisan, ne može se više promijeniti;

5.      Nemogućnost izbjegavanja odgovornosti. Potpis i dokument osiguravaju da potpisani ne može izbjeći odgovornost za kreiranje potpisa i dokumenta.


Postoje dva koraka kod stvaranja digitalnog potpisa poruke. Prvi korak je nalaženje hash-vrijednosti same poruke. Ta hash vrijednost se onda u drugom koraku potpisuje, koristeći privatni ključ pošiljaoca.

 

 

 

 

 

 


Slika 2.5  Skica algoritma digitalnog potpisivanja poruke.

Za provjeru potpisa, potrebna je sama poruka i digitalni potpis. Prvo, stvara se hash-vrijednost iz poruke na isti način kao i kod pošiljaoca. Onda se ta hash-vrijednost uspoređuje sa hash-vrijednosti koja se iz potpisa dobije dekriptiranjem pomoću javnog ključa pošiljaoca. Ako su hash-vrijednosti iste, onda je poruka vjerodostojna u sadržaju i porijeklu.

 

 

 

 

 

 


Slika 2.6  Skica algoritma provjere digitalnog potpisa poruke.

 

 

2.7.    Kriptoanaliza

Smisao kriptografije je da se sačuva tajnost jasnog teksta (engl. plain text) od mogućih prisluškivanja. Pretpostavlja se da osobe koje prisluškuju imaju pristup svim komunikacijama između pošiljatelja i primatelja.

Kriptoanaliza je nauka o otkrivanju jasnog teksta poruke bez poznatog ključa. Uspješna kriptoanaliza treba otkriti jasni tekst ili ključ. Moguće je da kriptoanaliza otkrije i slabosti u samom kriptografskom algoritmu koje mogu dovesti do otkrivanja jasnog teksta ili ključa.

Pokušaj kriptonalize nekog kriptografskog sustava se naziva napad (engl. attack). Osnovna pretpostavka je da je tajnost poruke sadržana u potpunosti u tajnosti ključa. Pretpostavka je i da su kriptografski algoritmi i njihove implementacije dostupni za potrebe kriptoanalize. Postoje šest osnovnih vrsta kriptoanalitičkih napada:

1.         Napad na kriptirani tekst (engl. Ciphertext-only attack). Kriptoanalitičaru su dostupne samo kriptirane poruke, koje su sve kriptirane s istim algoritmom, a cilj mu je otkriti što više izvornih nekriptiranih poruka ili još bolje otkriti ključ (ili ključeve) kojim je kriptiranje obavljeno. Ako se ovaj napad koristi tako da se provjerava svaki ključ na kriptiranom tekstu, taj se napad zove gruba sila (engl. brute force).

2.          Napad na poznati jasni tekst (engl. Known-plaintext attack). Kriptoanalitičar ima dostup do kriptiranog teksta i pripadajućeg mu jasnog teksta za nekoliko različitih poruka, cilj mu je otkriti ključ (ili ključeve) kojim je kriptiranje obavljeno.

3.         Napad na odabrani jasni tekst (engl. Chosen-plaintext attack). Cilj je opet otkriti ključ kojim je kriptirane obavljeno, ali ovaj put kriptoanalitičar ima pristup kriptiranom tekstu, pripadajućem mu jasnom tekstu, ali može i odabrati koji će se jasni tekst dalje kriptirati. Ovo je jači napad od prethodnog, zato jer kriptoanalitičar može birati specifične kombinacije jasnog teksta koje će mu dati više informacija o ključu.

4.         Napad na odabrani kriptirani tekst (engl. Chosen-ciphertext-attack). Kriptoanalitičar može odabrati različite kriptirane nizove i ima pristup dekriptiranom jasnom tekstu. Cilj je otkriti ključ. Ovaj napad je najčešće primjenjiv na asimetrične algoritme.

5.         Napad na odabrani ključ (engl. Chosen-key attack). Kriptoanalitičar ima neko znanje o međusobnom odnosu između nekoliko ključeva.

6.         Ucjenjivanje. Kriptoanalitičar ucjenom ili prijetnjom dolazi do ključa od korisnika.

Različiti algoritmi pružaju različite razine sigurnosti, ovisno o tome koliko ih je teško savladati. Ako je cijena savladavanja algoritma veća od vrijednosti kriptiranih podatka, algoritam je siguran. Ako je vrijeme potrebno za savladavanje algoritma veće nego vrijeme za koje kriptirani podatak mora ostati tajan, algoritam je siguran. Ako je količina kriptiranih podataka s jednim ključem manja od količine potrebne da se savlada algoritam, onda je taj algoritam siguran.

Lars Knudsen je razvrstao četiri razine mogućeg savladavanja kriptografskog algoritma:

1.         Totalno savladavanje (engl. total break). Kriptoanalitičar je našao ključ, k, takav da je D(c,k) = m.

2.         Globalna dedukcija (engl. global deduction). Kriptoanalitičar je našao drugi algoritam ekvivalentan D(c,k) kojim dekriptira poruku m bez poznavanja ključa k

3.         Lokalna dedukcija (engl. local deduction). Kriptoanalitičar je našao izvornu poruku u jasnom tekstu na osnovu presretnutog kriptiranog teksta.

4.         Informacijska dedukcija (engl. information deduction). Kriptoanalitičar je saznao nešto o ključu ili o izvornoj poruci u jasnom tekstu. Ova informacija može biti dio ključa ili dio poruke itd.

Algoritam je bezuvjetno siguran ako ne pruža dovoljno informacija za kriptoanalizu kriptiranog teksta, bez obzira koliko je jasnog teksta kriptirano. Međutim, kriptografiji je zanimljiviji pojam kriptografski jakog algoritma koji se ne može savladati sa sadašnjim ili budućim računalnim mogućnostima u nekakvom vremenu u kojem bi nam ta otkrivena informacija mogla koristiti.

 

Tablica 2.4  Predviđena duljina sigurnog asimetričnog ključa u budućnosti[9].

Godina

Preporučena dužina ključa (u bitovima)

pojedinci

tvrtke

vlade

1995

768

1280

1536

2000

1024

1280

1536

2005

1280

1536

2048

2010

1280

1536

2048

2015

1536

2048

2048

 

U tablici  6 dano je samo predviđanje koje se računa na osnovu razvoja kompjutera i matematičkih algoritama. Prave vrijednosti će se vjerojatno razlikovati jer je teško zamisliti sve napretke u matematici do godine 2020. Paralelno procesiranje, korištenje molekula DNA i kvantnih računala donose nove i bolje alate za kriptoanalizu. S druge strane, napredak u tehnologiji i matematici donosi mnogo novosti i kriptografskim algoritmima koji se također razvijaju i postaju sigurniji i učinkovitiji.

 


3.       Sučelje modula

 

Sučelje definiraju funkcije za rad sa kontekstom, za rad sa ključevima, kriptiranje i dekriptiranje podataka,  hash-funkcije te digitalno potpisivanje.

Sve kriptografske operacije se obavljaju u samom kriptografskom modulu. Kroz ove funkcije se obavlja komunikacija između korisnika kriptografskih usluga i kriptografskih modula kao davatelja kriptografskih usluga.

 

 

3.1.    Početak rada  - postavljanje konteksta

Na samom početku rada sa kriptografskim sučeljem, potrebno je kreirati barem jedan radni kontekst. Taj kontekst se dalje koristi kao privremeni spremnik za ključeve, hash vrijednosti i digitalne potpise. Kontekst se dodjeljuje svakom pojedinom korisniku sučelja i nije dozvoljeno korištenje tog konteksta od strane bilo kojeg drugog korisnika. Time je osigurana privatnost spremnika za ključeve i pristup samo vlasniku zaštićenih podataka. Opis funkcija je dan u tablici 3.1.

 

Tablica 3.1 Funkcije za postavljanje konteksta i podešavanje rada kriptografskog modula.

Funkcija

Opis

CPAcquireContext

Dobiva oznaku za korisnički spremnik ključeva unutar točno određenog modula.

CPGetProvParam

Pokazuje atribute modula.

CPReleaseContext

Oslobađa oznaku dodijeljenu sa CPAcquireContext.

CPSetProvider

Označava unaprijed definiranu vrijednost korisničkog modula za određeni tip modula.

CPSetProvParam

Postavlja atribute modula.

 

3.1.1.     Funkcija CPAcquireContext

Funkcija CPAcquireContext se koristi za dobivanje oznake za korištenje spremnika ključeva unutar kriptografskog modula. Ta oznaka se koristi kod pozivanja svih drugih funkcija unutar odabranog modula.

Ova funkcija obavlja dvije operacije. Prvo pokušava pronaći modul s točno određenim karakteristikama koje su opisane u paremetrima dwProvType i pszProvider. Ako je modul nađen, funkcija pokušava pronaći spremnik za ključ pod imenom koji određuje parametar pszContainer. U ovisnosti od vrijednosti parametra dwFlags, funkcija se može koristiti i za stvaranje, odnosno brisanje spremnika za ključeve.


BOOL WINAPI CPAcquireContext(

  HCPPROV *phProv,   // out

  LPCTSTR pszContainer, // in

  LPCTSTR pszProvider,  // in

  DWORD dwProvType,     // in

  DWORD dwFlags         // in

);

 

Parametri:

phProv

Adresa na koju funkcija sprema oznaku modula.

pszContainer

Ime spremnika ključeva. Ime je potpuno nezavisno o metodi koja se koristi za spremanje ključeva. Ako je parametar dwFlags podešen na CP_VERIFYCONTEXT, ovaj parametar  pszContainer treba biti postavljen na NULL.

Ako je ovaj parametar NULL, koristit će se unaprijed definirani spremnik za ključeve. Program može saznati ime dodijeljenog spremnika za ključeve kasnije čitanjem parametra  PP_CONTAINER modul preko CPGetProvParam funkcije.

pszProvider

Naziv kriptografskog modula. Ovaj niz znakova označava koji modul želimo koristiti. Ako je ovaj parametar NULL, koristi se unaprijed određeni modul.  Program može saznati ime dodijeljenog modula kasnije čitanjem parametra  PP_NAME modul preko CPGetProvParam funkcije.

dwProvType

Tip kritpografskog modula. Koristi se također za specifikaciju kriptografskog modula.

  • PROV_CRYPTO_FULL

dwFlags

Zastavice.

·        CP_NEWKEYSET. Ako je ova zastavica postavljena, stvara se novi spremnik ključeva pod imenom određenim u parametrau pszContainer. Ako je pszContainer postavljen u NULL, onda se stvara spremnik ključeva s unaprijed definiranim imenom.

·        CP_DELETEKEYSET. Uz ovu zastavicu, spremnik ključeva određen parametrom pszContainer se briše. Ako je parametar pszContainer NULL, onda se briše spremnik ključeva s unaprijed određenim imenom. Svi ključevi unutar spremnika su isto izbrisani.

Poslije poziva funkcije s postavljenom zastavicom CP_DELETEKEYSET, kontekst i spremnik ključeva se brišu, tako da poslije nije potrebno pozvati funkciju CPReleaseContext za oslobađanje konteksta.


Povratne vrijednosti. Ako funkcija uspije s izvršavanjem, vraća vrijednost TRUE. Ako ne uspije, vrati vrijednost FALSE. Da bi se doznalo više o samoj grešci koja je izazvala neuspjelo izvršavanje funkcije, koristi se GetLastError function. Opis poruka je dan u tablici 3.2.

 

Tablica 3.2  Greške koje vraća funkcija CPAcquireContext.

Greška

Opis

ERROR_INVALID_PARAMETER

Jedan od parametara sadrži nedozvoljenu vrijednost. Najčešće je to slučaj s nevažećim pokazivačima.

ERROR_NOT_ENOUGH_MEMORY

Nema dovoljno memorije.

NTE_BAD_FLAGS

Parametar dwFlags sadrži nedozvoljene vrijednosti.

NTE_BAD_KEYSET

Zapis u sistemskoj bazi podataka za spremnik ključeva se ne može otvoriti.

NTE_BAD_KEYSET_PARAM

Parametri pszContainer ili pszProvider su postavljeni na nedozvoljene vrijednosti.

NTE_BAD_SIGNATURE

Potpis DLL-a od davatelja usluga se ne može provjeriti. Promijenjen je ili sam DLL ili njegov potpis.

NTE_EXISTS

Spremnik za ključeve već postoji.

NTE_NO_MEMORY

Modulu je ponestalo memorije

NTE_PROV_TYPE_NOT_DEF

Nema zapisa unutar sistemske baze podataka s tipom davatelja usluga zatraženom preko parametra dwProvType.

NTE_SIGNATURE_FILE_BAD

Došlo je do greške kod učitavanja podataka, prije provjere potpisa.

 

 

3.2.    Kreiranje ključeva

Postoje dva tipa kriptografskih ključeva:

1.         Sjednički (simerični) ključevi

2.         Parovi javnih i privatnih (asimetričnih) ključeva.

Sjednički ključevi se koriste uglavnom za kriptiranje podataka kod simetričnih kriptografskih algoritama (isti se ključ koristi za kriptiranje i dekriptiranje). Većina aktivnosti sa sjedničkim ključevima zahtjeva njihovu tajnost. Važno je da broj ljudi koji posjeduje pojedini sjednički ključ bude što manji (obično je to par korisnika koji komuniciraju).

Par javnih i privatnih ključeva se sastoje od dva dijela: javnog ključa i privatnog ključa. Javni ključ se može dijeliti preko mreže svakome tko ga želi ili treba, dok se privatni ključ čuva tajnim. Samo vlasnik smije znati svoj privatni ključ. Jedan od ključeva (javni ključ) se koristi za kriptiranje poruke, dok je drugi ključ potreban za dekriptiranje. To znači da ako se određena poruka kriptira javnim ključem korisnika A, jedino je korisnik A može dekriptirati sa svojim privatnim ključem. Ako se privatni ključ koristi za potpisivanje poruke, onda se javni ključ mora koristiti za provjeru vjerodostojnosti tog potpisa.

Na žalost, asimetrični algoritmi s parom javni/privatni ključ su spori i nepraktični za kriptiranje velike količine podataka. U praksi, simetrični algoritmi se koriste za kriptiranje i dekriptiranje podataka, dok se asimetrični algoritmi koriste samo za kriptiranje simetričnih, sjedničkih ključeva. Isto tako, nije praktično koristiti asimetrične algoritme za potpise velikih poruka. Umjesto toga, koristi se hash-funkcija i onda se asimetričnim algoritmom potpiše hash-vrijednost. Opis funkcija je dan tablicom 3.3.

 

Tablica 3.3 Funkcije za kreiranje ključeva, njihovo prilagođavanje, kopiranje i brisanje.

Funkcija

Opis

CPDeriveKey

Kreira ključ izveden iz lozinke i daje oznaku u parametru hKey.

CPGenKey

Kreira slučajan ključ.

CPDestroyKey

Oslobađa oznaku za ključ iz parametra hKey. Nakon što je oznaka izbrisana, taj ključ se više ne može koristiti.

CPDuplicateKey

Kopira se ključ i stanje u kojem se nalazi.

CPGetKeyParam

Dobavlja parametre vezane za ključ.

CPSetKeyParam

Postavlja parametre vezana za ključ.

 

 

 

3.2.1.     Funkcija CPGenKey

Funkcija CPGenKey kreira slučajan kriptografski ključ koji se koristi unutar modula. Oznaka za ključ se vraća u phKey. Ova oznaka se kasnije može koristiti kao parametar drugim funkcijama iz sučelja koje koriste oznake ključeva.

Pozivajući program mora točno odrediti algoritam prilikom pozivanja ove funkcije. Budući da se algoritam nalazi unutar zapisa ključa, program ne treba kasnije paziti na algoritam.

 

BOOL WINAPI CPGenKey(

  HCPPROV hProv,  // in

  ALG_ID Algid,   // in

  DWORD dwFlags,  // in

  HCPKEY *phKey   // out

);

 

 

Parametri:

hProv

Oznaka za modul unutar programa. Program dobiva ovu oznaku preko funkcije CPAcquireContext.


Algid

Identifikator za algoritam po kojem se ključ kreira,kao u tablici 3.4:

 

Tablica 3.4  Opis identifikatora algoritma.

Vrijednost

Opis

CALG_IDEA

IDEA algoritam za kriptiranje blokova podataka

CALG_RSA

RSA algoritam za kriptiranje blokova podataka

CALG_RSA_SIGN

AT_SIGNATURE

RSA algoritam za potpisivanje podataka.

CALG_RSA_KEYX

AT_KEYEXCHANGE

RSA algoritam za razmjenu ključeva

 

dwFlags

Zastavice koje određuju tip ključa koji se generira.

Veličine RSA potpisa i parova asimetričnih ključeva se mogu postaviti kada se generira ključ. Veličina ključa se postavlja u gornjih 16 bita dwFlags parametra i tih 16 bitova predstavljaju dužinu ključa (modul) u bitovima. Tako npr. ako se generira 2048 bitni RSA ključ za potpis, onda se vrijednost 0x08000000 treba spojiti logičkim ILI s ostalim zastavicama. Ako nije postavljen ni jedan bit u gornjih 16 bita, onda se stvara ključ unaprijed određene veličine.

Ovaj parametar može biti nula ili:

·        CP_EXPORTABLE. Ako je ova zastavica postavljena, ključ se može prebaciti iz modula u korisnički program koristeći funkciju CPExportKey. Budući da se sjednički ključevi uglavnom moraju izmjenjivati između programa, ova se zastavica obično postavlja prilikom njihova kreiranja.
Ako ova zastavica nije postavljena, onda ključ neće biti moguće prebaciti u memoriju. Za sjednički ključ to znači da će biti na raspolaganju samo za vrijeme trenutne sjednice i to samo od strane programa koji ga je kreirao. Za par asimetričnih ključeva to znači da se privatni ključ ne može prebaciti niti spremiti.
Ova se zastavica odnosi samo na sjedničke i privatne ključeve. Ne odnosi se na javne ključeve, koji se uvijek mogu prebaciti u memoriju.

phKey

Adresa u koju funkcija sprema oznaku od novo generiranog ključa.

 


Povratne vrijednosti. Ako funkcija uspije s izvršavanjem, vraća vrijednost TRUE. Ako ne uspije, vrati vrijednost FALSE. Da bi se doznalo više o samoj grešci koja je izazvala neuspjelo izvršavanje funkcije, koristi se GetLastError function. Popis grešaka je dan u tablici 3.5.

 

Tablica 3.5 Greške koje vraća funkcija CPGenKey.

Greška

Opis

ERROR_INVALID_HANDLE

Jedan od parametara je nedozvoljena oznaka.

ERROR_INVALID_PARAMETER

Jedan od parametara je nedozvoljena vrijednost (obično pokazivač).

NTE_BAD_ALGID

Parametar Algid označava algoritam koji modul ne podržava.

NTE_BAD_FLAGS

Parametar dwFlags sadrži nedozvoljenu vrijednost.

NTE_BAD_UID

Parametar hProv ne sadrži valjanu oznaku konteksta.

NTE_FAIL

Neočekivani kraj funkcije.

 

Napomene. Kada se kreira ključ za simetrični kriptografski algoritam, biti će podešen na ulančani mod šifriranja blokova (s povratnom vezom) s osnovnim vektorom 0. Ovaj mod šifriranja je dobra osnovna metoda za kriptiranje različitih podataka. Za promjenu tih parametara, treba pozvati CPSetKeyParam funkciju.

Uz kreiranje ključeva za simetrične algoritme, CPGenKey funkcija može kreirati i par asimetričnih ključeva za asimetrične algoritme. Korištenje asimetričnih algoritama je preporučeno za izmjenu ključeva i digitalne potpise. Svaki klijent obično treba po jedan par ključeva za svaku od tih operacija. Za kreiranje jednog od tih dvaju tipova ključeva, treba podesiti parametar Algid u jednu od sljedećih vrijednosti, prema tablici 3.6.

 

Tablica 3.6  Vrijednosti parametra Algid za ključeve za izmjenu i potpisivanje.

Vrijednost

Opis

AT_KEYEXCHANGE

Izmjena ključeva (stvara se par javni/privatni ključ)

AT_SIGNATURE

Digitalni potpis

 

Unutar jednog konteksta, dozvoljeno je kreirati samo jedan par ključeva koji će se koristiti za razmjenu i jedan par ključeva koji će se koristiti za potpisivanje.

 

 

 

 

3.3.    Razmjena kriptografskih ključeva

Kada se ključ prenosi iz sigurne okoline davatelja kriptografskih usluga (modula) u memoriju programa koji ga koristi, ključevi su obično kriptirani i spremljeni u posebne podatkovne strukutre koje se nazivaju key blobs, a sadrže sam ključ i zapis o algoritmu kojim je nastao. 

Postoje dvije uobičajene situacije u kojima se ključevi prenose u memoriju programa koji ih koristi:

·        za spremanje sjedničkog ključa za kasnije korištenje. Npr. ako je ključ korišten za kriptiranje datoteke baze podataka, dužnost je programa da spremi ključ kojim će kasnije pristupiti bazi podataka. Ovo je bitno jer se sjednički ključevi ne spremaju izvan jedne sjednice rada s modulom. (između poziva funkcije CPAcquireContext i poziva funckije CPReleaseContext)

·        za slanje ključa drugom korisniku. Ovo bi bilo puno lakše ako bi modul moduli mogli komunicirati direktno, ali ne mogu. Ovo znači da se ključ mora prebaciti iz modula u memoriju, prebaciti iz programa jednog korisnika u program drugog korisnika, i onda uvesti u odredišni modul. Ako je veza između korisnika nesigurna, koriste se posebni protokoli razmjene kriptiranih ključeva.

 

Napomena Prije razmjene ključeva pretpostavlja se da korisnici već imaju svoje parove asimetričnih ključeva potrebne za zaštitu komunikacije.

 

 

3.3.1.     Funkcija CPExportKey

Funkcija CPExportKey se koristi za prebacivanje kriptografskih ključeva izvan modula u memorijski prostor programa na siguran način. Siguran način znači da se na osnovi dobivenih podataka ne može kompromitirati sigurnost komunikacije.

Kao ulazni parametar se daje oznaka na ključ koji treba prebaciti, a funkcija vraća podatke od ključa na određeno mjesto u memoriji. Ovi podaci od ključa su kriptirani i mogu se slati preko nesigurne veze ili spremiti bez potrebe zaštite. Podaci su beskorisni sve dok ih korisnik kome su namjenjeni ne ubaci u svoj modul preko funkcije CPImportKey.

 

 

BOOL WINAPI CPExportKey(

  HCRYPTKEY hKey,     // in

  HCRYPTKEY hExpKey,  // in

  DWORD dwBlobType,   // in

  DWORD dwFlags,      // in

  BYTE *pbData,       // out

  DWORD *pcbDataLen   // in/out

);

 

 

 

Parametri:

hKey

Oznaka ključa koji se prebacuje.

hExpKey

Oznaka na javni ključ koji pripada korisniku kome je namijenjen sjednički ključ. Sam sjednički ključ će biti kriptiran tim javnim ključem. To osigurava da će samo pravi korisnik kome je ta poruka namijenjena moći dekriptirati sjednički ključ sa svojim privatnim ključem.

Ako je vrsta ključa zadana s dwBlobType PUBLICKEYBLOB, onda se ovaj parametar ne koristi i treba biti nula.

dwBlobType

Tip ključa koji se prenosi. Mora biti jedna od sljedećih konstanti:

·        SIMPLEBLOB – za prenošenje sjedničkog ključa, kriptirano javnim ključem drugog korisnika

·        PUBLICKEYBLOB – za prenošenje javnog ključa, nekriptirano

dwFlags

Vrijednost zastavica. Ovaj parametar će se koristiti u budućnosti i sada treba biti nula.

pbData

Pokazivač na spremnik u koji se spremaju podaci o ključu.

Ovaj parametar može biti NULL da bi se dobila veličina podataka o ključu koje treba rezervirati u memoriji prije njihovog prenošenja.

pcbDataLen

Pokazivač na duljinu podataka o ključu, u oktetima. Kada kraja izvršavanja funkcije, na ovu poziciju se količina memorije potrebna za podatake o ključu.

 

Povratne vrijednosti. Ako funkcija uspije s izvršavanjem, vraća vrijednost TRUE. Ako ne uspije, vrati vrijednost FALSE. Da bi se doznalo više o samoj grešci koja je izazvala neuspjelo izvršavanje funkcije, koristi se GetLastError function. Popis grešaka je dan u tablici 3.7.

Tablica 3.7  Greške koje vraća funkcija CPExportKey.

Greška

Opis

ERROR_INVALID_PARAMETER

Jedan od parametara ima nedozvoljenu vrijednost.

ERROR_MORE_DATA

Ako spremnik određen s parametrom pbData nije dovoljno velik za podatke, javlja se ova greška i sprema veličinu potrebnog spremnika u varijablu na koju pokazuje parametar pcbDataLen.

NTE_BAD_FLAGS

Parametar dwFlags nije nula.

NTE_BAD_KEY

Jedan ili oba ključa označenih sa hKey i hExpKey su nedozvoljeni.

NTE_BAD_KEY_STATE

Kod kreiranja ključa hKey nije bila postavljena zastavica CRYPT_EXPORTABLE i ključ se ne može prenositi.

NTE_BAD_PUBLIC_KEY

Tip ključa iz dwBlobType je PUBLICKEYBLOB, ali hExpKey ne sadrži oznaku za javni ključ.

NTE_BAD_TYPE

Parametar dwBlobType sadrži nepoznati tip ključa.

NTE_BAD_UID

Kontekst iz modula kad je hKey kreiran se ne može pronaći.

3.3.2.     Funkcija CPImportKey

Funkcija CPImportKey se koristi kod prenošenja podataka o ključu u sam modul.

BOOL WINAPI CPImportKey(

  HCRYPTPROV hProv,  // in

  BYTE *pbData,      // in

  DWORD dwDataLen,      // in

  HCRYPTKEY hPubKey, // in

  DWORD dwFlags,     // in

  HCRYPTKEY *phKey   // out

);

 

Parametri:

hProv

Oznaka korištenog modula. Do te se oznake može doći pomoću CPAcquireContext funkcije.

pbData

Spremnik koji sadrži podatke o ključu. Podaci o ključu su dobiveni pomoću funkcije CPExportKey. Podaci su kriptirani (ako se ne radi o javnom ključu).

dwDataLen

Dužina podataka u oktetima.

hPubKey

Vrijednost ovog parametra ovisi o tipu modula i tipu ključa koji se prenosi.

Ako se unose podaci o ključu s potpisom, ovaj ključ se koristi za provjeravanje potpisa. U ovom slučaju, ovaj parametar treba sadržati oznaku na javni ključ korisnika koja je kreirala taj ključ koji se prenosi.

Ako su podaci kriptirani s javnim ključem korisnika kojem je namijenjen sjednički ključ, onda ovaj parametar treba sadržavati oznaku javnog ključa tog korisnika. Unutar modula nalazi se par javnom ključu - privatni ključ kojim će se sjednički ključ dekriptirati unutar modula.

Ako podaci nisu kriptirani (PUBLICKEYBLOB), ovaj parametar se ne koristi i treba biti nula.

dwFlags

Vrijednosti zastavica. Ovaj parametar je rezerviran za kasnije korištenje.

phKey

Adresa na koju funkcija postavlja oznaku uvezenog ključa.

 

Povratne vrijednosti. Ako funkcija uspije s izvršavanjem, vraća vrijednost TRUE. Ako ne uspije, vrati vrijednost FALSE. Da bi se doznalo više o samoj grešci koja je izazvala neuspjelo izvršavanje funkcije, koristi se GetLastError function. Popis grešaka je dan u tablici 3.8.


Tablica 3.8  Greške koje vraća funkcija CPImportKey.

Greška

Opis

ERROR_INVALID_HANDLE

Jedan od parametara sadrži nevažeću oznaku.

ERROR_INVALID_PARAMETER

Jedan od parametara sadrži nedozvoljenu vrijednost.

NTE_BAD_ALGID

Podaci u spremniku nisu kriptirani s očekivanim algoritmom za razmjenu ključeva.

NTE_BAD_DATA

Ili algoritam za razmjenu ključeva koji radi s javnim ključem ne postoji u ovom modulu, ili se pokušavaju dekriptirati podaci o sjedničkom ključu s tuđim parom ključeva.

NTE_BAD_FLAGS

Parametar dwFlags nije nula.

NTE_BAD_TYPE

Vrsta ključa nije podržana od strane trenutno odabranog modula.

NTE_BAD_UID

Parametar hProv neme važeću oznaku konteksta.

NTE_BAD_VER

Verzija modula iz koje su podaci o ključu preneseni ne odgovara inačici lokalnog modula. Ovo obično znači da se treba nabaviti nova inačica modula.

 

 

3.4.    Enkripcija i dekripcija podataka

Ovdje su opisane funkcije za kriptiranje i dekriptiranje podataka. Prije pozivanja tih funkcija, potreban je ključ za kriptiranje. To se dobiva preko funkcija: CPGenKey, CPDeriveKey, ili CPImportKey. Kriptografski algoritam se određuje kod kreiranja ključa.

 

Tablica 3.9  Popis funkcija za enkripciju i dekripciju podataka.

Funkcija

Opis

CPEncrypt

Kriptira podatke koristeći zadani ključ.

CPDecrypt

Dekriptira podatke koristeći zadani ključ.

 

 

3.4.1.     Funkcija CPEncrypt

Algoritam koji se koristi za kriptiranje je već određen s generiranim ključem koji se koristi za kriptiranje.

 

BOOL WINAPI CPEncrypt(

  HCRYPTKEY hKey,   // in

  HCRYPTHASH hHash, // in

  BOOL Final,       // in

  DWORD dwFlags,    // in

  BYTE *pbData,     // in/out

  DWORD *pcbData,   // in/out

  DWORD cbBuffer    // in

);

Parametri:

hKey

Oznaka ključa koji se koristi za kriptiranje (dobivenog s CPGenKey ili CPImportKey funkcijom).

hHash

Oznaka za hash objekt. Ovaj parametar se koristi samo ako se stvara hash-vrijednost u isto vrijeme kada se i kriptiraju podaci, inače je nula.

Final

Logička vrijednost koja označava da li je ovo zadnji blok podataka koji se kriptira ili ne.

dwFlags

Zastavice. Ovaj parametar se zasad ne koristi i treba biti nula.

pbData

Spremnik za podatke koji se trebaju kriptirati. Nakon kriptiranja, podaci se spremaju natrag u isti spremnik. Veličina spremnika je određena u cbBuffer. Broj okteta koji se trebaju kriptirati je određen u pcbData.

Ovaj parametar može biti NULL ako se treba odrediti veličina spremnika za kriptirani tekst.

pcbData

Pokazivač na dužinu podataka. Ovdje se treba postaviti dužina poruke za kriptiranje u oktetima. Nakon izvršavanja funkcije, na ovoj adresi će biti zapisan broj okteta kriptirane poruke.

Ako se koristi kriptiranje podataka kroz blokove, dužina podataka mora biti višekratnik veličine bloka, osim ako ovo nije zadnji dio podataka i Final zastavica je postavljena u TRUE.

cbBuffer

Veličina pbData spremnika. Ovisno o korištenom algoritmu, veličina kriptirane poruke može biti veća od veličine ulazne poruke. Zbog toga treba voditi računa o veličini spremnika.

 

Povratne vrijednosti. Ako funkcija uspije s izvršavanjem, vraća vrijednost TRUE. Ako ne uspije, vrati vrijednost FALSE. Da bi se doznalo više o samoj grešci koja je izazvala neuspjelo izvršavanje funkcije, koristi se GetLastError function. Popis grešaka je dan u tablici 3.10.

 


Tablica 3.10  Greške koje vraća funkcija CPEncrypt.

Greška

Opis

ERROR_INVALID_HANDLE

Jedan od parametara sadrži nevažeću oznaku.

ERROR_INVALID_PARAMETER

Jedan od parametara sadrži nedozvoljenu vrijednost.

NTE_BAD_ALGID

Podaci u spremniku nisu kriptirani s očekivanim algoritmom za razmjenu ključeva.

NTE_BAD_DATA

Ili algoritam za razmjenu ključeva koji radi s javnim ključem ne postoji u ovom modulu, ili se pokušavaju dekriptirati podaci o sjedničkom ključu s tuđim parom ključeva.

NTE_BAD_FLAGS

Parametar dwFlags nije nula.

NTE_BAD_HASH

Nedozvoljena oznaka za hash objekt hHash.

NTE_BAD_HASH_STATE

Pokušano je kreiranje hash-vrijednosti hash objektu koji je već finaliziran.

NTE_BAD_KEY

Parametar hKey ne sadrži valjanu oznaku ključa.

NTE_BAD_LEN

Veličina izlaznog spremnika je premala za kriptirani tekst.

NTE_BAD_UID

Ne može se naći kontekst u modulu pod kojim je nastao korišteni ključ.

NTE_DOUBLE_ENCRYPT

Program je pokušao kriptirati iste podatke dva puta.

NTE_FAIL

Neočekivana greška.

NTE_NO_MEMORY

Nedostatak memorije.

 

Napomene. Ako se kod kriptiranja odmah stvara i hash-vrijednost poruke, oznaka na hash-objekt se proslijeđuje preko hHash parametra. Ova mogućnost je korisna kod kreiranja potpisanog i kriptiranog teksta. Prije pozivajna funkcije CPEncrypt, program treba kreirati hash-objekt preko funkcije CPCreateHash. Poslije kriptiranja, hash-vrijednost se može dobiti preko funkcije CPGetHashParam ili se hash-objekt može potpisati preko funkcije CPSignHash.

Kod kriptiranja veće količine podataka, posao kriptiranja se dijeli u višestruke pozive funkciji CPEncrypt. Kod zadnjeg poziva, nužno je postaviti zastavicu Final u TRUE kako bi modul mogao dovršiti kriptiranje. Dodatne operacije koje se obavljaju nakon zadnjeg poziva:

·        Ako je u pitanju kriptiranje bloka podataka, zadnji blok podataka će se nadopuniti na višekratnik veličine bloka.

·        Ako se kriptiranje obavlja u ulančanom modu, idući poziv funkciji za kriptiranje će poništiti vezni registar na KP_IV vrijednost ključa.

·        Ako je u pitanju kriptiranje niza podataka, idući poziv će vratiti algoritam u osnovno stanje.

 

 

 

 

3.4.2.     Funkcija CPDecrypt

Algoritam koji se koristi za dekriptiranje je već određen s generiranim ključem koji se koristi.

BOOL WINAPI CPDecrypt(

  HCRYPTKEY hKey,    // in

  HCRYPTHASH hHash,  // in

  BOOL Final,        // in

  DWORD dwFlags,     // in

  BYTE *pbData,      // in/out

  DWORD *pcbData     // in/out

);

 

Parametri:

hKey

Oznaka ključa koji se koristi za dekriptiranje (dobivenog s CPGenKey ili CPImportKey funkcijom). Algoritam koji se koristi za dekriptiranje je određen s generiranim ključem.

hHash

Oznaka za hash objekt. Ovaj parametar se koristi samo ako se stvara hash-vrijednost u isto vrijeme kada se i kriptiraju podaci, inače je nula.

Final

Logička vrijednost koja označava da li je ovo zadnji blok podataka koji se kriptira ili ne.

dwFlags

Zastavice. Ovaj parametar se zasad ne koristi i treba biti nula.

pbData

Spremnik za podatke koji se trebaju dekriptirati. Nakon dekriptiranja, podaci se spremaju natrag u isti spremnik. Broj okteta koji se trebaju dekriptirati je određen u pcbData.

Ovaj parametar može biti NULL ako se treba odrediti veličina spremnika za kriptirani tekst.

pcbData

Pokazivač na dužinu podataka. Ovdje se treba postaviti dužina poruke za dekriptiranje u oktetima. Nakon izvršavanja funkcije, na ovoj adresi će biti zapisan broj okteta dekriptirane poruke.

Povratne vrijednosti su iste kao i kod prethodne funkcije.

Napomene. Ako se kod dekriptiranja odmah stvara i hash-vrijednost poruke, oznaka na hash-objekt se proslijeđuje preko hHash parametra. Ova mogućnost je korisna kod provjere potpisanog teksta. Prije pozivajna funkcije CPEncrypt, program treba kreirati hash-objekt preko funkcije CPCreateHash. Poslije dekriptiranja, hash-vrijednost se može dobiti preko funkcije CPGetHashParam, hash-objekt se može potpisati preko funkcije CPSignHash ili se potpis može provjeriti s CPVerifySignature. Kod dekriptiranja veće količine podataka, vrijede iste napomene kao i kod funkcije za kriptiranje.

3.5.    Hash-vrijednosti i digitalno potpisivanje

Funkcije za računanje hash vrijednosti i digitalno potpisivanje koriste se za utvrđivanje vjerodostojnosti poruke. Pregled funkcija je dan u tablici 3.11.

 

Tablica 3.11  Funkcije za rad s hash-vrijednostima i digitalnim potpisivanjem.

Funkcija

Opis

CPCreateHash

Kreira se prazni hash objekt

CPDestroyHash

Briše se prazni hash objekt

CPGetHashParam

Čitaju se parametri hash objekta

CPHashData

Nađi hash vrijednost podataka i spremi je u hash objekt

CPHashSessionKey

Nađi hash vrijednost ključa i spremi je hash objekt

CPSetHashParam

Postavljaju se parametri hash objekta

CPSignHash

Potpisivanje hash objekta

CPVerifySignature

Provjera digitalnog potpisa hash objekta

 

 

3.5.1.     Funkcija CPHashData

Funkcija dodaje podatke određenom hash objektu, tj. izračunava novu hash-vrijednost na osnovi kombinacije ulaznog niza podataka i prethodne hash-vrijednosti.

Algoritam koji se koristi za dobivanje hash vrijednosti je već određen s generiranim ključem.

BOOL WINAPI CPHashData (

  HCRYPTHASH hHash,       // in

  CONST BYTE *pbData,     // in

  DWORD dwDataLen,        // in

  DWORD dwFlags           // in

);

Parametri:

hHash

Oznaka hash objekta koji se koristi (dobivenog s CPCreateHash  funkcijom).

pbData

Spremnik za podatke iz kojih se treba izračunati hash-vrijednost. Nakon izračunavanja, podaci se spremaju u hash objekt. Broj okteta koji se trebaju kriptirati je određen u dwDataLen. Da bi se pristupilo hash-vrijednosti unutar hash objekta, koristi se CPGetHashParam funkcija.

dwDataLen

Dužina podataka. Ovdje se treba postaviti dužina poruke za hashiranje u oktetima.

dwFlags

Zastavice. Ovaj parametar se zasad ne koristi i treba biti nula.

 

Povratne vrijednosti. Ako funkcija uspije s izvršavanjem, vraća vrijednost TRUE. Ako ne uspije, vrati vrijednost FALSE. Da bi se doznalo više o samoj grešci koja je izazvala neuspjelo izvršavanje funkcije, koristi se GetLastError function. Rezultati se nalaze u tablici 3.12.

 

Tablica 3.12  Greške koje vraća funkcija CPHashData.

Greška

Opis

ERROR_INVALID_HANDLE

Jedan od parametara sadrži nevažeću oznaku.

ERROR_INVALID_PARAMETER

Jedan od parametara sadrži nedozvoljenu vrijednost.

NTE_BAD_ALGID

Podaci u spremniku nisu kriptirani s očekivanim algoritmom za razmjenu ključeva.

NTE_BAD_FLAGS

Parametar dwFlags nije nula.

NTE_BAD_HASH

Nedozvoljena oznaka za hash objekt hHash.

NTE_BAD_HASH_STATE

Pokušano je kreiranje hash-vrijednosti hash objektu koji je već finaliziran.

NTE_BAD_LEN

Veličina izlaznog spremnika je premala za kriptirani tekst.

NTE_BAD_UID

Ne može se naći kontekst u modulu pod kojim je nastao korišteni ključ.

NTE_FAIL

Neočekivana greška.

NTE_NO_MEMORY

Nedostatak memorije.

 

Napomene. Poslije izvršavanja funkcije nad hash objektom, hash-vrijednost se može dobiti preko funkcije CPGetHashParam. Hash objekt može potpisati preko funkcije CPSignHash.

 

3.5.2.     Funkcija CPSignHash

Nakon kreiranja hash vrijednosti od ulaznog niza podataka, pomoću ove funkcije je moguće zaštititi vjerodostojnost same hash vrijednosti, a time i cijelog niza podataka. Potpisivanje se svodi na kriptiranje hash vrijednosti s privatnim ključem pojedinog korisnika, dok se provjera potpisa svodi na dekriptiranje hash vrijednosti s javnim ključem tog istog korisnika.

Funkcija dodaje podatke određenom hash objektu, tj. izračunava novu hash-vrijednost na osnovi kombinacije ulaznog niza podataka i prethodne hash vrijednosti. Algoritam koji se koristi za dobivanje hash vrijednosti je već određen kod kreiranja hash objekta.

 

 

BOOL WINAPI CryptSignHash(

  HCRYPTHASH hHash,     // in

  DWORD dwKeySpec,      // in

  LPCTSTR sDescription, // in

  DWORD dwFlags,        // in

  BYTE *pbSignature,    // out

  DWORD *pdwSigLen      // in/out

);

 

Parametri

hHash

Oznaka hash objekta koji se koristi (dobivenog s CPCreateHash  funkcijom).

dwKeySpec

Oznaka ključa koji se koristi za potpisivanje. To može biti jedna od dvije vrijednosti:

AT_KEYEXCHANGE

Privatni ključ koji se koristi za izmjenu ključeva

AT_SIGNATURE

Privatni ključ za potpisivanje.

sDescription

Ovaj parametar je rezerviran za buduće inačice i ne koristi se. Mora biti postavljen na NULL.

dwFlags

Zastavice. Ovaj parametar se zasad ne koristi i treba biti nula.

pbSignature

Pokazivač na kojem se treba zapisati digitalni potpis.

pdwSigLen

Pokazivač na dužinu memorijskog prostora gdje se zapisuje digitalni potpis. Nakon završetka funkcije, tamo se nalazi dužina digitalnog potpisa.

 

Povratne vrijednosti. Ako funkcija uspije s izvršavanjem, vraća vrijednost TRUE. Ako ne uspije, vrati vrijednost FALSE. Da bi se doznalo više o samoj grešci koja je izazvala neuspjelo izvršavanje funkcije, koristi se GetLastError function. Popis grešaka je dan u tablici 3.13.

 

Tablica 3.13  Greške koje vraća funkcija CPSignHash..

Greška

Opis

ERROR_INVALID_HANDLE

Jedan od parametara sadrži nevažeću oznaku.

ERROR_INVALID_PARAMETER

Jedan od parametara sadrži nedozvoljenu vrijednost.

ERROR_MORE_DATA

Izlazni spremnik nije dovoljno velik za podatke. Veličina potrebnog spremnika je u varijabli na koju pokazuje parametar pdwSigLen

NTE_BAD_FLAGS

Parametar dwFlags nije nula.

NTE_BAD_HASH

Nedozvoljena oznaka za hash objekt hHash.

NTE_BAD_UID

Ne može se naći kontekst u modulu pod kojim je nastao korišteni ključ.

NTE_NO_KEY

Odabrani privatni ključ za potpisivanje ne postoji.

NTE_FAIL

Neočekivana greška.

NTE_NO_MEMORY

Nedostatak memorije.

 

 

3.6.    Usporedba s CryptoAPI sučeljem

Microsoft u svojim komercijalnim operacijskim sustavima Windows[10] distribuira sučelje CryptoAPI, svoj prijedlog arhitekture odvajanja aplikacija od kriptografskih mehanizama. Sučelje CryptoAPI se nalazi između korisnika i same kriptografije, a zapravo predstavlja skup funkcija koje omogućavaju programerima za Windows operacijski sustav korištenje složenih kriptografskih algoritama bez same potrebe znanja detalja o izvedbi algoritama. Budući da su sami kriptografski algoritmi odvojeni od aplikacije, moguće je vrlo jednostavno unapređivanje kriptografskih podsustava bez velike promjene originalnog programa jednostavnom zamjenom modula.

Budući da je CryptoLib sučelje ugrađeno u kriptografski modul, a ne u operacijski sustav, ne postoji način da se sučelje odvoji od modula i da se kompromitira sigurnost cijelog operacijskog sustava. Zbog razlike u osnovnom konceptu, teško je usporediti samo ta dva sučelja bez implementacije koja se nalazi ispod njih. Moguće je tek usporediti kombinaciju sučelja i implementacije gdje bi s jedne strane bio CryptoLib modul koji u sebi sadrži i sučelje i implementaciju, dok bi s druge strane bio CryptoAPI kojemu je sučelje dio operacijskog sustava, a osnovni Microsoftov kriptografski modul MS Base Provider kao jedna od implementacija. Usporedba algoritama je dana u tablici 3.14.

 

Tablica 3.14  Usporedba algoritama u MS Base Provider i CryptoLib modulu.

Tip algoritma

MS Base Provider

CryptoLib

Simetrični (niz)

RC4 (40 bita)

-

Simetrični (blok)

RC2 (40 bita)

IDEA (128 bita)

Asimetrični

RSA (512 bita)

RSA (512 - 4096 bita)

Hash funkcija

SHA, MD2, MD5, MAC

SHA

 

Sučelje kriptografskog modula CryptoLib je izvedeno na osnovi CryptoAPI sučelja, tj. nekih njegovih dijelova. Izvedene su najosnovnije funkcije za rad s kontekstima, ključevima, enkripcijom i dekripcijom podataka te digitalnim potpisima. Te su funkcije potrebne za ostvarivanje osnovnih sigurnosnih zahtjeva koji se postavljaju pred većinu današnjih aplikacija.

Nazivi funkcija su vrlo slični, ulazni i izlazni parametri su identični, sve s namjerom olakšavanja korištenja CryptoLib modula u ciljanoj razvojnoj okolini, operacijskom sustavu MS Windows. Usporedba naziva je dana u tablici 3.15.

 


Tablica 3.15  Usporedba naziva funkcija u CryptoAPI i CryptoLib sučelju.

CryptoAPI funkcija

CryptoLib funkcija

CryptGenKey

CPGenKey

CryptEncyrpt

CPEncyrpt

CryptHashData

CPHashData

CryptSignHash

CPSignHash

CryptVerifySignature

CPVerifySignature

 

Operacijski sustav ima veliki broj različitih korisnika iz različitih država, pa je zahtjevan veliki broj različitih sigurnosnih standarda. Zbog toga CryptoAPI sučelje sadrži i mnoge druge funkcije koje su potrebne da bi se zadržala udruživost s različitim sigurnosnim standardima, od kojih su neki već zastarjeli. Neke od tih dodatnih funkcija donose i različite sigurnosne probleme u samo sučelje, koji su ponekad u stanju kompromitirati sigurnost cijelog operacijskog sustava.

Kako je CryptoLib sučelje zamišljeno kao implementacija samo osnovnih kriptografskih funkcija, taj problem je zaobiđen.

CryptoAPI sučelje je ugrađeno u operacijski sustav i provjerava svoje različite kriptografske module digitalnim potpisom. Digitalnom zaštitom kriptografskih modula želi se izbjeći zlonamjerno zamjenjivanje jakih zaštitnih modula s modulima koji imaju slabu ili nikakvu zaštitu, čime se može narušiti sigurnost cijelog operacijskog sustava. Da bi se to izbjeglo, Microsoft potpisuje svaki modul svojim privatnim ključem. Drugi razlog zbog kojeg se to zahtjeva su strogi američki zakoni o izvozu visoke tehnologije (posebno kriptografije). Svaki modul se uz specifikacije mora poslati na potpisivanje Microsoftu. Microsoft je dužan sve module poslati na provjeru agenciji američke vlade i ako zadovoljavaju stroge propise o izvozu, tek tada digitalno potpisuje modul sa svojim privatnim ključem i šalje potpis autoru. Ovaj zakonski problem dosta ograničava razvojne mogućnosti kriptografskih algoritama i predstavlja kočnicu za veću popularizaciju CryptoAPI sučelja.

CryptoLib sučelje je ugrađeno u modul zajedno s implementacijom, pa nema mogućnosti zlonamjerne zamjene algoritama koji se koriste za zaštitu.

Veliki mogući problem Microsoftovom CryptoAPI sučelju, verziji 2.0, u kombinaciji s modulom MS Base Provider, je način na koji se spremaju privatni podaci od pojedinih korisnika. Podaci iz konteksta pojedinog korisnika, uključujući i privatne podatke o ključevima se spremaju u jednostavno kriptiranom obliku sa zaštitom od 40 bita.  Osim što 40 bita više nije nikakvo jamstvo za sigurnost podataka,  oblik datoteke je vrlo pogodan za kriptoanalizu što još više otežava taj problem. Drugi problem je mogućnost izvoženja privatnih ključeva, čak i bez korisnikova znanja. Funkcija koja se pri tome koristi zove se CryptExportKey, a problem je prvi puta primjećen s Internet Explorerom 4.

Unutar CryptoLib sučelja svi ključevi su aktivni samo za vrijeme korištenja CryptoLib modula. Zbog toga je ova izvedba CryptoLib modula pogodna za korištenje kriptografskih algoritama unutar jedne sjednice, kao što je na primjer, komunikacija između dva korisnika. Kako se ključevi ne spremaju nigdje osim u radnu memoriju, vjerojatnost uspješnog kriptonapada na ključ je bitno manja. Funkcija CPExportKey u CryptoLib sučelju ne može izvesti privatni ključ.

4.       Implementacija modula

 

Implementacija kriptografskog modula se dijeli na dvije razine: razrede sučelja i kriptografske mehanizme.

Korisničko sučelje je vanjsko sučelje koje vidi korisnik, tj. skup funkcija koje koristi za rad za modulom. Unutarnje sučelje je skup funkcija kojim se unutar samog modula obavlja rad sa kriptografskim mehanizmima. Razredi sučelja se nalaze između korisničkog sučelja i unutarnjeg sučelja i brinu za svu interakciju sa korisnikom i sa kriptografskim mehanizmima. Rezerviraju radni kontekst za svakog korisnika, u kojemu se nalaze svi objekti koje taj korisnik koristi u trenutnoj sjednici. Kada korisnik poželi koristiti neki od kriptografskih mehanizama, razred sučelja prenosi zahtjev kroz unutarnje sučelje i radni kontekst tog korisnika do kriptografskog mehanizma. Kada kriptografski mehanizam završi, podaci se prenose natrag u radni kontekst aktivnog korisnika, a ovisno o tipu podataka, korisnik može zatražiti te podatke preko korisničkog sučelja.

Kriptografski mehanizmi u sebi sadrže prilagođene računalne implementacije algoritama za simetričnu i asimetričnu kriptografiju, hash funkciju i generator slučajnih brojeva. Izvršavaju zahtjeve razreda sučelja koje im stignu preko unutarnjeg sučelja.

Kriptografski modul je napisan u programskom jeziku C++ kao dinamička biblioteka funkcija (engl. Dynamic Load Library) za operacijski sustav Windows 95, NT i noviji. Prilagođen je višezadaćnom izvršavanju zahtjeva (engl. multithreading) i višekorisničkoj okolini (engl. multiuser enviroment).  Skica kriptografskog modula se najbolje može vidjeti na slici 4.1

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Slika 4.1  Skica kriptografskog modula CryptoLib.

4.1.    Osnovni razredi

Svaki razred u kriptografskom modulu ima svoj konstruktor, destruktor i varijablu semafora. Konstruktor inicijalizira sve potrebne interne strukture podataka, među kojima je i varijabla semafora. Semafor služi za sinkronizaciju opsluživanja više zahtjeva u istom trenutku. Destruktor se brine da su sve korištene strukture podataka obrisane iz memorije i oslobođene za daljnje korištenje.

Jedna od glavnih pretpostavki upotrebljivosti ovog modula je tajnost privatnih ključeva i izvora slučajnih brojeva. Kako bi se osigurala tajnost privatnih podataka iz pojedinog razreda, koriste se posebne funkcije za rad s memorijom. Te funkcije prilikom zauzimanja memorijskog prostora brišu taj prostor, te ga zaključavaju u radnoj memoriji tako da se ne može desiti da se slučajno taj dio nađe na tvrdom disku u obliku virtualne memorije. Prilikom oslobađanja memorijskog prostora, ponovo ga brišu i otključavaju.

Parametri koji se prosljeđuju metodama razreda identični su po nazivu i tipu parametrima iz odgovarajućih funkcija vanjskog sučelja.

 

4.1.1.     Razred za rad sa kontekstima: CContextManager

Kada korisnik s funkcijom CPAcquireContext zatraži novi radni kontekst od kriptografskog modula, razred CContextManager  stvara novi kontekst u svom zaštićenom memorijskom prostoru. U kontekst se sprema i korisničko ime kako bi se zaštitio pristup tom radnom kontekstu od strane nekog drugog korisnika. Kontekst sadrži i jedan semafor koji se koristi za zaštitu konteksta od promjene ili brisanja za vrijeme dok se taj isti kontekst koristi u kriptografskom algoritmu. Oznaka konteksta se koristi kao parametar za većinu drugih funkcija.

 

 

struct CONTEXT_DATA{

       HCRYPTPROV                 phProv;

       CHAR                       szContainer[MAX_CONTAINER_NAME];

       CHAR                       szUsername[MAX_USERNAME_LEN];

       DWORD                      dwProvType;

       CRITICAL_SECTION           crtInUse;

       struct CONTEXT_DATA* ptrNext;};

class CContextManager{

public:

       CContextManager();

       ~CContextManager();

 

       BOOL AcquireContext(HCRYPTPROV *phProv, CHAR *pszContainer);

       BOOL InsertContext (HCRYPTPROV *phProv, CHAR *pszContainer,

                                               DWORD dwProvType);

       BOOL DeleteContext (HCRYPTPROV    hProv, CHAR *pszContainer);

       BOOL GetContextName(HCRYPTPROV  hProv, CHAR *pszContainer);

       BOOL LockContext   (HCRYPTPROV  hProv);

       BOOL UnlockContext (HCRYPTPROV  hProv);

private:     

       CRITICAL_SECTION     m_CriticalContext;

       struct CONTEXT_DATA* m_Contexts;

};

 

 

Slika 4.2 Deklaracija razreda CContextManager.

4.1.2.     Razred za rad sa ključevima: CKeyDataManager

Razred CKeyDataManager ima pristup svim kriptografskim mehanizmima. Kada se generira novi ključ, pristupa generatoru slučajnih brojeva. Kada se izvodi ključ iz zadane lozinke, pristupa hash-funkciji. Za kriptiranje i dekriptiranje podataka poziva simetričnu ili asimetričnu funkciju za kriptiranje odnosno dekriptiranje podataka. Zaštićen je od istovremenog brisanja i korištenja istog ključa.

Nadopunjavanje. Kada se poruka podijeli na blokove prilagođene ulazu u kriptografski algoritam, u većini slučajeva zadnji blok neće biti ispunjen do kraja. U tom se slučaju taj blok dopunjuje s dodatnim bitovima da bi blok bio kompletan. Ovo nadopunjavanje se može sastojiti od samih nula, izmjenjujućih nula i jedinica, ili od nekog drugog uzorka. Neki standardi kriptiranja određuju točno određenu skicu ispunjavanja nepotpunih blokova. Samo nadopunjavanje blokova se radi interno, unutar izvođenja funkcija modula. U CryptoLib modulu je odabrano dopunjavanje bloka s nulama.

 

 

struct KEY_HEADER{

       ALG_ID        algKeyAlgorithm;

       DWORD         dwBlockLen;

       DWORD         dwSaltLen;

       DWORD         dwPermissions;

       DWORD         dwFlags;

       DWORD         dwMode;

       DWORD         dwPadding;

};

 

struct KEY_DATA{

       struct KEY_HEADER    Header;

       HCRYPTKEY            keyHandle;

       HCRYPTPROV           phProv;

       IDEA_KEY*            pIdeaKeys;

       RSA_KEY*             pRsaKeys;

       CRITICAL_SECTION     crtInUse;

       struct KEY_DATA*     ptrNext;

};

 

class CKeyDataManager

{

public:

       CKeyDataManager();

       ~CKeyDataManager();

       BOOL GenerateKey( HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags,

                         HCRYPTKEY *phKey, HCRYPTHASH hHashData);

       BOOL GetKeyParam( HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam,

                         BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags);

       BOOL SetKeyParam( HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam,

                         BYTE *pbData, DWORD dwFlags);

       BOOL ImportKey  ( HCRYPTPROV hProv, BYTE *pbData, DWORD dwDataLen,

                         HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey);

       BOOL ExportKey  ( HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTKEY hExpKey,

                         DWORD dwBlobType, DWORD dwFlags, BYTE *pbData,

                         DWORD *pdwDataLen);

       BOOL DestroyKey ( HCRYPTPROV hProv, HCRYPTKEY hKey);  

 

 

Slika 4.3  Deklaracija razreda CKeyDataManager (nastavak na sljedećoj strani).


 


 

       BOOL Encrypt( HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTHASH hHash,

                     BOOL Final, DWORD dwFlags, BYTE *pbData,

                     DWORD *pdwDataLen, DWORD dwBufLen);

       BOOL Decrypt( HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTHASH hHash,

                     BOOL Final, DWORD dwFlags, BYTE *pbData,

                     DWORD *pdwDataLen, DWORD dwBufLen);

 

       BOOL GetUserKey ( HCRYPTPROV hProv, DWORD dwKeySpec,

                         HCRYPTKEY *phUserKey);

 

       BOOL GetProvider (HCRYPTKEY phKey, HCRYPTPROV* hProv);

       BOOL AcquireKey ( HCRYPTPROV hProv, HCRYPTKEY hKey,

                         KEY_DATA** ptrTempKey);

       BOOL ExportKeyInternal( KEY_DATA* ptrKey, BYTE *pbData,

                               DWORD *pdwDataLen);

       BOOL CheckKey (HCRYPTPROV hProv, ALG_ID algId, HCRYPTKEY *phKey);

       BOOL DuplicateKey  (HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD *pdwReserved,

                          DWORD dwFlags, HCRYPTKEY *phKey);

 

private:

 

       struct KEY_DATA*     m_Keys;

       CRITICAL_SECTION     m_CriticalKey;

};

 

Slika 4.4  Deklaracija razreda CKeyDataManager (nastavak).

 

4.1.3.     Razred za rad sa generatorom slučajnih brojeva: CRandomNumberGenerator

Razred CRandomNumberGenerator u sebi sadrži generator kriptografsko jakih pseudo-slučajnih brojeva koji za izvor entropije koristi funkcije RndWin32 algoritma. Postoji  i mogućnost ubacivanja vlastitog izvora entropije u generator preko CPGenRandom funkcije.

 

 

class CRandomNumberGenerator{

public:

       CRandomNumberGenerator();

       ~CRandomNumberGenerator();

      

       void InitRandomPool        (BYTE *buffer, DWORD dwLength);

       BOOL GetVerifiedRandomData (BYTE *buffer, DWORD dwLength);  

       void AddToRandomPool (BYTE *buffer, DWORD dwLength);

private:     

       CRITICAL_SECTION     m_CriticalRandom;

       RANDOM_INFO*         m_ptrRNGData;

       BOOL GetRandomData   (RANDOM_INFO *randomInfo, BYTE *buffer,

                            DWORD dwLength);

       BOOL CheckEntropy    (const BYTE *data, const int dataLength);

       void MixRandomPool   (RANDOM_INFO *randomInfo);

};

 

Slika 4.5  Deklaracija razreda CRandomNumberGenerator.

4.1.4.     Razred za rad sa hash-vrijednostima: CHashDataManager

Razred CHashDataManager se koristi za rad s hash-funkcijom.  Preko funkcija za potpisivanje i provjeru potpisa ima pristup i asimetričnom kriptografskom algoritmimu RSA.

 

struct HASH_DATA{

       BYTE          Hash[MAX_HASH_SIZE];

       DWORD         dwHashSize;

       ALG_ID        algKeyAlgorithm;

       HCRYPTPROV    phProv;

       HCRYPTHASH    phHash;

       CRITICAL_SECTION     crtInUse;

       struct HASH_DATA*    ptrNext;

};

class CHashDataManager{

public:

       CHashDataManager();

       ~CHashDataManager();

 

       BOOL InsertHash      (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH *phHash);

       BOOL CheckHash     (HCRYPTPROV hProv, HCRYPTHASH phHash);

       BOOL GetProvider   (HCRYPTHASH phHashH, HCRYPTPROV* hProv);

       BOOL DeleteHash      (HCRYPTPROV hProv, HCRYPTHASH phHash);

       BOOL DoHash          (HCRYPTPROV hProv, HCRYPTHASH hHash, BYTE *pbData,

                           DWORD dwDataLen);

       BOOL GetHashParams (HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwParam,

                           BYTE *pbData, DWORD *pdwDataLen);

       BOOL SetHashParams (HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwParam,

                           BYTE *pbData, DWORD dwDataLen);

       BOOL HashSessionKey(HCRYPTPROV hProv, HCRYPTHASH hHash, HCRYPTKEY hKey,

                           DWORD dwFlags);

       BOOL SignHash    (HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwKeySpec,

                        LPCWSTR sDescription, DWORD dwFlags, BYTE* pbSignature,

                        DWORD *pdwSigLen);

       BOOL VerifySignature (HCRYPTPROV hProv, HCRYPTHASH hHash,

                             CONST BYTE *pbSignature, DWORD dwSigLen,

                             HCRYPTKEY hPubKey, LPCWSTR sDescription,

                             DWORD dwFlags);

       BOOL DuplicateHash   (HCRYPTPROV hProv, HCRYPTHASH hHash,

                             DWORD *pdwReserved, DWORD dwFlags,

                             HCRYPTHASH *phHash);

private:

       CRITICAL_SECTION     m_CriticalHash;

       struct HASH_DATA*    m_Hashes;

};

 

Slika 4.6  Deklaracija razreda CHashDataManager.

 

Razredi sučelja zapravo su omotači oko samih algoritama koji pružaju sve usluge koje sučelje od njih traži: višekorisničko i višezadaćno okruženje, sigurnost tajnih podataka, pouzdanost i izdržljivost na krivu upotrebu.

4.2.    Simetrični algoritam IDEA

IDEA je kriptografski algoritam koji kriptira ulazne blokove podataka od 64 bita. Ključ je dugačak 128 bita. Isti algoritam se koristi za enkripciju i dekripciju. Kao i ostali popularni simetrični algoritmi, IDEA koristi zamjenu i raspršenje. Zamisao pri stvaranju algoritma je bila da se pomiješaju operacije različitih algebarskih grupa. Tri različite vrste operacija koje se miješaju je lako moguće implementirati sklopovski i programski:

·        isključivo ILI

·        zbrajanje s modulom 216

·        množenje s modulom 216 + 1

Sve operacije se obavljaju na podblokovima veličine 16 bita, tako da se mogu učinkovito implementirati čak i na 16-bitnim procesorima. Programska implementacija donosi dvostruko ubrzanje u odnosu na poznati DES algoritam.

Prvu inačicu kriptografskog algoritma IDEA objavljuju Xuejia Lai i James Massey 1990. godine. Tada je naziv algoritma bio PES, što je značilo Predloženi kriptografski standard (engl. Proposed Encyrption Standard). Iduće godine, nakon što je su Biham i Shamir pomoću diferencijalne kriptoanalize na algoritmu pronašli propust, autori algoritma pojačavaju sigurnost algoritma i novu verziju nazivaju Unaprijeđeni predloženi kriptografski standard IPES (engl. Improved proposed encryption standard). 1992. godine novi algoritam mijenja ime u IDEA - Međunarodni algoritam za kriptiranje podataka (engl. International Data Encryption Algorythm).

Matematička analiza algoritma IDEA je pokazala priličnu sigurnost na različite napade kriptoanalizom. Iako je pokazan neki uspjeh u napadima na oslabljenu verziju algoritma (sa smanjenim brojem ponavljanja operacija), ipak je osnovni algoritam ostao siguran. Odabran je za implementaciju jer je jedan od najsigurnijih danas dostupnih simetričnih algoritama u svijetu.

 

4.2.1.     Opis algoritma

Da bi IDEA mogla raditi na početku je potrebno iz osnovnog 128-bitnog ključa izvesti podključeve za kriptiranje i dekriptiranje. Svaki od podključeva se sastoji od 52 komponente dužine 16 bita. Postupak dobivanja enkripcijskih podključeva od 128-bitnog ključa je sljedeći:

1.      Ulazni 128-bitni ključ se podijeli na osam 16-bitnih dijelova. Ovih osam dijelova su prvi enkripcijski podključevi (svih šest podključeva u prvom ponavljanju algoritma Z1(1) - Z6(1) i prva dva podključa u drugom ponavljanju algoritma Z1(2) - Z2(2)

2.      Ključ se rotira lijevo 25 bita i ponovo se dijeli u osam dijelova. Ovih osam dijelova popunjavaju iduće enkripcijske podključeve (preostala četiri podključa u drugom ponavljanju algoritma Z3(2) - Z6(2) i prva dva podključa u trećem ponavljanju algoritma Z1(3) - Z2(3))

3.      Postupak se ponavlja od točke 2 sve dok se ne ispune svi enrkripcijski podključevi (njih 52)

Postupak dobivanja dekripcijskih podključeva od enkripcijskih podključeva dan je u tablici 117. Sastoji se od aditivnog ili multiplikativnog inverza pojedinih enkripcijskih podključeva. Aditivni inverz se računa kao:

 

(4.1)

 

Multiplikativni inverz se računa kao:

(4.2)

s time da je definirano {0,0,0,0,0…0}-1 = {0,0,0,0,0…0}

 

 

Tablica 4.7  Podključevi za kriptiranje i dekriptiranje IDEA algoritma.

Ponavljanje

Podključevi za kriptiranje

Podključevi za dekriptiranje

1.

Z1(1)

Z2(1)

Z3(1)

Z4(1)

Z5(1)

Z6(1)

Z1(9)-1

-Z2(9)

-Z3(9)

Z4(9)-1

Z5(8)

Z6(8)

2.

Z1(2)

Z2(2)

Z3(2)

Z4(2)

Z5(2)

Z6(2)

Z1(8)-1

-Z3(8)

-Z2(8)

Z4(8)-1

Z5(7)

Z6(7)

3.

Z1(3)

Z2(3)

Z3(3)

Z4(3)

Z5(3)

Z6(3)

Z1(7)-1

-Z3(7)

-Z2(7)

Z4(7)-1

Z5(6)

Z6(6)

4.

Z1(4)

Z2(4)

Z3(4)

Z4(4)

Z5(4)

Z6(4)

Z1(6)-1

-Z3(6)

-Z2(6)

Z4(6)-1

Z5(5)

Z6(5)

5.

Z1(5)

Z2(5)

Z3(5)

Z4(5)

Z5(5)

Z6(5)

Z1(5)-1

-Z3(5)

-Z2(5)

Z4(5)-1

Z5(4)

Z6(4)

6.

Z1(6)

Z2(6)

Z3(6)

Z4(6)

Z5(6)

Z6(6)

Z1(4)-1

-Z3(4)

-Z2(4)

Z4(4)-1

Z5(3)

Z6(3)

7.

Z1(7)

Z2(7)

Z3(7)

Z4(7)

Z5(7)

Z6(7)

Z1(3)-1

-Z3(3)

-Z2(3)

Z4(3)-1

Z5(2)

Z6(2)

8.

Z1(8)

Z2(8)

Z3(8)

Z4(8)

Z5(8)

Z6(8)

Z1(2)-1

-Z3(2)

-Z2(2)

Z4(2)-1

Z5(1)

Z6(1)

Transformacija

Z1(9)

Z2(9)

Z3(9)

Z4(9)

 

 

Z1(1)-1

-Z2(1)

-Z3(1)

Z4(1)-1

 

 

 

Nakon kreiranja podključeva, algoritam za kriptiranje je spreman za rad. Prvi blok podataka od 64 bita se dijeli u četiri 16-bitna bloka: X1, X2, X3 i X4. Ova četiri bloka postaju ulaz u prvo ponavljanje algoritma. Ukupno postoji osam ponavljanja. U svakom od ponavljanja se nad svakim od četiri bloka izvršava matematička operacija isključivo ILI, zbrajanja i množenja sa drugim blokovima i s podključevima. Između ponavljanja, drugi i treći blok podataka se zamjenjuju. U zadnjoj izlaznoj transformaciji se  četiri izlazna bloka od 16 bita kombiniraju sa zadnja četiri podključa da bi se dobio konačni izlaz iz algoritma, tj. kriptirani blok podataka od 64 bita.

 

Algoritam:

1.      Pomnožiti X1 s prvim podključem za enkripciju Z1

2.      Zbrojiti X2 s drugim podključem Z2

3.      Zbrojiti X3 s trećim podključem Z3

4.      Pomnožiti X4 s četvrtim podključem Z4

5.      Izvršiti operaciju isključivi ILI nad rezultatima iz koraka 1 i 3

6.      Izvršiti operaciju isključivi ILI nad rezultatima iz koraka 2 i 4

7.      Pomnožiti rezultate iz koraka 5 s petim podključem Z5

8.      Zbrojiti rezultate iz koraka 6 i 7

9.      Pomnožiti rezultate iz koraka 8 s šestim podključem Z6

10.  Zbrojiti rezultate iz koraka 7 i 9

11.  Izvršiti operaciju isključivi ILI nad rezultatima iz koraka 1 i 9

12.  Izvršiti operaciju isključivi ILI nad rezultatima iz koraka 3 i 9

13.  Izvršiti operaciju isključivi ILI nad rezultatima iz koraka 2 i 10

14.  Izvršiti operaciju isključivi ILI nad rezultatima iz koraka 4 i 10

Rezultat iz jednog ponavljanja su četiri 16-bitna bloka koji su rezultati u koracima 11, 12, 13 i 14. Zamjenom dva unutarnja bloka, 12 i 13, osim u zadnjem ponavljanju, dobiva se ulaz za iduće ponavljanje.

Nakon osmog ponavljanja, zadnja izlazna transformacija slijedi:

1.      Pomnožiti X1 s prvim podključem za izlaznu transformaciju Z1(9)

2.      Zbrojiti X2 s drugim podključem Z2(9)

3.      Zbrojiti X3 s trećim podključem Z3(9)

4.      Pomnožiti X4 s četvrtim podključem Z4(9)

Konačno, četiri dobivena bloka se spoje i dobije se 64-bitni izlazni blok kriptiranih podataka (engl. ciphertext).

Algoritam je prikazan na slici 4.8.

4.2.2.     Kriptoanaliza algoritma IDEA

Dužina ključa je 128-bita, što je više nego dvostruko više nego kod DES-a (engl. Data Encryption Standard). Pod uslovom da je najučinkovitiji napad grubom silom, potrebno je 2128 (1038) kriptiranja da bi se otkrio ključ. Ako oblikujemo sklopovlje koje može testirati milijardu ključeva u sekundi i sklopimo sustav od milijardu takvog sklopovlja, opet je potrebno više od 1013 godina da se otkrije ključ - što je više od starosti svemira. Niz od 1024 takvog sklopovlja bi mogao otkriti ključ unutar jednog dana, ali ne postoji dovoljno atoma silicija u svemiru da se izgradi takav sustav. Uzmemo li sve to u obzir, napad grubom silom ipak nije najbolji način kriptoanalize ovog algoritma.

Algoritam je relativno nov i na njemu nije izvršeno puno kriptoanaliza. Jedan zapaženiji rad je objavio Meier[11] koji je pažljivo razmotrio tri algebarske operacije algoritma, i naglasio da iako su različitog tipa, postoje određeni primjeri gdje se mogu pojednostaviti na način da olakšaju kriptoanalizu. Njegov napad je učinkovitiji od sirove sile za IDEA-u s 2 ponavljanja (242 operacija), ali manje učinkovit za IDEA-u s 3 ponavljanja ili više. Obična IDEA s 8 ponavljanja je sigurna.

Drugi zapaženi rad je objavio Daemen[12] s otkrićem slabih ključeva za IDEA-u. Slabi ključ znači da kriptoanalitičaru s napadom na odbrani jasni tekst (engl. chosen plain text attack) olakšava otkrivanje ključa. Jedan od slabih ključeva je:

0000,0000,0x00,0000,000x,xxxx,x000.

Broj na mjestima x može biti bilo koji broj. Kada se koristi taj ključ, izvršavanjem operacije isključivo ILI s određenim parovima jasnog teksta dobivaju se isti rezultati kako i izvršavanjem operacije isključivo ILI s određenim parovima kriptiranog teksta. U svakom slučaju, vjerojatnost slučajnog generiranja jednog od tih ključeva je vrlo mala, jedan u 296. I vrlo je jednostavno modificirati algoritam tako da nema slabih ključeva, jednostavno izvršiti operaciju isključivo ILI između svakog ključa i vrijednosti 0x0DAE.

 

Slika 4.8  Skica kriptografskog algoritma IDEA.

 

4.2.3.     Načini rada algoritma IDEA

Kada se koristi algoritam za kriptiranje bloka podataka, način na koji se kriptira pojedini blok može i ne mora zavisiti o podataka koji su kriptirani u prethodnom bloku. S funkcijom CPSetKeyParam se može podesiti način rada.  Unaprijed određeni način rada je način ulančavanja (CBC).

Način Electronic Codebook (ECB). Kod korištenja ovog načina, svaki se blok kriptira individualno i nezavisno. To znači da će dva bloka istog sadržaja kriptirana s istim ključem biti identični jedan drugom i nakon kriptiranja. To olakšava posao osobi koja bi te podatke mogla pokušati probiti, zato jer može probijati jedan po jedan blok podataka. Također je moguća zamjena blokova bez otkrivanja. Inicijalizacijski vektori se ne mogu koristiti kod ovog načina. Ako je jedan bit kriptiranog teksta nečitak, cijeli blok jasnog teksta je nečitak.

Način ulančavanja (CBC). Ovdje se koristi veza između kriptiranih blokova. Prije nego što se svaki blok jasnog teksta kriptira, kombinira se sa kriptiranim tekstom prethodnog bloka s bitovnom isključivo ILI operacijom. To osigurava da čak i identični blokovi jasnog teksta budu kriptirani u različite kriptirane blokove. Inicijalizacijski vektor se kombinira s prvim blokom jasnog teksta s isključivo ILI operacijom prije kriptiranja. Kao i kod prethodnog načina, jedan nečitak bit unutar kriptiranog bloka prouzročit će nečitak blok jasnog teksta. U nastavku, bit u idućem bloku jasnog teksta (na mjestu nečitkog bita) će također biti nečitak. Sinkronizacijske greške su fatalne. Ako postoji višak ili manjak okteta u šifriranom tekstu, jasni tekst će biti nečitak od te točke nadalje. Ovo je osnovni način rada.

Način povratne veze (CFB). Za razliku od kriptiranja blok po blok, sa ovim načinom se mali dijelovi jasnog teksta mogu prebacivati u kriptirani tekst. Korisno je kada se npr. kriptiraju podaci koji dolaze s tipkovnice. Svaka stisnuta tipka se kriptira i šalje bez potrebe da se ispuni ostatak bloka. Ovaj način koristi posmačni registar koji je dug koliko i blok, a podijeljen je u dijelove. Npr. ako je blok veličine 64 bita sa 8 bitova s kojima računa odjednom, onda će posmačni registar biti podijeljen u 8 dijelova.

Kako se ova metoda koristi:

1.   Kriptira se blok u posmačni registar koristeći uobičajene postupke

2.   Koristi se bitovni EX-ILI između prvih 8 bitova iz kriptiranog registra sa idućih 8 bitova jasnog teksta koji se treba kriptirati. Rezultat se prosljeđuje kao 8 bitova kriptiranog teksta.

3.   Posmiče se posmačni registar za 8 bitova u lijevo

4.   Na zadnjih 8 bitova u posmačnom registru se postavlja 8 bitova kriptiranog teksta kreiranog u 2. koraku

Prije nego što počne proces kriptiranja podataka, posmačni registar se puni s inicijalizacijskim vektorom. Ako je bit u kriptiranom tekstu nečitak, jedan bit u jasnom tekstu je nečitak i cijeli posmačni registar je poremećen. U prethodnom primjeru, 9 okteta jasnog teksta bi bilo poremećeno. Ovo je ista količina širenja greške kao i kod ulančavanja blokova.

Inicijalizacijski vektori. Inicijalizacijski vektor je slučajan broj, obično jednak po broju bita kao i veličina bloka i koristi se kao početni blok kada se kriptira skup podataka s ulančanim načinom. To osigurava da se efekt inicijalizacijskog vektora širi kroz cijelu poruku koja se kriptira.

Ako se ne koristi inicijalizacijski vektor, onda će dvije identične poruke kriptirane s istim ključevima dati dva identična kriptirana rezultata. Uz različite inicijalizacijske vektore, svaka od kriptiranih poruka će biti potpuno različita. Zbog toga se preporuča uvijek koristiti različite inicijalizacijske vektore. Ovaj parametar je moguće postaviti s funkcijom CPSetKeyParam.

 

 

4.3.    Asimetrični Algoritam RSA

Algoritam je osmišljen na MIT-u, od strane Ron Rivesta, Adi Shamira i Leonarda Adlemana, po čijim je inicijalima i dobio naziv, RSA. Svoju sigurnost zasniva se na težini faktorizacije velikih brojeva. RSA korišten u ovom primjeru koristi ključ dužine 1024 bita.

Algoritam:

1.      Odabrati dva velika prim broja, p i q (uobičajeno > 100100)

2.      Izračunati n=p*q i z=(p-1)*(q-1)

3.      Odabrati d koji je relativno prost u odnosu na z. To znači da je najmanji zajednički djelitelj (d,z) = 1.

4.      Naći e tako da je e*d=1 mod z

5.      Podijeliti otvoreni tekst u blokove P tako da svaki od njih bude u intervalu 0£P<n (blokovi otvorenog teksta su nizovi od k bitova: 2k<n)

6.      Kriptiranje: C = Me mod n

7.      Dekriptiranje: M = Cd mod n

 

Javni ključ:

n          umnožak dva prim broja,  p i q (p i q moraju biti tajni)

e          relativno prost broj u odnosu na (p-1)(q-1)

Privatni ključ:

d          jednak je e-1 mod [(p-1)(q-1)]

 

Prilikom postupka kriptiranja, ulazni niz podataka se kodira u niz cijelih brojeva M u intervalu od [0, n-1], što praktično znači da se dijeli na blokove koji su jednake duljine kao i duljina ključa  (u ovom slučaju 1024 bita). Svaki cijeli broj Mi se kriptira u kriptirani broj Ci.

Dekriptiranje se obavlja tako da se dekriptiraju kriptirani brojevi Ci u izvorne brojeve Mi, i onda se broj M dekodira u izlazni niz podataka.

Osnovne karakteristike RSA algoritma:

·        RSA je spor (u softverskoj implementaciji 100 puta sporiji od DES-a, u hardverskoj implementaciji 1000 puta sporiji od DES-a)

·        primjeren za kriptiranje simetričnih ključeva prilikom njihove distribucije

U većini država RSA je postao standard za digitalno potpisivanje i kriptiranje simetričnih ključeva.

 

4.3.1.     Problem faktoriziranja velikih brojeva

Sigurnost RSA algoritma se bazira na problemu faktoriziranja velikih brojeva. Ako je pozitivni cijeli broj n , problem faktoriziranja se može definirati kao traženje relativno prostih brojeva pi takvih da je:

 

 

(4.3)

 

Taj problem je jedan od najstarijih u teoriji brojeva. Rješenje je jednostavno, ali traje puno vremena.

Trenutno je najbolji algoritam faktorizacije brojeva iznad 110 znamenaka sito polja brojeva (engl. number field sieve) našao faktore broja 2512+1.

Drugi po redu je algoritam kvadratičnog sita (engl. quadratic sieve) i najbrže dobiva rezultate za brojeve ispod 110 decimalnih znamenki.

Metodom eliptičke krivulje(engl. elliptic curve method) nađeni su faktori 43-znamenkastog broja.

Standardni algoritam provjere se sastoji od dijeljenja broja sa svakim prim brojem koji je manji od korijena tog broja i složenosti se procjenjuje na 2n/2 ako je n broj bitova.

 Implementacija rada s velikim brojevima potrebnih za rad RSA algoritma, u samom kriptografskom modulu napravljena je s posebnim skupom funkcija za rad s velikim brojevima koji se zove big_num_library.

 

 


4.4.    SHA hash algoritam

Standard koji je nazvan Sigurni hash algoritam SHA (engl. Secure Hash Algorythm) razvijen je od strane Američke agencije za sigurnost, NSA (engl. National Security Agency) za potrebe digitalnog potpisivanja dokumenata. Zahtjevi koji se postavljaju pred SHA algoritam je da za poruku bilo koje duljine do maksimalno 264 bita, izračuna hash-vrijednost koja je veličine 160 bita. Ta je vrijednost dalje korištena za ulaz u sustav za digitalno potpisivanje, jer je obično hash vrijednost poruke puno manja od same poruke.

Na početku rada algoritma, ulazna poruka proizvoljne duljine (ali ne duža od 264 bita) se nadopunjuje tako da je njena dužina u bitovima višekratnik broja 512. Nadopunjavanje poruke se izvodi tako da se prvo doda jedna, a zatim toliko nula koliko treba da se postigne duljina koja je za 64 bita kraća od željene (one koja je djeljiva s 512). Na kraju se u poruku ubaci 64-bitni zapis izvorne duljine poruke.

Pet 32-bitnih konstanti koje se koriste za inicijaliziranje varijabli su:

 

A = 0x67452301

B = 0xefcdab89

C = 0x98badcfe

D = 0x10325476

E = 0xc3d2e1f0

 

Poruka koja se hashira se uzima u blokovima od po 512 bita. Algoritam počinje tako da se varijablama a,b,c,d,e dodijele početne vrijednosti:

 

a = A

b = B

c = C

d = D

e = E

 

Glavna petlja se ponavlja četiri puta i u svaki puta obavlja 20 operacija. Svaka operacija obavlja nelinearnu funkciju na tri od pet varijabli, a, b, c, d ili e i onda ih posmiče i zbraja.

 

Ako je t broj operacije koja se obavlja (od 0 do 79), skup nelinarnih funkcija se definira:

 

t = [0..19]

t = [20..39]

t = [40..59]

t = [60..79]

 

 

Četiri konstante koje se koriste u algoritmu, ovisno o broju operacije t su:

 

Kt = 0x5a827999

t = [0..19]

Kt = 0x6ed9eba1

t = [20..39]

Kt = 0x8f1bbcdc

t = [40..59]

Kt = 0xca62c1d6

t = [60..79]

 

 

Ulazni blok podataka se transformira iz šesnaest 32-bitnih riječi (M0 - M15) u osamdeset 32-bitnih riječi (W0 - W79) koristeći sljedeći algoritam (t je broj riječi koja se transformira):

 

t = [0..15]

t = [16..79]

 

 

Ako je t broj operacije (0-79), Wt predstavlja 32-bitnu međuriječ iz prethodne tablice, i ako <<<s predstavlja lijevi cirkularni pomak od s bitova, onda se glavna petlja može opisati pseudokodom danom u slici 4.9. Skica izvršavanja glavne petlje je dana slikom 4.10.

 

 

za t= 1 do 79 {

      TEMP = (a <<< 5) + ft (b,c,d) + e + Wt + Kt;

      e = d;

      d = c;

      c = b <<< 30;

      b = a;

      a = TEMP;

}

 

Slika 4.9  Pseudokod jedne operacije SHA algoritma.

 

Nakon kraja izvršavanja glavne petlje, varijable a, b, c, d, e se zbrajaju s A, B, C, D, E, respektivno i algoritam se nastavlja s idućim blokom podataka. Krajnji rezultat je konkatenacija varijabli A, B, C, D, E.

Sigurnost SHA algoritma leži u činjenici da ne postoji niti jedan poznati kriptografski napad koji bi ga mogao kompromitirati.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Slika 4.10  Skica izvršavanja jedne operacije algoritma SHA.

 

 

4.5.    RND-WIN32 generator slučajnih brojeva

Generator kriptografsko jakih pseudo-slučajnih brojeva je jedna od najbitnijih komponenti kriptografskog modula jer o njemu ovisi sigurnost simetričnog i asimetričnog algoritma. Kod kreiranja ključeva koristi se generator slučajnih brojeva. Ako generator postane predvidiv, napadač s druge strane može predvidjeti kreirani ključ i s time kompromitirati sigurnu komunikaciju.

Peter Gutmann, Matt Thomlinson and Blake Coverett zajedno su razvili generator slučajnih brojeva Rnd-Win32. Da bi se došlo do nepredvidivih slučajnih brojeva, koristi se izvor entropije u različitim funkcijama operacijskog sustava. Rezultati tih funkcija se ubacuju u unutarnji bazen slučajnih brojeva (engl. random pool). Nakon ubacivanja brojeva u bazen, cijeli bazen se "promiješa" s višestrukim pozivanjem hash funkcije SHA, zbog osiguranja nepredvidivosti slučajnih brojeva. Prilikom uzimanja brojeva iz bazena, bazen se ponovo promiješa s hash funkcijom. Pomoću slučajnog niza dobivenog iz bazena nemoguće je otkriti sadržaj koji je ostao u bazenu, što je jedan od zahtjeva generatora kriptografsko jakih pseudo-slučajnih brojeva.

Algoritam ubacivanja entropije u bazen je otporan na kriptoanalitičke napade odabranim i poznatim jasnim tekstom. Razlog zbog kojeg napadač ne može odabirom ulaznih podataka saznati sadržaj bazena je nepoznavanje prethodnog sadržaja bazena. Logičkom operacijom isključivo-ILI s nepoznatim sadržajem napadač ne doznaje ništa. Algoritam je dan sa pseudokodom u slici 4.11.

 

 

dužina_bazena=256;

dok je dužina_podataka>0

{

     ako je bazen_poz>=dužina_bazena  onda  promiješaj_bazen;

     bazen[bazen_poz]=bazen[bazen_poz] EXILI podatak[podatak_poz];

      bazen_poz++;

      podatak_poz++;

      dužina_podataka--;

 }

 

 

Slika 4.11  Pseudokod ubacivanja podataka u bazen slučajnih brojeva.

 

Funkcija koja se zove nakon ispunjavanja bazena je Promiješaj_bazen. Ta funkcija služi za miješanje vrijednosti u bazenu slučajnih brojeva pomoću SHA hash funkcije. Radi na način da svakih 20 okteta izračuna preko hash-vrijednosti prethodnih 20 i idućih 44 okteta. Kod miješanja pojedinog dijela bazena, u obzir se uzimaju susjedni podaci da bi se što više utjecalo na taj dio slučajnog bazena. To pruža dovoljno dobru raspodjelu slučajnih brojeva i nemogućnost pogađanja vrijednosti u samom bazenu. Pseudokod je na slici 4.12.

 

dužina_hasha=20

dužina_bloka=64

 

za index=0 do dužina_bazena-1 korak dužina_hasha

{

     ako je index=0  onda  bazen_poz=dužina_bazena-dužina_hasha;

                     inače bazen_poz=index-dužina_hasha;

 

      za i=0 do dužina_hasha-1

         spremnik[i]=bazen[bazen_poz+i];

 

      za i=dužina_hasha do dužina_bloka-1

         spremnik[i]=bazen[(index+i) % dužina_bazena];

 

      hashiraj (spremnik, dužina_bloka),

                rezultat u bazen[index, dužina_hasha]);

 }

 

 

Slika 4.12  Pseudokod za miješanje bazena.

Postoje dvije funkcije koja komuniciraju s izvorima entropije u operacijskom sustavu, jedna koja se trenutno izvršava i zove se fastpoll i druga čije izvršavanje traje duže i zove se slowpoll. Općenito, fastpoll nalazi manju količinu entropije, dok slowpoll daje zadovoljavajuću količinu entropije za slučajni bazen. Zbog toga je potrebno barem jedno izvršavanje funkcije slowpoll ili tri izvršavanja funkcije fastpoll prije korištenja generatora slučajnih brojeva (do tih je vrijednosti autor došao ispitivanjem na različitim konfiguracijama i s različitim testovima) Te su funkcije specifične za operacijski sustav pod kojim se izvršavaju.

Slowpoll na operacijskom sustavu Windows 95 (Windows 98, ME) dodaje u bazen slučajnih brojeva identifikator procesa, identifikator stoga, veličinu u oktetima, linearnu adresu modula, tip i broj zaključavanja svakog objekta na trenutnom stogu, identifikator modula, globalnu statistiku pristupa, statistiku korištenja modula, osnovnu adresu, broj dretvi, svojstva svih dretvi, oznaku procesa-roditelja, puni put do svakog od trenutno aktivnih procesa...

Slowpoll na operacijskom sustavu Windows NT (Windows 2000) u slučajni bazen ubacuje statistiku pristupa diskovima, dubinu ulazno/izlaznog reda, veliki broj različith mrežnih statistika, kao što su broj okteta koji su primljeni i poslani, broj grešaka, broj sjednica, neuspješnih sjednica, ponovnih spajanja. Kao i kod Windowsa 95, u bazen se ubacuju sve moguće statistike trenutno izvršavajućih procesa i njihovih dretvi.

Fastpoll je za oba Windows sustava isti i kao izvor koristi funkcije koje se trenutno izvršavaju. Vrijednosti koje se ubacuju su oznaka aktivnog prozora, oznaka prozora gdje se miš trenutno nalazi, statistike trenutno izvršavajuće dretve, broj milisekundi otkako je operacijski sustav aktivan, oznaka prozora gdje se nalazi tastatura, statistika reda poruka (engl. message queue), trenutna pozicija miš, tipka koja je zadnja pritistnuta, statistike o zauzetosti memorije, različite postavke ulazno/izlaznih uređaja. Pored izvora entropije iz operacijskog sustava, fastpoll uzima entropiju i iz interakcije korisnika s računalom (korištenjem tipkovnice, miša...).

Veličina bazena je dovoljno velika da zadovolji potrebe kriptografskih algoritama koji je koriste za generiranje ključeva, tj. 256 okteta. Radi sigurnosti, iz bazena je dozvoljeno uzimanje najviše 128 okteta, tj. pola njegove veličine. Uzimanje podataka iz bazena slučajnih brojeva je zaštićeno tako da se na osnovu dobivenih slučajnih brojeva iz bazena ne može doznati preostali sadržaj bazena i time učiniti generator slučajnih brojeva predvidivim. Zaštita je u tome što se i izlazni niz podataka i ostatak bazena slučajnih brojeva ponovo miješaju s hash funkcijom, te se nakon toga izlazni niz podataka "presavije na pola", tj. obavi se isključivo ILI između prve i druge polovice izlaznog niza podataka. Pseudokod je dan na slici 4.13.

 

 

 

 


ako je dužina_podataka>=dužina_spremnika/2 ili

       dužina_podataka>=dužina_bazena/2    onda greška!;

 

za i=0 do dužina_podataka-1

{

   spremnik[i]=bazen[i] EXILI 0xFF;

}

promiješaj(bazen);

promiješaj(spremnik);

 

za i=0 do dužina_spremnika/2-1

{

   spremnik[i]=spremnik[i] EXILI spremnik[i+dužina_spremnika/2);

 }

 

Slika 4.13  Pseudokod uzimanja podataka iz slučajnog bazena.

 

Nije dozvoljeno uzimati podatke iz više od polovice bazena. Spremnik mora biti dvostruko veći od tražene dužine slučajnih podataka. Nakon iskorištavnja cijelog bazena, uvodi se nova entropija s pozivima funkcije fastpoll. Bazen se u toku miješanja kontrolira da se ne desi ponavljanje znakova. Podaci se nakon izlaska iz bazena provjeravaju statističkim FIPS-140 metodama. Jedna od metoda je monobit provjera da je barem 1/4 svih bita jedinica, odnosno nula. Drugi test se zove poker i provjerava da li ima barem 1/16 svakog para bitova. Ako izlazni niz ne zadovoljava kriterije, ubacuje se još entropije u bazen, i pokušava se ponovo. Nakon nekoliko pokušaja (unaprijed definiranog broja), funkcija vraća grešku sa opisom.

 


5.       Programski primjer

 

5.1.    Opis programa

Ovaj program je vrlo jednostavna implementacija kriptirane mrežne komunikacije između dva korisnika, popularnog chata. Mrežno povezivanje se ostvaruje mreko mrežnih utičnica (socket), a kriptografski algoritmi koji se koriste su RSA (1024 bita) za izmjenu ključeva i IDEA (128 bita) za kriptiranje teksta. Kriptografski algoritmi su implementirani u kriptografskom modulu.

 

Protokol:

 

 

 

 

 

 

 

Slika 5.1  Protokol komunikacije kod uspostavljanja veze između korisnika A i B.

 

 

Korisnici A i B kreiraju svoj privatni i javni RSA ključ (1024 bita). Korisnik B je poslužitelj (server) i čeka povezivanje, korisnik A je klijent i započinje povezivanje.

 

1)      korisnik A šalje svoj javni ključ preko nekriptirane veze korisniku B

2)      korisnik B šalje svoj javni ključ preko nekriptirane veze korisniku A

 

Svaki od korisnika kreira svoj sjednički (simetrični) IDEA ključ od kojih se svaki koristi za jedan smjer komunikacije. Unutar strukture u kojoj je spremljen ključ, također je spremljen i algoritam kriptiranja u kojem se taj ključ koristi. Uz upotrebu dva različita ključa, jednog za komunikaciju od korisnika A prema korisniku B, a drugog za komunikaciju od korisnika B prema korisniku A, moguće je čak komunicirati s dva potpuno različita kriptografska algoritma.

 

3)      korisnik A kriptira svoj sjednički ključ s javnim ključem korisnika B i šalje ga. Korisnik B prima kriptirani sjednički ključ korisnika A, dekriptira ga svojim privatnim ključem i sprema ga.

4)      korisnik B kriptira svoj sjednički ključ s javnim ključem korisnika A i šalje ga. Korisnik A prima kriptirani sjednički ključ korisnika B, dekriptira ga svojim privatnim ključem i sprema ga.

 

 

Kriptirana komunikacija između dva korisnika se obavlja koristeći simetrični IDEA algoritam sa ključem od 128 bita za kriptiranje blokova.

 

 

 

 

 

 

 

 


Slika 5.2   Protokol komunikacije kod razmjene podataka između korisnika A i B.

 

5)      Korisnik A kriptira paket podataka sa svojim sjedničkim ključem. Šalje se dužina paketa i sam kriptirani paket.
Korisnik B prima paket. Pomoću sjedničkog ključa korisnika A dekriptira paket.

6)      Korisnik B kriptira paket podataka sa svojim sjedničkim ključem. Šalje se dužina paketa i sam kriptirani paket.
Korisnik A prima paket. Pomoću sjedničkog ključa korisnika B dekriptira paket.

 

Ovaj primjer sigurne komunikacije običnim protokolom pokazao je jednostavnost sučelja kriptografskog modula u okruženju Microsoft Visual C++ 6.0.  Za razvoj programa je korištena Pentium II 266 konfiguracija s 128 Mb RAM-a na Windows NT 4.0 operacijskom sustavu sa Service Packom 6.

Izgled programa na ekranu se može vidjeti na slikama 5.3 i 5.4.

 

Slika 5.3  Korisnik B (poslužitelj).

 

 

Slika 5.4  Korisnik A (klijent).

5.2.    Deklaracija varijabli i inicijalizacija sučelja

 

Za deklariranje varijabli korištenih koriste se tipovi podataka unaprijed deklarirani u <wincrypt.h> zaglavlju.

 

// Ime spremnika za kljuc unutar samog MODULa

CString       m_strContainerName;

 

// davatelj kriptografskih usluga

HCRYPTPROV    m_hProvider;        

 

// lokalni javni kljuc za kriptiranje sjednickog kljuca

HCRYPTKEY     m_hLocalPublicKey;  

 

// udaljeni javni kljuc za kriptiranje sjednickog kljuca

HCRYPTKEY     m_hRemotePublicKey; 

 

// lokalni sjednicki kljuc za IDEA

HCRYPTKEY     m_hLocalSessionKey;

 

// udaljeni sjednicki kljuc za IDEA     

HCRYPTKEY     m_hRemoteSessionKey;

 

 

Zbog sigurnosti, kreira se novi spremnik za ključeve pod nekim slučajnim nazivom. Odmah nakon kreiranja spremnika i učitavanja modula, kreira se par asimetričnih RSA ključeva koji će poslužiti za kriptiranje i razmjenu sjedničkih ključeva.

 

///////////////////////////////////////////////////////////

// Postavi sve varijable potrebne za koristenje CryptoAPI

///////////////////////////////////////////////////////////

 

void InitializeCryptoAPI()

{

       // prvo odredi slucajno ime spremnika

       m_strContainerName = ...

 

...

 

       // kreiraj spremnik, u isto vrijeme i inicijaliziraj

// Crypto modul

       if (!CPAcquireContext(&m_hProvider, LPCTSTR(m_strContainerName),

  NULL, PROV_CRYPTO_FULL, CRYPT_NEWKEYSET))

{

       ::AfxMessageBox(_T("Error creating temporary container!"), MB_OK);

       ::ExitProcess(1);

       }

 

       // kreiraj par Javni/privatni kljuc za izmjenu

       if (!CPGenKey(m_hProvider, AT_KEYEXCHANGE, 0,

 &m_hLocalPublicKey))

{

       ::AfxMessageBox(_T("Error creating key pair!"), MB_OK);

       ::ExitProcess(1);

       }

...

}

5.3.    Izmjena javnih ključeva

 

Javni RSA ključevi se izmjenjuju preko nekriptiranog kanala i ubacuju u lokalni kontekst. Ovo je bitno kako bi se zatim pomoću tog javnog ključa mogao kriptirati sjednički ključ i poslati drugom korisniku. Taj korisnik će moći dekriptirati sjednički ključ sa svojim privatnim RSA ključem.

 

////////////////////////////////////////////////////////////////////////

// Prima javni kljuc

////////////////////////////////////////////////////////////////////////

 

BOOL GetPublicKey()

{

...

       // primi blob

       m_psockSendRecv->Receive(pbBuffer, dwBlobSize);

 

       // ubaci primljeni javni kljuc u lokalni MODUL

       CPImportKey(m_hProvider, pbBuffer, dwBlobSize, 0, 0,

    &m_hRemotePublicKey);

 

       ...   

}

 

 

////////////////////////////////////////////////////////////////////////

// Salje javni kljuc

////////////////////////////////////////////////////////////////////////

 

BOOL SendPublicKey()

{

       ...

       // posalji lokalni javni kljuc udaljenom korisniku

       // prvo pogledaj koliko mjesta zauzima

 

       CPExportKey(m_hLocalPublicKey, 0, PUBLICKEYBLOB, 0, NULL,

     &dwBuffLen);

 

       // onda alociraj memoriju

       pbBuffer = (PBYTE) malloc(dwBuffLen);

       ::ZeroMemory(pbBuffer, dwBuffLen);

 

       // i prebaci javni kljuc iz MODULa u memoriju

       CPExportKey(m_hLocalPublicKey, 0, PUBLICKEYBLOB, 0, pbBuffer,

     &dwBuffLen);

 

       // posalji kljuc

...

}

 

 

 

 

 

 

 

5.4.    Kreiranje i izmjena sjedničkog ključa

U ovoj funkciji se odabire algoritam (IDEA) i krerira se simetrični ključ kojim ćemo kriptirati podatke. Ovo je jedino mjesto gdje se određuje simetrični algoritam kriptiranja i dekriptiranja.

 

/////////////////////////////////////////////////////////////////////

// Stvara se sjednicki kljuc za IDEA algoritam, /////////////////////////////////////////////////////////////////////

 

BOOL CreateSessionKey()

{

       // generiraj sjednicki kljuc, IDEA algoritam

       return

CPGenKey(m_hProvider, CALG_IDEA, CRYPT_EXPORTABLE,

 &m_hLocalSessionKey);

}

 

Sjednički ključevi se prilikom izmjene automatski kriptiraju javnim RSA ključem primatelja, tako da ga samo primatelj može dekriptirati svojim privatnim RSA ključem.

 

/////////////////////////////////////////////////////////////////////

// Uzima se sjednicki kljuc

/////////////////////////////////////////////////////////////////////

 

BOOL GetSessionKey()

{

...

// primi blob

       m_psockSendRecv->Receive(pbBuffer, dwBlobSize);

      

       // ubaci udaljeni sjednicki kljuc u lokalni MODUL

       int a = CPImportKey(m_hProvider, pbBuffer, dwBlobSize,

 m_hLocalPublicKey, 0, &m_hRemoteSessionKey);

...

}

////////////////////////////////////////////////////////////////////

// Salje se sjednicki kljuc

////////////////////////////////////////////////////////////////////

 

BOOL SendSessionKey()

{

...

       // prebaci sjednicki kljuc u blob

       // prvo uzmi velicinu

       int a = CPExportKey(m_hLocalSessionKey, m_hRemotePublicKey,

 SIMPLEBLOB, 0, NULL, &dwBuffLen);

      

       // alociraj memoriju

       pbBuffer = (PBYTE) malloc(dwBuffLen);

       ::ZeroMemory(pbBuffer, dwBuffLen);

 

       // prebaci sjednicki kljuc u memoriju

       CPExportKey(m_hLocalSessionKey, m_hRemotePublicKey, SIMPLEBLOB,

     0, pbBuffer, &dwBuffLen);

 

       // posalji kljuc

...

}

5.5.    Spajanje klijenta i poslužitelja

Protokol za ovo spajanje je već opisan ranije. Programska implementacija je jednako jednostavna kao i opis protokola, ako ne i jednostavnija.

 

// serverska strana

///////////////////////////////////////////////////////////////

// razmjena javnih kljuceva za RSA asimetricni kript. algoritam

 

if (!SendPublicKey()) {

       pStatusList->InsertString(0, _T("Error sending public key."));

}

if (!GetPublicKey()) {

       pStatusList->InsertString(0, _T("Error getting public key."));

}

 

// postavljanje i razmjena sjednickih kljuceva za IDEA

// koji su kriptirani asimetricnim RSA algoritmom

 

if (!CreateSessionKey()) {

       pStatusList->InsertString(0, _T("Error creating session k."));

       ...

}

if (!SendSessionKey()) {

       pStatusList->InsertString(0, _T("Error sending session key."));

       ...

}

if (!GetSessionKey()) {

       pStatusList->InsertString(0, _T("Error getting session key."));

       ...

}

 

// klijentska strana

///////////////////////////////////////////////////////////////

// razmjena javnih kljuceva za RSA asimetricni kript. algoritam

 

if (!GetPublicKey()) {

       pStatusList->InsertString(0, _T("Error getting public key."));

       OnConnect();

}

if (!SendPublicKey()) {

       pStatusList->InsertString(0, _T("Error sending public key."));

       OnConnect();

}

 

// postavljanje i razmjena sjednickih kljuceva za IDEA

// koji su kriptirani asimetricnim RSA algoritmom

 

if (!CreateSessionKey()) {

       pStatusList->InsertString(0, _T("Error creating session key."));

       OnConnect();

}

if (!GetSessionKey()) {

       pStatusList->InsertString(0, _T("Error getting session key."));

       OnConnect();

}

if (!SendSessionKey()) {

       pStatusList->InsertString(0, _T("Error sending session key."));

       OnConnect();

}

5.6.    Slanje i primanje podataka

Ovo je samo dio funkcije za slanje podataka koja kriptira podatke. Korisnik A kriptira paket podataka sa svojim sjedničkim ključem. Šalje se dužina paketa i sam kriptirani paket.

 

...

// odredi duljinu buffera

CPEncrypt(m_hLocalSessionKey, 0, TRUE, 0, NULL, &dwBuffLen, 0);

 

// prebaci poruku u buffer

pbBuffer = (PBYTE) malloc(dwBuffLen+1);

 

::ZeroMemory(pbBuffer, dwBuffLen);

memcpy(pbBuffer, LPCTSTR(strMessage), strMessage.GetLength());

 

// enkriptiraj buffer

CPEncrypt(m_hLocalSessionKey, 0, TRUE, 0, pbBuffer, &dwDataLen, dwBuffLen);

 

ASSERT(m_psockSendRecv != NULL);

 

// posalji salt i duljinu poruke

m_psockSendRecv->Send(&dwDataLen, sizeof(DWORD), 0);

 

// posalji poruku

m_psockSendRecv->Send(pbBuffer, dwDataLen, 0);

 

Korisnik B prima dužinu paketa i nakon toga sam paket. Pomoću sjedničkog ključa korisnika A dekriptira paket.

 

// pokupi duljinu poruke

m_psockSendRecv->Receive(&dwBuffSize, sizeof(DWORD));

 

// izvadi duljinu poruke

memcpy(&dwBuffSize, pbSaltBuffer+dwSaltLen, sizeof(DWORD));

 

// alociraj buffer

pbBuffer = (PBYTE) malloc(dwBuffSize+1);

::ZeroMemory(pbBuffer, dwBuffSize+1);

m_psockSendRecv->Receive(pbBuffer, dwBuffSize);

 

// dekriptiraj poruku

CPDecrypt(m_hRemoteSessionKey, 0, TRUE, 0, pbBuffer, &dwBuffSize);

 

// postavi 0 na kraj dekriptiranog stringa

memset(pbBuffer+dwBuffSize, 0, 1);

 

 

 

 

 

 

 

 

5.7.    Brisanje korištenih varijabli

Svi podaci o korištenim ključevima se brišu iz spremnika modula koji se koristi. U slučaju kada se to ne bi napravilo, destruktor klasa samog modula bi obrisala sve spremnike prilikom završetka korištenja modula.

 

//////////////////////////////////////////////////////////////////////

// Unistavaju se kljucevi

//////////////////////////////////////////////////////////////////////

BOOL CCryptoAPIChatDlg::DestroyKeys()

{

       // ako udaljeni javni kljuc postoji

       if (m_hRemotePublicKey) {

              CPDestroyKey(m_hRemotePublicKey);

       }

       // ako lokalni sjednicki kljuc postoji

       if (m_hLocalSessionKey) {

              CPDestroyKey(m_hLocalSessionKey);

       }

       // ako udaljeni sjednicki kljuc postoji

       if (m_hRemoteSessionKey) {

              CPDestroyKey(m_hRemoteSessionKey);

       }

 

       // izbrisi privremeni spremnik

       if (!CPAcquireContext(&m_hProvider, LPCTSTR(m_strContainerName),

NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET))

 {

        ::AfxMessageBox(_T("Error destroying temporary container!"), MB_OK);

        ::ExitProcess(1);

        }

       ...

       return TRUE;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6.       Zaključak

 

Sigurno je da će se kriptografija nastaviti razvijati sve bržim i bržim koracima. Kvantna računala i napredni algoritmi njima prilagođeni samo su jedan nagovještaj budućnosti. Društvo će postaviti više sigurnosne zahtjeve, na što će kriptografska zajednica odgovoriti s novim algoritmima koji će udovoljiti tim zahtjevima. Distribucija novih kriptografskih algoritama u kriptografskim modulima jednostavnog i otvorenog sučelja je najbolji oblik distribucije nove tehnologije programerima koji su zaduženi za razvoj ili održavanje nekog sustava.

Prednosti takvog kriptografskog modula su sljedeće:

·        jednostavnost razvoja sigurnih aplikacija koje koriste jaku kriptografiju,

·        mogućnost kombinacije različitih razina zaštite u istoj aplikaciji(npr. vojna primjena, javne ustanove, komercijalna primjena, međunarodna primjena),

·        fleksibilna, jeftinija zaštita osjetljivih podataka (zbog kraćeg vrijemena implementacije kriptografskih algoritama),

·        modularni razvoj kriptografskih algoritama i njihova jednostavna primjena te zamjena u slučaju zastarjelosti.

Pri oblikovanju kriptografskog modula treba riješiti sljedeće probleme:

·        Razina sigurnosti. Kriptografski modul mora pružati razinu sigurnosti koju korisnik zahtjeva;

·        Funkcionalnost. Kriptografski modul mora pružati funkcije koje korisnik očekuje. Obično su to algoritmi za kriptiranje podataka, mijenjanje ključeva i potpisivanje podataka;

·        Učinkovitost. Izvedba algoritama mora biti učinkovita i prilagođena operacijskom sustavu na kojem se izvršava;

·        Čuvanje svih tajnih podataka u sigurnom spremniku. Korisnik koristi te podatke preko oznaka. Najsigurnije je te podatke držati zaštićenim u memoriji dok su potrebni, a po potrebi i na vanjskom mediju kao što je npr. smart card;

·        Otvorenost sučelja. O tome direktno ovisi lakoća korištenja kod korisnika. Standardizacija sučelja među svim proizvođačima je vrlo poželjna! Trenutno veliki utjecaj na tržištu ima Microsoft sa svojim CryptoAPI sučeljem koje je rasprostranjeno zajedno s Microsoftovim operacijskim sustavima na 80% računala širom svijeta;

·        Višekorisnička i višezadaćna okolina. Više korisnika istovremeno koristi kriptografski modul, ponekad u isto vrijeme;

·        Rad u realnom vremenu. Da li sustav zahtjeva da rezultati budu u određenom vremenskom intervalu, neovisno od ulaznih parametara;

·        Generator kriptografsko sigurnih pseudo-slučajnih brojeva. Na računalu koje je samo po sebi determinističko, treba naći izvor entropije koja će se moći praktično iskoristiti za generiranje kriptografski sigurnih slučajnih brojeva. To u nekim slučajevima može biti vanjski izvor, dok je u većini slučajeva izvor entropije operacijski sustav.

Literatura

 

[1]               B. Scheiner, Applied Cryptography, John Wiley&Sons, Inc, 1996.

[2]               A. Menezes, P. van Oorschot, S. Vanstone, Handbook of Applied Cryptography, CRC Press, 1996.

[3]               L. Budin, Sigurnost računalnih sustava, skripta sa predavanja predemeta Operacijski sustavi, FER 1998.

[4]               P. Gutmann, Izvorni tekst kriptografskih algoritama, dostupno na Internetu na adresi http://www.cs.auckland.ac.nz/~pgut001/cryptlib

[5]               Microsoft, MSDN Online documentation, Microsoft Corporation, 1999.



[1] Apple, AT&T, Compaq, Digital, IBM, Silicon Graphics, Sun i Unisys

[2] kriptografija ... lat. tajnopis, način tajnog pisanja

[3] Misli se na simetrični algoritam za kriptiranje

 

[4] CryptoAPI je Microsoftov prijedlog arhitekture odvajanja aplikacija od kriptografskih mehanizama.

[5] eng. "Index slučajnosti i njena primjena u kriptografiji"

[6] eng. "Teorija komunikacije tajnih sustava"

[7] eng. "Novi smjerovi u kriptografiji"

[8] Deterministička u ovom kontekstu znači unaprijed izvedena i određena, ne-slučajna.

[9] Predviđanje se bazira na analizi Schneidera [2].

[10] Od verzije Windows 95 pa na dalje

[11] W.Meier: On the Security of the IDEA Block Cipher, Eurocrypt 93, Springer-Verlan 1994.

[12] J.Daeman, R.Govaerts, J.Vanderwalle: Weak Keys for IDEA, Eurocrypt 93, Springer - Verlan. 1994.