Ispravno korištenje stream ciphera nalik RC4
Sadržaj |
Uvod
Kako bi se moglo pričati o pojedinim područjima kriptografije bitno je prvo postaviti temelje, stoga ćemo ukratko započeti sa osnovama kako bi lakše razumjeli srže teme.
Kriptografija je proučavanje i primjena tehnika za sigurno komuniciranje u prisutnosti treće osobe, odnosno, u grubo, primjena i razvoj načina kako trećoj osobi onemogućiti pristup komunikaciji. Kriptografija je jedan od ključnih elemenata na području informacijske sigurnosti budući da je danas informacija definirana kao imovina i ima svoju vrijednost.
Jedna od stručnih definicija kaže: „Kriptografija je proučavanje matematičkih tehnika povezanih sa aspektima informacijske sigurnosti poput povjerljivosti, podatkovnog integriteta, autentikacije entiteta i autentikacije porijekla podataka.[1]“
Četiri temeljna cilja kriptografije, iz kojih proizlaze svi ostali su[2]:
- Privatnost ili povjerljivost je usluga koja čuva sadržaj informacije od svih koji nisu autorizirani za njezino posjedovanje.
- Integritet podataka je usluga koja se fokusira na ne autoriziranu izmjenu podataka. Kako bi se osigurao integritet trebaju postojati načini otkrivanja manipulacije podacima od treće osobe.
- Autentikacija je usluga vezana uz identifikaciju. Ona se veže i uz informaciju i uz entitete, a temelji se na tome da kada dvije strane stupaju u komunikaciju moraju se i identificirati. Iz ovoga proizlaze dvoje glavne klase kriptografije: autentifikacija identiteta i autentifikacija porijekla podataka.
- Ne-negiranje je usluga koja onemogućava nekom entitetu da negira prethodne radnje ili obveze. Kada nastanu neslaganja pri negiranja entiteta da je počinio određene akcije, potrebno je imati protumjere za rješavanje takvih situacija.
Stoga je temeljni cilj kriptografije primjereno uvažavanje navedenih područja u teoriji i praksi kako bi se moglo otkriti i spriječiti neprimjerene štetne radnje.
Kako bismo dalje mogli pričati o kriptografiji i njenim primjenama potrebno je definirati temeljne pojmove vezane uz kriptografiju s kojima se susrećemo. Kako je osnovna zadaća kriptografije osigurati neometanu i sigurnu komunikaciju između dva entiteta putem nekog nesigurnog komunkacijskog kanala. Prilikom komunikacije entiteti imaju uloge, od kojih je jedan pošiljalac a drugi primalac. Poruka koja se šalje komunikacijskim kanalom je otvoreni tekst (eng. plaintext) koji može biti bilo kakva vrsta podatka. Kada pošiljalac šalje poruku taj se otvoreni tekst transformira, odnosno šifrira pomoću unaprijed dogovorenog ključa. Tako šifrirana poruka se naziva šifrat (eng. ciphertext) i ona se šalje putem nesigurnog komunikacijskog kanala. Primalac nakon što primi poruku putem ključa dešifrira poruku, te tako dobiva izvorni otvoreni tekst. Umeđuvremenu, ukoliko postoji treći entitet koji želi naštetiti komunikaciji (primjerice pročitati poruku) on će ukoliko ne zna ključ moći vidjeti sadržaj šifrirane poruke, ali neće moći odrediti njen izvorni oblik[3].
Kriptografski algoritam je matematička funkcija koju koristimo za kriptiranje i dekriptiranje, odnosno to su dvije funkcije od kojih jedna obavlja posao kriptiranja a druga dekriptiranja. Te se funkcije odabiru iz određene skupine funkcija ovisno o ključu. Također imamo prostor ključeva koji predstavlja skup svih mogućih vrijednosti ključeva.
Kriptosustavi se u pravilu klasificiraju u skladu sa slijedećim kriterijima[4]:
- Tip operacija koje se koriste pri šifriranju
Pod ovom kategorijom su dvije podjele: supstitucijske šifre i transpozicijske šifre. Kod supstitucijskih šifri se svaki element otvorenog teksta zamijenjuje s nekim drugim elementom, dok kod transpozicijskih šifri se elementi otvorenog teksta permutiraju odnosno premještaju.
- Način na koji se obrađuje otvoreni tekst
Ova se kategorija dijeli na blokovne šifre i protočne šifre. Kod blokovnih šifri se obrađuje jedan po jedan blok elemenata otvorenog teksta korištenjem istog ključa, dok se kod protočnih šifri elementi otvorenog teksta obrađuju jedan po jedan korištenjem niza ključeva koji se paralelno generira.
- Tajnost i javnost ključa
Unutar ove kategorije postoje dvije podjele: simetrični ključevi i kriptosustavi s javnim ključem. Kod simetričnih sustava ključ za dešifriranje se može izračunati poznavajući ključ za dešifriranje i obratno, ali je bitno kako sigurnost takvih sustava leži u tajnosti ključa pa se tako ti sustavi još nazivaju i kriptosustavi s tajnim ključem. Kod kriptosustava s javnim ključem još zvanih i asimetričnih kriptosustava, ključ za dešifriranje se u nekom razumnom vremenu ne može izračunati iz ključa za šifriranje. Kod ovakvih sustava je ključ za šifriranje javan, te svatko njime može šifrirati poruku dok ju jedino entitet koji posjeduje tajni, odnosno privatni ključ može dešifrirati.
Kao osnova kriptografije su osnovni kriptografski alati, odnosno Cryptographic primitives[5], kao dobro uspostavljeni kriptografski algoritmi niže razine koji se učestalo koriste za igradnju sustava za računalnu sigurnost. To zapravo znači da se prilikom izgradnje sustava zaštite programeri koriste ovim algoritmima kao osnovama i temeljima za daljnju izgradnju kompleksnijeg sustava budući da su osmišljeni na način da izvršavaju jednu određenu radnju ali sa visokim postotkom pouzdanosti. Postoji nekoliko osnovnih kriptografskih primitiva poput hash funkcija, blok šifri i protočnih šifri.
Ovi se algoritmi procjenjuju prema nekoliko kriterija:
- Stupanj sigurnosti, budući da je to često teško odrediti on se definira nekom gornjom granicom vezanom za količinu rada potrebnog za osvajanje nekog cilja.
- Funkcionalnost, ovi se algoritmi u konačnici kombiniraju kako bi se postigli razni sigurnosni ciljevi, stoga funkcionalnost prikazuje koji od ovih algoritama prema svojim svojstvima najviše odgovara zadanom cilju.
- Metode rada, prikazuju kako algoritmi ovisno o ulaznim podacima i primjenama u različitim situacijama ostvaruju različite funkcionalnosti, odnosno način rada.
- Učinak, prikazuje učinkovitost pojedinog algoritma u nekom određenom načinu rada.
- Lakoća implementacije, se odnosi na stupanj težine integracije algoritma u praktičnu primjenu.
--Jelena Valčić 20:17, 19. siječnja 2013. (CET)
Algoritmi sa asimetričnim ključem
Asimetrično kriptiranje je sustav koji se odnosi na posjedovanje dva ključa za svaku osobu, jedan javni, a drugi tajni. Ta dva ključa su povezana matematičkom funkcijom, i generirani su od istog algoritma, koji vraća dva povezana ključa. Javni ključ služi za kriptiranje poruke, i pomoću njega se ne može dekriptirati poruka zaključana tim istim javnim ključem. Takva poruka se može dekriptirati samo odgovarajućim tajnim ključem. Budući da su ti ključevi matematički povezani, isto vrijedi i suprotno, poruka kriptirana tajnim ključem se može dekriptirati javnim ključem. Ovo se u praksi ne radi, jer javni ključ je najčešće dostupan svima, te bi svi mogli pročitati tu poruku.
Ovakav pristup kriptiranju omogućuje sigurnu razmjenu informacija između dvije strane, bez da se prije toga mora razmijeniti ključ (kao kod simetričnog kriptiranja). Štoviše, ovim putem se najčešće i šalje ključ koji se koristi u simetričnom kriptiranju.[6]
Osnovni algoritam rada
- Boris ima svoj privatni i svoj javni ključ, te javni ključ od Nataše. Nataša ima svoj privatni i javni ključ, te javni ključ od Borisa.
- Boris želi poslati poruku Nataši, te kriptira tu poruku Natašinim javnim ključem.
- Natasha prima tu poruku, dekriptira tu poruku svojim privatnim ključem.
- Zatim kriptira svoj odgovor Borisevim javnim ključem, te mu šalje tu kriptiranu poruku.
- Boris dekriptira tu poruku svojim privatnim ključem, te je razmjena gotova.
Jednostavni grafički primjer:
Praktična uporaba
Ovaj algoritam se u praksi intezivno koristi, radi toga što nije potrebno prethodno razmijeniti nikakve informacije (kao što kod simetričnog moramo razmijeniti tajni ključ), te se vrlo lako može uspostaviti veza. Jedan od najčešćih primjena ovog algoritma je Diffie-Hellmanova razmjena ključeva. U toj razmjeni Boris uzima svoj privatni ključ i Natašin javni ključ, te ih spaja i time dobije jedan unikatan ključ. Nataša ponavlja isti proces sa svojim privatnim ključem, i Borisevim javnim ključem. Budući da su ti parovi ključeva međusobno povezani matematički, rezultirajući ključevi će se podudarati. Time su Boris i Nataša stvorili unikatan simetričan ključ, pomoću kojeg mogu razmijenjivati poruke bez sa totalnom sigurnošću, pod uvjetom da netko ne sazna jedan od njihovih privatnih ključeva.[7]
Autentifikacija
Autentifikacija kod ovakvog načina razmjene poruka se vrši digitalnim potpisom. Digitalni potpis je metoda verifikacije poruke koja se također vrši sa parom ključeva. Ako Nataša želi poslati potpisanu poruku m Borisu, njen javni ključ označimo kao (n, e), a eksponent dekriptiranja sa d, tada se potpisana poruka izračunava primjenom dekriptirajućeg algoritma na poruku m, i dobivamo s = m^d kao potpisanu poruku. Tada Boris preuzima tu poruku skupa sa njenim potpisom (m, s), i koristeći Natašin javni ključ e izračunava s^e. Ako je s^e jednak poruci m koju je dobio, to znači da je poruka prenesena bez greške, i da je ispravna. Primjenom digitalnom potpisa prije kriptiranja poruke javnim ključem od osobe kojoj želimo poslati poruku se istovremeno zaštiti i potpiše poruka, čime se osigurava da osoba kojoj šaljemo poruku može biti sigurna da smo to mi.[8]
Primjena u praksi
Ova vrsta enkripcije se koristi u mnogim tehnologijama, pa ćemo navesti samo par poznatijih: TLS, PGP i GPG.
TLS (Transport Layer Security) je protokol koji osigurava sigurnost na transportnoj razini u mreži.[9] TLS radi na slijedećem principu:- Server i klijent uspostave komunikaciju
- Klijent generira tajnu (pre-master secret), i šalje tajnu pomoću asimetričnog kriptiranja serveru
- Servera iz tajne generira glavnu tajnu (master secret), za to vrijeme klijent također generira glavnu tajnu, pomoću istog algoritma
- Budući da sad i klijent i server posjeduju istu tajnu, pomoću nje generiraju isti ključ, što je ključ koji će se upotrebljavati u simetričnom kriptiranju pri komunikaciji između servera i klijenta
- Server i klijent jedno drugom šalju povratnu informaciju o uspješnoj uspostavi simetričnog ključa, te se daljnja komunikacija odvija simetričnim kriptiranjem
PGP koristi sličan princip, gdje se generira simetrični ključ koji vrijedi samo za trenutnu sesiju, i šalje se pomoću asimetričnog kriptiranja, ali inkorporira sustav provjere i certifikacije javnih ključeva, gdje se može pratiti tko je sve potpisao određeni javni ključ, te time i vjerodostojnost tog javnog ključa. Najčešće se traže potpisi vjerodostojnih entiteta, sve do najviše razine, na kojoj se nalaze posebne organizacije koje izdaju certifikate za javne ključeve.[10]
GPG je PGP sustav koji se nalazi pod GNU General Public License.[11]
--Branimir Jurić 22:25, 20. siječnja 2013. (CET)
Algoritmi sa simetričnim ključem
Kriptiranje sadržaja simetričnim ključem osigurava korisnicima tajnost podataka. Za primjer uzmimo dvije osobe, Alice i Bob koji nastoje komunicirati. Treća strana (Ivan) koja presreće njihove poruke ne bi trebala saznati ništa korisno iz njihovog sadržaja, što je bit kriptiranja općenito. Kako bi osigurali siguran komunikacijski kanal, Alice i Bob se prvo moraju složiti oko nekog ključa k. Ovaj dijeljeni ključ k mora biti tajan. Prije nego što pošalje poruku m (message) Bobu, Alice kriptira m koristeći algoritam E i ključ k. Dobije kriptotext (eng. ciphertext) c = E (k,m) te pošalje c Bobu. Koristeći dekripcijski algoritam D i isti ključ k, Bob dekriptira c te tako dolazi do izvornog teksta (eng. plaintext) m = D (k,c). Iz ovoga primjera se vidi zašto se ovaj tip kriptiranja naziva simetričnim – obje strane koriste isti ključ, k za kriptiranje i dekriptiranje sadržaja. Algoritmi kriptiranja E i dekriptiranja D su javno poznati te svi mogu dekriptirati kriptotekst ukoliko poznaju ključ. Ukoliko Alice i Bob žele da njihova poruka ostane tajna, moraju nekako zadržati ključ k tajnim. Na sljedećoj slici je vidljivo kako bi to pojednostavljeno izgledalo:
Upravo tu leži glavni problem simetričnog ključa, Alice i Bob se moraju složiti oko ključa k na siguran i efikasan način. Za razmjenu ključa potrebne su metode kriptografije javnog ključa, o kojima nešto kasnije.
Potrebno je da se kriptirani tekst m može na jedinstveni način dobiti iz kriptoteksta c, što znači da za ključ fiksne duljine k, mapa kriptiranja mora biti bijektivna (injektivna i surjektivna), što bi (matematički govoreći) izgledalo ovako:
E∶KxM→C
takav da je za svaki k∈K mapa
E_k ∶M→C,m→E(k,m)
invertibilna.
Elementi m∈M predstavljaju poruke (plaintext). C je set kriptotekstova ili kriptograma, elementi k∈K su ključevi. E_k se naziva funkcija kriptiranja sa obzirom na ključ k. Inverzna funkcija D_k≔E_k^(-1) se zove funkcija dekripcije. Pretpostavlja se da efikasni algoritmi koji računaju spomenute funkcije postoje.
Osnovi sigurnosni zahtjev za mapu kriptiranja E je da , bez poznavanja ključa k, ne bi smjelo biti moguće uspješno izvršiti funkciju dekripcije.
Od svih algoritama kriptiranja, algoritmi sa simetričnim ključem se najbrže implementiraju hardverski i softverski. Upravo iz tog razloga se koriste za kriptiranje velike količine podataka. Da bi Alice i Bob sigurno razmjenili poruke, moraju prvo razmijeniti ključ k preko sigurnog komunikacijskog kanala, za što se često koriste metode kriptiranja sa javnim ključem. Iz ovoga zaključujemo da se te dvije spomenute metode trebale koristiti zajedno kako bi izgradili praktične kriptosustave.
Kada se govori o algoritmima kriptiranja sa simetričnim ključem, obično se spominju blok šifre i stream šifre. Funkcija kriptiranja koja koristi blok šifru obrađuje tekst fiksne duljine dok stream šifra radi na slijedu (toku) teksta obrađujući znak po znak kriptira tekst proizvoljne duljine. Ukoliko tekst prelazi veličinu bloka u blok šifri, koriste se razne operacije od kojih neke koriste i stream šifre. --Ljubarac 19:45, 19. siječnja 2013. (CET)
Blok šifre
Blok šifra koristi tajni ključ k binarne duljine r, algoritam kriptiranja E kriptira blokove teksta m fiksne binarne duljine n te rezultirajući blokovi kriptoteksta c = E (K,m) također imaju duljinu n. n se naziva blok duljina šifre. Tipične blok duljine su 64 (DES) ili 128 (AES), tipična duljina ključa je 56 (DES), 128, 192, 256 (AES) ili 512 (SHACAL2).
Pogledajmo sada blok šifru E sa duljinom bloka n i ključem duljine r. Postoji 2^n blokova teksta te 2^n blokova kriptoteksta duljine n. Za ključ fiksne duljine k, funkcija kriptiranja Ek : m -> E (k,m) mapa {0,1}^n bijektivnih sa {0,1}^n je permutacija (mapa f : D -> D se naziva permutacija od D ukoliko je f bijektivan) od {0,1}^n. Dakle, izabrati ključ k znači izabrati permutaciju od Ek od {0,1}n te se zatim ta permutacija koristi da se kriptiraju blokovi teksta. 2n permutacija Ek , sa k koji prolazi kroz set od {0,1}r ključeva, formiraju gotovo zanemarivo mali podset u velikom setu svih permutacija {0,1}^n, koji se sastoji od 2^n! elemenata. Zato se nasumično bira r-bitni ključ k za E te se zatim ograničava selekcija permutacije kriptiranja na ekstremno mali podset. Iz prethodnoga bi trebali moći zaključiti da ne možemo imati idealnu blok šifru sa savršenom tajnošću u praksi. Maksimalna razina sigurnosti blok šifre znači i maksimalnu slučajnost (dok se bira slučajni bit ključa), što znači da, dok biramo ključ, moramo uzeti slučajni element iz seta svih permutacija od {0,1}n. Ovo se u praksi pokazalo iznimno nepraktično, što i (napokon) ima nekog smisla. Mogli bi pokušati pobrojati sve permutacije te onda nasumično uzeti indeks (koji bi bio ključ).
Prisjetimo se da postoji 2^n! permutacija, što bi značilo da moramo negdje spremiti sve te brojeve. Za blok šifru duljine n od 64 bita, trebali bi 267 byteova da bi spremili jedan ključ, što je izrazito nepraktično (gotovo nemoguće). U praksi se stoga ograničavamo na mnogo manje ključeve i biramo permutaciju kriptiranja Ek za ključ k iz mnogo manjeg seta od 2r permutacija, sa r koji je obično u rasponu od 56 do 256. Ideja je i dalje ista – doći do funkcije kriptiranja koja se ponaša kao nasumično izabrana funkcija za jako veliki set svih permutacija. Najpoznatiji algoritmi sa blok šifrom su DES (3DES) te AES koji se ovdje neće detaljno spominjati. --Ljubarac 19:45, 19. siječnja 2013. (CET)
Protočne šifre (stream ciphers)
Generator slučajnih brojeva (eng. random generator) je drugi osnovni kriptografski primitiv. Poznad je i pod nazivom keystream generator ili stream cipher (protočna šifra). Također je i slučajna funkcija, ali za razliku od hash funkcija ima manji ulaz i duži izlaz. Na konceptualnoj razini, stream šifru promatramo kao pronalazak slučajnih brojeva čija je duljina fiksna dok je duljina izlaza dugački niz bitova, poznat kao keystream. U praksi se može koristiti kako bi se jednostavno zaštitila povjerljivost backup podataka; iskoristimo generator toka ključeva, upišemo ključ, dobijemo datoteku sa slučajnim bitovima, i XOR-amo ih sa izvornim tekstom da bi dobili kriptotekst. Ukoliko trebamo doći do izvornih podataka, vratimo se do generatora, unesemo isti ključ, dobijemo datoteku sa slučajnim podacima, XOR-amo ih sa kriptotekstom i dobijemo izvorni tekst. Matematički, protočne šifre bi se definirale kao:
Neka je K set ključeva i M set izvornih tekstova. U ovom kontekstu, elementi M se nazivaju znakovima. Protočna šifra (stream cipher)
E* ∶ K* x M*→ C*,E* (k,m)≔c≔c_1 c_2 c_3…
kriptira tok (eng. stream) m := m1 m2 m3... ∈ M* znakova izvornog teksta m_i ∈ M kao tok c∶= c_1 c_2 c_3… ∈ C* znakova kriptoteksta c_i ∈ C koristeći tok ključeva (keystream) k∶= k_1 k_2 k_3… ∈ K*),k_i ∈ K.
Tok izvornog teksta se kriptira znak po znak. Za ovu svrhu postoji mapa kriptiranja
E ∶ KxM→C,
koja kriptira jedan znak izvornog teksta mi sa odgovarajućim znakom ključa k_i
c_i=E(k_i,m_i ),i=1,2,3…
Obično su znakovi iz M i C te elementi ključa K binarne znamenke. Dekriptiranje se također vrši znak po znak koristeći funkciju dekripcije D sa istim tokom ključeva (keystream) koji se koristio za kriptiranje. Većina protočnih šifri koristi binarni XOR operator. --Ljubarac 19:45, 19. siječnja 2013. (CET)
RC4
RC4 je jedna vrsta protočnih šifri, također veoma popularna, razvijena od Ron Rivesta iz RSA Data Security Inc. Koristi se u sklopu brojih aplikacija, a jednu od najvažnijih uloga ima u SSL-u koji se koristi za sigurnost većine svjetskog elektroničkog poslovanja preko interneta. Također je primjenu našao i u WEP-u, IEEE-ovom standardu za sigurnost bežične mreže, te u aplikacijama koje uključuju e-mail kriptiranje.
RC4 je binarno dodavajuća protočna šifra. Koristi ključ varirajuće veličine u rasponu od 8 do 2048 bita u višekratnicima od 8 bita. To zapravo znači da je srž algoritma sadržana u funkciji koja generira tok ključeva. Ta funkcija generira sekvencu bitova koji se kombiniraju sa otvorenim tekstom pomoću XOR metode. Dekripcija funkcionira na način da se regeneriratok ključeva koje se zatim putem XOR metode kombinira sa kriptiranim tekstom. Drugi bitan dio algoritma je inicijalizacijska funkcija koja prihvaća ključ varirajuće veličine, te ga koristi kako bi inicijalizirala početno stanje generator toka ključeva. Ta se funkcija još naziva algoritam rasporeda ključeva.
Ovaj algoritam je zapravo skup algoritama koji za parameter imaju veličinu bloka, gdje je taj n parameter veličina riječi za taj algoritam. Preporučeno je da on bude jednak 8, doduše za svrhe analiziranja može biti i manji, a ukoliko se želi dodatna sigurnost taj se parameter može i povećati. Unutarnja stanje RC4 algoritma se sastoji od tablice veličine 2^n riječi i dva brojača koji su veličine jedne riječi. Tablica se zove S-box, te uvijek sadrži permutaciju mogućih 2^n vrijednosti riječi[12].
U nastavku je prikazan algoritam rasporeda ključa u RC4. Unutar algoritma varijabla S predstavlja S-box tablicu, K je skup ključeva dok su i i j brojači. Algoritam prihvaća kao ulazni podatak ključ koji je pohranjen u K i duljine je l bajtova. Zatim započinje permutaciju identiteta u S, te korištenjem ključa neprestano zamijenjuje vrijednost kako bi dobio nove nepoznate permutacije koje su ovisne o ključu[13].
Inicijalizacija:
For (i = 0 do 2n – 1)
S[i] = i
j = 0
Izmjena:
For ( i = 0 do 2n – 1)
j = j + S[i] + K[i mod l]
Zamijeni(S[i], S[j])
Generator toka ključeva unutar RC4 je prikazan slijedećim pseudokodom. On neprestano izmjenjuje premutacije pohranjene unutar varijable S u svakom slijedećem krugu birajući drugačiju vrijednost iz S permutacija kao izlaznu informaciju. Jedna iteracija RC4 algoritma kao izlaz daje n bitnu riječ kao tok ključeva koji se tada može pomoću XOR metode kombinirati sa otvorenim tekstom kako bi se dobio kriptirani tekst[14].
Inicijalizacija:
i = 0
j = 0
Generirajuća petlja:
i = i + 1
j = j + S[i]
Zamijeni(S[i], S[j])
Izlaz z = S[ S[i] + S[j] ]
U svakoj iteraciji pseudo-slučajni generator se povećava za vrijednost i i traži i-ti element unutar S, odnosno S[i] te ga zbraja sa j. Zatim zamjenjuje vrijednosti S[i] i S[j] i zbroj vrijednosti S[i] + S[j] (modulo 256) koristi kao indeks kako bi dohvatio treći element od S (vrijednost toka ključeva K) koji se zatim metodom XOR kombinira sa slijdećim bajtom poruke kako bi dobio slijedeći bajt otvorenog teksta ili kriptiranog teksta. Tokom ovog procesa se svako element od S zamijenjuje sa nekim drugim elementom barem jednom unutar 256 iteracija[15].
Ključne stvari kod RC4[16]:
- Bitno je primjetiti kako se primjerice kako je snaga RC4 kod S jer započinje kao permutacija 2n mogućih riječi i jedina operacija nad S je Izmijeni ona ostaje permutacija, ali ono bitno je da se ta permutacija s vremenom mijenja.
- Unutarnje stanje se pohranjuje u M = n2^n + 2n bita. A kako je S permutacija to stanje može efektivno pohraniti približno 1700 bita informacija (log2(2n!)).
- Zanimljivo je to što ukliko je u danom trenutku poznato cijelu unutarnje stanje M dovoljno je da bi se moglo predvidjeti sav tok ključeva u budućnosti, što dovodi do toga da ukoliko je poznato cijelo početno stanje dovoljno je da se predvidi sav tok ključeva i time učinkovito probity RC4.
- Također, kako je početno stanje ovisno jedino o ključu K znajući taj ključ isto je dovoljno za probijanje RC4.
- Iako je algoritam rasporeda ključeva (skraćeno KSA) obostran, odnosno reverzibilni teško je odrediti K iz početnog stanja S.
- Ključe je ono što jednistveno i potpuno određuje tok ključeva.
- Period RC4 je teško predvidjeti i ovisan je o ključu, doduše postoje empirijski dokazi kako je taj period uglavnom veoma dug.
import sys
#KSA - Key-Scheduling Algorithm (wiki)
def KSA(kljuc):
duljina_kljuca = len(kljuc) #predstavlja broj bajtova u kljucu
S = range(256) #postavljanje permutacija identiteta
j = 0
for i in range (256):
j = (j + S[i] + kljuc[i % duljina_kljuca]) % 256
S[i], S[j] = S[j], S[i] #zamjena vrijednosti
return S
#PRGA - Pseudo-Random Generation Algorithm (wiki)
def PRGA(S):
i = 0
j = 0
while True:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i] #zamjena vrijednosti
K = S[(S[i] + S[j]) %256] #bajt toka kljuceva
yield K #yield se ovdje koristi jer je pogodniji za generatore
def RC4(kljuc):
S = KSA(kljuc)
return PRGA(S)
def konverzija_kljuca(v_k):
return [ord(c) for c in v_k]
def kriptiraj(text, k):
kljuc = konverzija_kljuca(k)
tok_kljuceva = RC4(kljuc)
for c in text:
sys.stdout.write("%02X" % (ord(c) ^ tok_kljuceva.next()))
print
Kod se temelji na primjeru implementacije koji se može naći na RC4 wiki[17] i Learning Python by example: RC4[18] te prikazuje jednostavno korištenje RC4 algoritma za kriptiranje, također su se koristili testni podaci priloženi na wiki stranici:
Ključ | Tok ključeva | Otvoreni tekst | Kriptirani tekst |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Izvorni kod se može naći ovdje[19] --Jelena Valčić 21:02, 19. siječnja 2013. (CET)
Ranjivosti šifri sličnih RC4
Šifre slične RC4 su ranjive na niz problema već po svom dizajnu. Neke od njih su već spomenute u prethodnom tekstu, ovdje su objašnjene ostale šifre.
Ranjivosti temeljene na PRG algoritmu
PRG algoritam generira ključeve koji se koriste u RC4 algoritmu. Budući da je taj algoritam jednostavan, postoji nekoliko načina za probijanje šifre.
Pogađanje stanja
Pogađanje stanja se bazira na tome da se pogodi mali dio početnog stanja RC4 generatora ključa (PRG), te da se paralelno vrti algoritam. Ako u bilo kojem trenutku dođe do kontradikcije u dobivenim ključevima (ključ koji je izgenerirao RC4 je drukčiji od ključa kojeg mi usporedno generiramo), moguće je otkriti gdje je greška u inicijalnoj pretpostavci, i krenuti ispočetka sa ispravljenom greškom. Nakon određenog broja prolaza se otkrije početni ključ, a dalje je trivijalno naći bilo koju izvedenicu.
Pristranost prema drugom byteu
Ako je treći byte orginalnog stanja nula, a drugi byte nije 2, tada je vjerovatnost da je drugi byte u šifri jedan 0 duplo veća nego što bi trebala biti (1/128 umjesto 1/256). To znači da ako je vrijednost drugog bytea jednaka nula, može se pretpostaviti vrijednost trećeg byte početne vrijednosti sa vjerovatnošću 1/2, što se onda može iskoristiti za pogađanje stanja.[20]
Ranjivosti temeljene na ključu
Neke ranjivosti iskorištavaju ključeve koji se koriste u RC4 algoritmima, da probiju šifru preko nekih njihovih svojstava.
Analiza sličnih ključeva
Neki ključevi su povezani na određeni način, te daju sličan izlaz za prvih par izlaznih byteova. To je dokazano tako da se uspoređuju dva ključa, koji se razliku u samo jednom byteu (t). Dok god radimo t-1 iteracija, ključevi i stanje će biti isti. Tek na t koraku će se izmjeniti stanja, i razlikovat će se u dva bytea. Ako se t nalazi u početnih par byteova, tada će se stanja jako brzo razlikovati, ali ako se t nalazi pri kraju 2n, tada će se početna stanja podudarati u većinskom dijelu.
Pristranost izlaza prema ključu
Određeni ključevi su okarakterizirani kao slabi, to jest, da imaju neka svojstva koja ih čine ranjivima na napade. Dio takvih slabih ključeva je takvog oblika da neki njihov podset potpuno određuje podset izlaznih bitova. Za određene vrijednosti takvih ključeva čak možemo dobiti i da njihov određen podset potpuno određuje veliku većinu bitova izlaznog stanja.[21]
Ranjivosti temeljene na inicijalizacijskom vektoru (WEP)
WEP koristi IV (inicijalizacijski vektor) od 3 bytea, koji se dodaje ključu da stvori sesijski ključ. Prilikom razmjena podataka između wireless routera i klijenta podatci se šifriraju sa RC4 algoritmom, koji uzima sesijski ključ. Budući da sesijski ključ sadrži IV, razumno je pretpostaviti da će se IV slati mnogo puta, ako postoji nekakav promet sa routerom.
Ako pretpostavimo da se IV konstatno mijenja, to ne predstavlja nikakav problem. Ali kod WEP-a to nije slučaj. Inicijalizacijski vektor je najčešće uvijek isti, nekad čak i na različitim routerima (ovisi o proizvođaču). Pod pretpostavkom da se podatci konstatno razmjenjuju, to znači imamo 24 bita (3 bytea) ključa koji su uvijek konstatni u svakom paketu. Nakon presretanja dovoljnog broja poruka se može odrediti koji su to točno dijelovi paketa.
IV se automatski stavlja uvijek na isto mjesto, ili na početak ili na kraj tajnog ključa.
Tada se jako lako može prethodnim metodama pronaći cijeli ključ, a preko njega i početno stanje, što je u ovom slučaju lozinka za pristup mreži.
Ovaj propust se lako rješava, hashiranjem IV sa ključem, umjesto da se IV samo dodaje na ključ.
--Branimir Jurić 22:25, 20. siječnja 2013. (CET)
Ispravno korištenje šifri nalik RC4
Korištenje šifri nalik RC4 (i same RC4 šifre) sigurno je problematično. Ne možemo biti potpuno sigurni kako bi općenito upotrebljavali RC4, zbog teoretskih slabosti koje su objašnjene u prethodnim poglavljima. Ipak, RC4 i druge šifre nalik RC4 je moguće koristiti ispravno. Počnimo od najjednostavnijih problema koji se susreću pri korištenju PRG-baziranih šifri (pseudo random generator) nalik RC4. Očito je da se ne smije koristiti isti tok ključeva (keystream) da se kriptiraju dvije različite poruke.
Problem sa PRG baziranim šiframa
Iako je prethodno možda i (pre)očito, Microsoft je učinio upravo to u Office paketu 2007. godine [22], kriptirajući više verzija Word dokumenta sa istim ključem. Ukoliko se baš mora koristiti isti ključ, rješenje je kombinirati ga sa inicijalizacijskim vektorom (IV) ili „nonce“ [23]. Naravno, to može također biti problematično, kao kod WEP-a[24]. Još jedan veliki problem je – ukoliko se obrne bit u RC4 kriptotekstu, isti bit u dekriptiranom izvornom tekstu će se također obrnuti što može voditi do praktičnih „padding-oracle“ [25] napada koji kompromitiraju sigurnost kriptosustava. Rješenje ovog problema bi bilo korištenje MAC-a (eng. message authentication code) na kriptotekstu kako bi se isti autentificirao.
Problem sa Key Scheduling Algoritmom (KSA)
Navjeći problem KSA algoritma RC4 šifre je njegova jednostavnost. Pogledajmo jednu implementaciju:
for i from 0 to 255
S[i] = i endfor
j = 0
for i from 0 to 255
j = (j + S[i] + key[i mod keylength]) mod 256
swap values of S[i] and S[j]
endfor
KSA se koristi kako bi se inicijalizirana permutacija u listi S. Duljina ključa (keylength) se definira kao broj byteova u ključu i može biti u rasponu od 1 do 256, tipično između 5 i 16, što odgovara duljini ključa 40-128 bitova. S se obrađuje kroz 256 iteracija na način prikazan u kodu. KSA jednostavno nije dovoljno nepredvidljiv. Usporedimo to sa novim špilom karata. Počevši od nepromiješanog špila, sistematski radimo od vrha prema dnu mijenjajući poziciju svake karte sa drugom kartom u špilu. Pozicije koje se mijenjaju su određene sa nekoliko jednostavnih računskih operacija koje uključuju vrijednost originalne karte i kriptografski ključ. Ukoliko se isto napravi sa pet špilova karata, dobije se nešto slično RC4 KSA.
Najpoznatiji napad na RC4 KSA
FMS (Fluhrer, Mantin i Shamir) napad se prvi put pojavio 2001. godine. Promatrao je KSA za koji je otkriveno da je za neke slabe ključeve prvi byte izlaza PRGA povezan sa byteovima ključa. Ovaj napad savršeno radi kod implementacija koje dodaju poznati inicijalizacijski vektor (IV) na WEP ključ. Promatrajući nekoliko milijuna IV-a , napadač može skupiti dovoljno tokova ključa (keystream) kako bi došao do šifre.
Rješenje problema FMS-a bi bilo:
- izbaciti prvih N byteova RC4 keystreama, 256 < N < 3072
- ne spajati (concat) IV sa ključem. Bolji pristup je hashirati IV i ključ
Efikasnost prve metode je diskutabilna. Drugu metodu je usvojio WPA-TKIP. Kao hash funkcija TKIP se nije pokazao najprikladnijim. Preporuka je da se za RC4 koristi bolji hash algoritam kao SHA-256 kako bi se hashirao IV i ključ.
Da li se šifre kao RC4 mogu koristiti ispravno?
Ukratko – mogu. Potrebno je koristiti dobru hash funkciju koja će hashirati inicijalizacijski vektor (IV) i ključ i/ili izbacivanje prvih N byteova i MAC. Ove mehanizme zaštite treba adekvatno koristiti kako bi bili efikasni. Držeći se osnovnih sigurnosnih preporuka te mehanizama zaštite, moguće je ispravno koristiti algoritme kao RC4. Pogledajmo jednostavnu implementaciju nekih od mehanizama zaštite (uz napomenu da je implementacija urađena samo za primjer, ima svoje greške i ne preporučujem da koristite sljedeći kod :D). Skripta je rađena u Python programskom jeziku.
def crypt(data, key):
j = 0
S = range(256)
for i in range(256):
j = (j + S[i] + ord(key[i % len(key)])) % 256
S[i], S[j] = S[j], S[i]
j = i = 0
out = []
for i in xrange(1024):
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
for char in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
out.append(chr(ord(char) ^ S[(S[i] + S[j]) % 256]))
return ''.join(out)
Prvi dio se odnosi na standardnu implementaciju RC4 algoritma koji je javan. Pseudokod i informacije o algoritmu su javno dostupne na wiki sustavu[26], a kako implementirati algoritam je tema koja je obrađena u jednom od prethodnih poglavlja. Funkcija crypt , dakle, sadrži KSA i PRGA RC4 algoritma koji su također obrađeni u jednom od prethodnih poglavlja. U sljedećem dijelu koda se nalazi funkcija encrypt koja prima dva argumenta: data (izvorni tekst, plaintext te key (ključ). Sve je base64 enkodirano radi jednostavnosti.
def encrypt(data, key, encode=base64.standard_b64encode, salt_length=16):
# HMAC za provjeru autenticnosti i integriteta podataka
# moze se i generirati slucajni mackey
# preporuka: ne koristiti isti kljuc za kriptiranje i mac!
# ovdje se koristi. neka je.
mackey = key
salt = os.urandom(salt_length) #random salt duljine 16
# Hash SHA512
key = hashlib.sha512(key + salt).digest() #hashiramo kljuc zajedno sa salt
# kriptiranje
data = chr(salt_length) + salt + crypt(data, key) #nisam siguran da je ok
if encode:
data = encode(data)
# HMAC (sha512)
check = hmac.new(mackey, data, hashlib.sha512).digest()
check = encode(check)
# print len(check) #da se sjetim duljine u base64 -.-
data = data + check
return data
Ovdje se koristi SHA512, salt duljine 16 te MAC (HMAC) mehanizam zaštite. HMAC se koristi za provjeru autentičnosti i integriteta podataka [27]. HMAC se dodaje na kraj hashiranih podataka te će se koristiti u decrypt funkciji. Odmah je moguće primjetiti i grešku - za HMAC se koristi isti ključ kao i za kriptiranje podataka RC4, što nikako nije preporučljivo. Sljedeća funkcija služi kako bi se sadržaj dekriptirao:
def decrypt(data, key, decode=base64.standard_b64decode):
mackey = key
# 88 bytes za mac provjeru koji smo dodali na kraj (check)
# base64 encodano je 88 '-.-
mac = data [(len(data) - 88):] # koji dio podataka je check
data = data [0: (len(data) - 88)] # a koji zapravo podaci
# provjera HMAC
check = hmac.new(mackey, data, hashlib.sha512).digest() #ponovno racunanje provjere
mac = decode(mac) #dekodiranje iz base64 za provjeru
if check != mac: # ponovno kreirani mac razlicit od dohvacenog?
print 'Manipulirana poruka ili krivi kljuc!'
elif decode:
data = decode(data)
pos = ord(data[0]) + 1
salt = data[1:pos]
key = hashlib.sha512(key + salt).digest()
clear = crypt(data[pos:], key)
return clear
Računa se od koje pozicije se u podacima nalazi dodani HMAC kako bi se isti mogao usporediti sa ponovno izračunatim HMAC-om te vidjeti da li je došlo do manipulacije sadržajem ili je korišten krivi ključ. Zatim se podaci dekriptiraju te se vraća izvorni tekst. Cijelokupni izvorni kod sa licencom možete vidjeti ovdje: [28].
Još neke opće preporuke vezane uz korištenje stream šifri (ali i drugih):
- ne koristiti vlastite kriptografske funkcije, nikako. Postoji jako velika vjerojatnost da ćete nešto krivo napraviti. Preporuka je koristiti postojeće, provjerene sustave.
- ne koristiti ključeve sa lošom entropijom
- ne zaboraviti provjeriti poruku (npr. MAC)
--Ljubarac 19:45, 19. siječnja 2013. (CET)
WEP protokol
WEP protokol koristi RC4 za stvaranje šifrirane poruke. Izvorni kod cijelog WEP protokola se nalazi ovdje.[[29]]
Funkcije koje se koriste za RC4 protokol su opisane u gornjem tekstu. Funkcije koje su potrebne za WEP su slijedeće:
Dodaj IV
def dodaj_IV(kljuc):
import random
import string
for i in range(3):
znak = ord(random.choice(string.ascii_letters + string.digits))
IV.append(znak)
kljuc.append(znak)
return kljuc
Ova funkcija uzima ključ nakon što je već obrađen sa algoritmom za prijelaz u brojčane znakove, te generira nasumični ASCII znak, kojeg onda pretvara u brojčanu vrijednost. ASCII znakovno polje je uzeto radi jednostavnosti, funkcija može biti prilagođena da koristi sav raspon mogućnosti 24 bitnog zapisa.
Tako stvoreni IV se zatim dodaje u ključ (na kraju ključa u ovoj imeplementaciji), te se dodaju u polje IV, kojesluži za proslijeđivanje tog vektoru funkciji za dekriptiranje. Time se simulira generiranje istog IV-a od strane routera.
Kriptiraj
def kriptiraj(kljuc):
kljuc_kriptiraj = konvertiraj_kljuc(kljuc)
kljuc_s_IV = dodaj_IV(kljuc_kriptiraj)
keystream = RC4(kljuc_s_IV)
for slovo in plaintext:
cipher.append(ord(slovo) ^ keystream.next())
return cipher
Ova funkcija uzima ključ, pretvara ga u brojačanu vrijednost pomoću ord funkcije, te mu dodaje IV. Nakon što mu je dodan IV, proslijeđuje tako generiranu listu u RC4 algoritam, koji od koketaniranih IV i ključ polja stvara polje stanja, što je ujedno i ključ za šifriranje poruke.
Šifriranje
import sys
for slovo in plaintext:
cipher.append(ord(slovo) ^ keystream.next())
return cipher
Ova funkcija uzima poruku i generirani ključ za šifriranje, te ih XOR-a međusobno.
Dekriptiranje
def dekriptiraj(cipher):
dekript = []
kljuc_dekriptiraj = konvertiraj_kljuc(kljuc)
for znak in IV:
kljuc_dekriptiraj.append(znak)
keystream=RC4(kljuc_dekriptiraj)
procitano = []
for znak in cipher:
dekript.append(znak ^ keystream.next())
for znak in dekript:
procitano.append(chr(znak))
return ''.join(procitano)
Ova funkcija ima istu funkcionalnost kao i funkcija kriptiranja, ponovno prolazi kroz RC4 algoritam koristeći ključ (lozinku za wireless pristup) i proslijeđeni IV vektor (na taj način simuliramo generiranje istog IV-a od strane routera).
--Branimir Jurić 23:25, 20. siječnja 2013. (CET)
Sources
- S. Mister, S.E. Tavares, Cryptanalysis of RC4-like Ciphers, Queen's University, Kingston dostupno 19.1.2013. na http://www.n-pn.info/repo/MadChat/crypto/codebreakers/Y_23_rc4_cryptana.pdf
- Stream Ciphers, dostupno 19.1.2013. na http://www.cryptosmith.com/book/export/html/16
- Hongjun Wu, The Misuse of RC4 in Microsoft Word and Excel, Institute for Infocomm Research, Singapore, dostupno 19.1.2013. na http://eprint.iacr.org/2005/007.pdf
- Security Engineering, Ross Anderson, Wiley, dostupno 19.1.2013. na http://www.cl.cam.ac.uk/~rja14/book.html
- Lecture Notes on Stream Ciphers and RC4, Rick Wash, dostupno 19.1.2013. na http://rickwash.net/papers/stream.pdf
- Handbook of Applied Cryptography, A. Menezes, P. van Oorschot, S. Vanstone, dostupno 19.1.2013. na http://web.archive.org/web/20050305140333/http://www.cacr.math.uwaterloo.ca/hac/about/chap1.pdf
- Kriptografija, Andrej Dujella, dostupno 19.1.2013. na http://web.math.pmf.unizg.hr/~duje/kript/osnovni.html
- Learning Python by example: RC4, Chris Leary, dostupno 19.1.2013. na http://blog.cdleary.com/2009/09/learning-python-by-example-rc4/
- RC4, Wikipedia, dostupno 19.1.2013. na http://en.wikipedia.org/wiki/RC4
- WEP, Wireless Security - How WEP works, dostpuno 20.1.2013 na http://palizine.plynt.com/issues/2006Dec/wep-encryption/
- H. Delfs, H.Knebl, Introduction to Cryptography, Springer, 2007.
Ljubo Barać, Branimir Jurić, Jelena Valčić