Java i PGP

PGP

Što je to PGP

PGP je jedan od najpopularnijih i najraširenijih načina zaštite sadržaja elektronske pošte danas. Koristi se vrlo pouzdanim kriptografskim algoritmima: Ima razrađen sistem deponiranja javnih i tajnih ključeva u vlastite malene baze podataka te povrh svega pruža mogućnost kompresije podataka. Može se koristiti za ciljano kriptiranje elektronske pošte jednom ili više korisnika te za digitalni potpis elektronske pošte.

Konvencionalno kriptiranje putem tajnog ključa

Kriptografija putem tajnog ključa još se naziva i simetrična kriptografija. Kako je vidljivo sa slike dolje, kriptiranje i dekriptiranje se vrši pomoću jednog ključa, tzv. tajnog ključa. Ova vrsta kriptografije nije pogodna za razmjenu kriptiranih poruka između dva entiteta, no nalazi svoju primjenu u zaštiti podataka jednog entiteta tj. kad nema potrebe za prijenosom informacije koja sadrži tajni ključ.

Slika 1: Konvencionalna kriptografija putem tajnog ključa

Kriptiranje putem javnog ključa

U svrhu kriptiranje komunikacije između dva ili više entiteta koristi se kriptografija putem javnog ključa. Za ovu je kriptografiju karakteristično da barata parom ključeva: jednim tajnim te jednim javnim ključem. Da bi entitet A poslao zaštićenu poruku entitetu B on mora posjedovati njegov javni ključ i svoj tajni ključ. Kriptiranu poruku tada može pročitati samo entitet B ako posjeduje pripadajući tajni ključ.

Slika 2: Kriptografija putem javnog ključa

PGP algoritam koristi principe jednog i drugog algoritma, međusobno ih kombinira kako bi na što efikasniji i brži način obavio vremenski zahtjevne poslove kriptiranja.

PGP način kriptiranja

Kao je ilustrirano na slici dolje, PGP zapravo koristi metodu tajnog ključa za kriptiranje sadržaja poruke. To je tako urađeno iz jednostavnog razloga jer je algoritam tajnog ključa daleko brži od algoritma javnog ključa uz gotovo istu sigurnost. Samu kriptografiju javnog ključa upotrebljavamo kako bismo pohranili informaciju o privremenom slučajnom (random generiranom) tajnom ključu, tj. ulaznoj šifri simetričnog algoritma.

Slika 3: Na koji način PGP kriptira sadržaj

Primijetite da nam je za dekriptiranje sadržaja poruke sada potreban tajni dio ključa kako bismo metodom javnog ključa dobavili ulaznu šifru simetričnog algoritma i konačno dekriptirali poruku.

Slika 4: Na koji način dekriptirati PGP-om kriptiranu poruku

Ovakav način zaštite sadržaja poruke "iza dva ključa" možda se čini slabijom implementacijom u odnosu na implementaciju koju bi imali kad bi koristili samo jedan način kriptiranja (analogija paralelnog spoja otpornika), međutim ovaj način po efektivnoj manifestaciji zadržava osobine metode javnog ključa i brzinu metode tajnog ključa, dakle poželjne osobine oba algoritma uz i dalje garantiranu priličnu sigurnost poruke. Nije naodmet napomenuti da ni IDEA ni RSA algoritmi dosad nisu razbijeni isto kao ni PGP-način kriptiranja kombinacijom ova dva algoritma.

Također je važno napomenuti činjenicu koja nije ilustrirana na slici, a radi se o primjeni MD5 algoritma kojim se obavezno svaka poruka dodatno zaštićuje bilo da se radi o kriptiranju putem tajnog ključa ili o PGP-načinu kriptiranja. MD5 algoritam ovdje služi istoj svrsi koju ima primjerice CRC-checksum informacija unutar neke arhive, s razlikom da je CRC daleko brži ali MD5 daleko pouzdaniji algoritam. Valja naglasiti da se u MD5 informaciju obično ubacuje i vrijeme kada je checksum napravljen, jedna stvar koja je CRC algoritmu potpuno nebitna.

Informacija MD5 algoritma nam je daleko najvažnija prilikom digitalnog potpisivanja nekog sadržaja.

Digitalni potpis

Danas nažalost još uvijek vlada širom svijeta mišljenje naslijeđeno iz starijih vremena kada je kriptografija bila još u povojima ili šablonski urađenih špijunskih filmova gdje okretni superheroji poput James Bonda rješavaju najkompliciranije kriptografske mozgolomke dječjim slagalicama. Istina je, dakako, vrlo daleko od toga:


"If all the personal computers in the world - 260 milion - were put to work on a single PGP-encrypted message, it would still take an estimated 12 milion times the age of the universe, on average, to break a single message."

"Ako bi sva računala svijeta - njih 260 miliona - bila pokrenuta u zajedničkom zadatku na jednoj jedinoj PGP-om zaštićenoj poruci, bilo bi potrebno u prosijeku 12 miliona puta više vremena koliko je proteklo od nastanka svemira da bi je uspijeli probiti." [pgp50manual.pdf:118]

Inače upućeni govore da je NSA poznata po kriptografskom prisluškivanju te kao organizacija koja uvjerljivo prednjači po broju uposlenih kriptoanalitičara (mnogi je nazivaju kriptografskom CIA-om). Sve u svemu, zamjeniku direktora ovakve jedne organizacije svakako je za vjerovati.

No, vratimo se našoj analizi. Cilj ovog citata je bio da se ukaže na pouzdanost digitalnog potpisa koji je, nažalost, još vrlo daleko od ravnopravnosti prema potpisu rukom ili čak rukom potpisanim pa putem faxa poslanog dokumenta.

Digitalno potpisivanje čiji je prikaz dat na slici 5 je identičan postupak u gotovo svakoj implementaciji metode javnog ključa. Napravi se nekim od checksum algoritama (u konkretnom slučaju PGP -a to je MD5 ) kontrolna vrijednost koja jednoznačno opisuje sadržaj. Tada tu poruku kriptiramo putem tajnog dijela ključa metode javnog ključa (RSA secret key) na taj način svojim digitalnim potpisom (manifestiranim upisivanjem šifre potrebne za dobavljanje tajnog dijela ključa) garantiramo izvornost sadržaja (manifestirana jednoznačnim MD5 checksumom).

Slika 5: Kreiranje digitalnog potpisa

Pogledajmo sada na koji se način provjerava autentičnost digitalnog potpisa.

Slika 6: Provjera autentičnosti digitalnog potpisa

Potrebno je konstruirati MD5 "destilat" poruke koji naknadno uspoređujemo sa izlazom dobivenim "dekriptiranjem" digitalnog potpisa koristeći javni dio ključa korisnika.



PGP u Javi

Na koji način

Mora se priznati da implementirati PGP u Javi i nije najpogodnije rješenje iz dva razloga: Ostaje nam ipak srednje, alternativno rješenje: iskodirati zahtjevne kripto-funkcije u obliku Javinog native kôda. Na taj način ipak radimo u Java programskom jeziku dok se kripto-funkcije izvršavaju tek nešto sporije nego što bi se izvršavale kao native C-funkcije u izvršnom kodu C-programa. Loša strana native-rješenja je da smo njegovom upotrebom odustali od apsolutne prenosivosti koju garantira Java. No u krajnjoj liniji to i nije tako strašno jer dotične kripto-funkcije koristimo na relativno statičnoj strani poslužioca dok se za kriptiranje sadržaja poruka na strani korisnika mora pobrinuti neki drugi program.

Zašto ne PGP u appletu?

Zahtjeve korisnika obrađujemo putem Java appleta koji se izvršava na nekom od Internet pretraživača koji podržavaju Javu, kao što su Netscape, Internet Explorer, HotJava ili appletviewer.

Primijetite da se ovdje radi o Java appletu, a ne o Javinoj aplikaciji, tako da se mora voditi računa o svim ograničenjima koje imaju appleti naspram aplikacija. Od prije navedenih ograničenja ovdje nam upotrebu PGP-a priječe sljedeća dva razloga:

Čak i ako bismo doskočili ovim problemima iskodiravši do-zla-boga-spor-applet koji ne koristi native implementaciju kripto-funkcija već je apsolutno cijeli pisan u Javi, ne možemo zaobići sljedeću zapreku: Jedina moguća varijanta koja nam ostaje je koristiti applet apsolutno cijeli pisan u Javi koji će dohvaćati javne i tajne ključeve sa Interneta, no to tek nema smisla jer bi informacija o tajnom ključu nezaštićeno kolala Internetom, a ovdje pokušavamo ostvariti nekakvu sigurnost komunikacije.


Napomena:
Gore navedene informacije nisu u potpunosti korektne jer se odnose na stariju verziju Jave (JDK v1.02). U novijoj verziji Jave je podržano ograničeno zaobilaženje striktno utvrđenih restrikcija appleta putem digitalno potpisanih JAR datoteka (dotična mogućnost je trenutno podržana samo u Internet pretraživaču Netscape v4.0 naviše), te digitalno potpisanih CAB datoteka (podržanih samo u Internet pretraživaču Microsoft Internet Explorer v4.0 naviše).





PGP Java poslužioc

Način rada

PGP Java poslužioc (server) je izrađen u tzv. Multy-Threaded izvedbi. Proučimo sljedeću sliku:

Slika 7: Multy-Threaded struktura poslužioca

Sa slike možemo zaključiti da je poslužioc u stanju obrađivati zahtjeve više od jednog korisnika istovremeno. Takav način obrade je u Javi jedino moguće ostvariti putem tzv. threadova odnosno odvajanjem zasebnih procesa obrade od glavnog procesa (po manifestaciji slično kao fork() funkcija u C-u). U suprotnom imali bismo zastoj jer bi bilo moguće vršiti obradu zahtijeva samo jednog procesa istovremeno. Ovakav pristup korištenja zasebnih procesa za određene radnje poznatiji je pod imenom multy-thread način. Također na slici možemo uočiti manje kućice u kojima piše session. To je uobičajen naziv za nezavisan proces obrade.

Što se konkretno tu zbiva. Pokretanjem PGPserver procesa otvara se novi servis na portu (Internet ulazu) broj 4444. Proces PGPserver čeka da ga neki drugi proces kontaktira te zatraži obradu (MasterSocket blokiran u proceduri accept()). Kad se to napokon i dogodi, PGPserver proces pokreće zaseban thread proces kojem prosljeđuje kao argumente parametre Internet veze (socket) procesa koji zahtijeva obradu. Thread proces preuzima daljnju obradu od PGPserver procesa koji tako postaje slobodan za ponovno prihvaćanje novog poziva. U ovoj konkretnoj izvedbi thread proces služi samo kao filtar između klijenta (tj. korisnika) i radnih rutina klase PGPradnik analizirajući prirodu pojedinog zahtjeva te u slučaju da je potreban dodatni argument čeka na njegov unos kako bi osigurao ispravnu obradu zahtjeva.

Podržane mogućnosti

Pogledajmo mogućnosti cijelog PGP-Server a: