PHP krypto 3 - Asymmetrisk kryptering

Tags:    php sikkerhed kryptering
Skrevet af Robert Larsen @ 22.04.2012

Introduktion


Sidste artikel handlede om symmetrisk kryptografi, også kendt som secret key kryptografi, og det næste logiske skridt er asymmetrisk kryptografi også kendt som public key kryptografi.

Med asymmetrisk kryptografi skal afsender og modtager blive enige om en nøgle, som de vil bruge i deres hemmelige kommunikation. Er afsender og modtager den samme (f.eks. hvis vi vil kryptere vores egne data, så kun vi selv kan læse dem), er det intet problem, men hvis nu vi vil kommunkere sikkert med vores bank eller en samarbejdspartner på den anden side af jorden, så har vi et problem.

Sender vi nøglen over internettet, så passerer den forbi en masse routere og gateways. Kan vi stole på, at vores internet service udbyder ikke lytter med ? Hvad med hackerne, som måske har adgang til systemerne ?

Det svarer lidt til at vi råber nøglen til modtageren på den anden side af gaden. Alle i nærheden kender nu nøglen.

Heldigvis har nogen kloge hoveder fundet matematiske operationer, som gør det muligt at kryptere med én nøgle og dekryptere med en anden. Jeg og min samarbejdspartner finder altså hver vores eget personlige nøglepar, og så udveksler vi de offentlige nøgler, så jeg kender min partners offentlige nøgle, og han kender min.

Det gør resten af verden så måske også, men de kan kun bruge den til at kryptere med. Vi skal holde den anden halvdel, altså nøglen som kan dekryptere, hemmelig. Faktisk findes der servere, hvor man kan lægge sin offentlige nøgle, så andre let kan finde den. Min nøgle kan I finde her:
http://pgp.mit.edu:11371/pks/lookup?op=vindex&search=0xCC331E8AC16A1996

I kan kryptere med den, men kun jeg har den tilhørende private nøgle, så ingen andre end mig kan dekryptere dataene.

Public key kryptografi


Public key kryptografi gør det altså nemmere at udveksle nøgler, men har vi så stadig brug for secret key algoritmerne ?

Det har vi i høj grad, for public key algoritmerne har deres svagheder, nogle af dem er:
* Krypterede data kommer til at fylde mere
* Algoritmerne er betydeligt langsommere end private key

Grundet ovenstående svagheder bruger man faktisk ikke public key algoritmerne til at kryptere data. Man bruger dem til at kryptere nøgler.

Hybride kryptosystemer


Et hybridt kryptosystem benytter sig af både public key og secret key algoritmerne. Når man skal beskrive, hvordan kryptosystemer virker, bruger man ofte de tre fiktive personer Alice, Bob og Eve.

Alice og Bob vil kommunikere hemmeligt med hinanden, og Eve kan lytte med.

1) Alice opretter et nøglepar og sender Bob sin offentlige nøgle.
2) Bob genererer en tilfældig hemmelig nøgle.
3) Bob krypterer denne nøgle med Alices offentlige nøgle og sender den til hende
4) Alice dekrypterer den hemmelige nøgle med sin private nøgle.
5) Alice og Bob kender nu begge den hemmelige nøgle og bruger den fremover sammen med en secret key algoritme til at kommunikere hemmeligt

Da Bob sendte den krypterede nøgle til Alice, stod Eve i nærheden og lyttede med, så hun har også en kopi, men hun har ikke adgang til Alices private nøgle, så hun kan ikke dekryptere den.

På denne måde kan vi udnytte de forskellige algoritmers fordele og undgå deres ulemper. Var der flere parter, som skulle være med i den hemmelige samtale, så kan de alle sende deres offentlige nøgle til Bob, som så kunne sende dem hver den samme hemmelige nøgle krypteret med deres egen offentlige nøgle.

Der findes adskillige public key algoritmer, men jeg vil fokusere på RSA algoritmen, og denne gang bruger vi OpenSSL funktionerne.

Generering af nøglepar


Vi skal have lavet et nøglepar, som vi skal have gemt til senere brug, men først et ord om nøglestørrelser.

I sidste artikel sagde jeg, at 256 var en meget stor nøgle, og det er det også for symmetriske algoritmer, for der kan alle bitmønstre bruges og derfor er der 2 opløftet i 256 forskellige nøgler (et ét tal med 77 nuller). Sådan er det ikke for asymmetriske algoritmer. Asymmetriske algorimter bruger ikke et arbitrært bitmønster som nøgle men store tal med særlige egenskaber. En RSA nøgle består af tre meget store tal, som er fundet ved at udføre nogle matematiske operationer på to store primtal. Ikke alle tal kan bruges, og derfor skal asymmetriske nøgler være meget større for at give den samme sikkerhed. Ifølge firmaet "RSA Security" svarer en 1024 bit RSA nøgle til en 80 bit symmetrisk nøgle, og vi skal helt op på en 15360 bit RSA nøgle for at få samme sikkerhed som en 256 bit symetrisk nøgle.

Men jo større nøglen er, desto længere tid tager det at generere den og kryptere med den, og de krypterede data kommer også til at fylde mere.

2048 bits burde ikke kunne brydes før år 2030, men gå efter 4096 for en sikkerheds skyld. I resten af artiklen bruger jeg 1024 fordi det giver kortere filer.

Fold kodeboks ind/udPHP kode 


Vi prøver det af:
Fold kodeboks ind/udKode 


Nu har vi noget, vi kan arbejde med, så lad os finde ud af, hvordan man krypterer. Send bare din offentlige nøgle fil ud til højre og venstre, men hold den private fil væk fra offentligheden.

Kryptering med RSA


Som sagt krypterer man ikke data med RSA, man krypterer nøgler. OpenSSL har funktionen 'openssl_public_encrypt' til at kryptere med en public key. Vi kan så selv generere en tilfældig 256 bit nøgle, kryptere data med den og en selvvalgt algoritme, kryptere den hemmelige nøgle med vores RSA nøgle og så til sidst gemme de krypterede data sammen med den krypterede nøgle.

Hvis ikke vi har for megen data, som skal krypteres, så kan OpenSSL gøre det meste for os med funktionen 'openssl_seal'. Den skal have alle de data, som skal krypteres. Så genererer den en nøgle, krypterer dataene med denne nøgle og RC4 algoritmen og giver os den hemmelige nøgle krypteret med RSA nøglen (den kan endda tage flere RSA nøgler).

Den er bare ikke så brugbar, hvis vi skal kryptere en stor fil, for det hele skal være i hukommelsen på én gang...både den krypterede og den ikke krypterede version, så vi klarer os selv. Det lærer vi også mest af:

Fold kodeboks ind/udPHP kode 


Det var komplekst, men det virker:
Fold kodeboks ind/udKode 


Det første, som ligger i 'encrypted' er en base64 enkodet version af den RSA krypterede hemmelige nøgle, som kan dekryptere den sidste del, som er de egentlige data.

Lad os se om vi kan dekryptere det.

Dekryptering med RSA


Dekryptering er det modsatte af krypteringen, så nu skal vi have fat i vores private key. 'openssl_seal' har et modstykke, som hedder 'openssl_open', men igen skal den have al den krypterede data i hukommelsen på én gang, så vi går manuelt frem.

Først skal vi læse første linje fra filen, som indeholder den base64 enkodede streng. Den skal base64 dekodes, og resultatet skal vi forsøge at dekryptere med RSA og vores private nøgle.

Lykkes det kan vi dekryptere resten af filen med RC4. Det gør vi således:
Fold kodeboks ind/udPHP kode 


Og det virker:
Fold kodeboks ind/udKode 


Fantastisk!!!
Til at dekryptere skulle vi bruge vores password, for den private nøgle var jo også krypteret. Det er en ekstra sikkerhed, hvis vores nøglefil skulle falde i de forkerte hænder, så skal de stadig bryde noget kryptering for at få fat i den egentlige nøgle.

Afslutning


Det var så en introduktion til asymmetrisk kryptografi. Det er blevet komplekst, men jeg håber, at det var til at finde ud af.

Public key kryptering kan bruges til mere end vi har dækket her, bl.a. digitale signaturer og det bliver så emnet for næste artikel.


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (0)

Du skal være logget ind for at skrive en kommentar.
t