RSA-algoritme | algoritme, der anvendes til at kryptere og dekryptere meddelelser
RSA (Rivest-Shamir-Adleman) er en algoritme, der bruges af moderne computere til at kryptere og dekryptere meddelelser. Det er en asymmetrisk kryptografisk algoritme. Asymmetrisk betyder, at der er to forskellige nøgler. Dette kaldes også offentlig nøglekryptografi, fordi en af nøglerne kan gives til hvem som helst. Den anden nøgle skal holdes privat. Algoritmen er baseret på det faktum, at det er vanskeligt at finde faktorerne til et stort sammensat tal: Når faktorerne er primtal, kaldes problemet primfaktorisering. Det er også en nøglepargenerator (offentlig og privat nøgle).
RSA omfatter en offentlig nøgle og en privat nøgle. Den offentlige nøgle kan være kendt af alle - den bruges til at kryptere meddelelser. Meddelelser, der er krypteret med den offentlige nøgle, kan kun dekrypteres med den private nøgle. Den private nøgle skal holdes hemmelig. Det er meget vanskeligt at beregne den private nøgle ud fra den offentlige nøgle.
Anvendte begreber
RSA anvender en række begreber fra kryptografi:
- En envejsfunktion, der er let at beregne; det er meget vanskeligt at finde en funktion, der vender den om, eller at beregne denne funktion.
- RSA anvender et koncept, der kaldes diskret logaritme. Dette fungerer på samme måde som den normale logaritme: Forskellen er, at der kun anvendes hele tal, og at der generelt er tale om en modulusoperation. Som eksempel kan nævnes ax =b, modulo n. Den diskrete logaritme handler om at finde det mindste x, der opfylder ligningen, når a b og n er angivet
- Den kan potentielt modvirkes af Shors algoritme.
Generering af nøgler
Nøglerne til RSA-algoritmen genereres på følgende måde:
- Vælg to forskellige store tilfældige primtal og . Dette skal holdes hemmeligt.
- Beregn .
- er modulet for den offentlige nøgle og de private nøgler.
- Beregn totienten: .
- Vælg et helt tal , således at er en primus til .
Dvs. at og ikke har andre faktorer end fælles.: ; Se største fælles divisor. - frigives som eksponent for den offentlige nøgle.
- Beregn for at opfylde kongruensrelationen .
Dvs.: for et helt tal . (For at sige det ligeud: Beregn til at være et heltal) - bevares som eksponent for den private nøgle.
Bemærkninger til ovenstående trin:
- Trin 1: Tal kan testes sandsynlighedsvis for primalitet.
- Trin 3: ændret i PKCS#1 v2.0 til i stedet for .
- Trin 4: Et populært valg for de offentlige eksponenter er . Nogle applikationer vælger mindre værdier som f.eks. , , eller i stedet. Dette gøres for at gøre kryptering og signaturverifikation hurtigere på små enheder som f.eks. smart cards, men små offentlige eksponenter kan føre til større sikkerhedsrisici.
- Trin 4 og 5 kan udføres med den udvidede euklidiske algoritme ; se modulær aritmetik.
Den offentlige nøgle består af modulet og den offentlige (eller krypterings)eksponent .
Den personlige nøgle består af p,q og den private (eller dekrypterings) eksponent , som skal holdes hemmelig.
- Af hensyn til effektiviteten kan der gemmes en anden form for den private nøgle:
- og : primtalene fra nøglegenereringen;
- og : ofte kaldet dmp1 og dmq1;
- : ofte kaldet iqmp.
- Alle dele af den private nøgle skal holdes hemmelige i denne form. og er følsomme, da de er faktorerne for , og gør det muligt at beregne med . Hvis og ikke er gemt i denne form af den private nøgle, slettes de sikkert sammen med andre mellemliggende værdier fra nøglegenerering.
- Selv om denne form giver mulighed for hurtigere dekryptering og signering ved hjælp af den kinesiske restsætning (Chinese Remainder Theorem (CRT)) er den betydeligt mindre sikker, da den muliggør sidekanalangreb . Dette er et særligt problem, hvis det implementeres på smart cards, som har størst fordel af den forbedrede effektivitet.
(Start med , og lad kortet dekryptere det. Så det beregner eller , hvis resultater giver en værdi . Nu skal der opstå en fejl i en af beregningerne. Så vil afsløre eller .)
Kryptering af meddelelse
Alice giver sin offentlige nøgle
til Bob og holder sin private nøgle hemmelig. Bob ønsker at sende besked til Alice.Først omdanner han
til et tal , der er mindre end , ved hjælp af en aftalt reversibel protokol kendt som en padding-ordning. Derefter beregner han den ciffertekst , der svarer til:
Dette kan gøres hurtigt ved hjælp af eksponering ved kvadrering. Bob sender derefter
til Alice.Afkodning af meddelelse
Alice kan gendanne
fra ved at bruge sin private nøgle i følgende procedure:Givet
, kan hun genfinde de oprindelige særskilte primtal ved at anvende den kinesiske restsætning på disse to kongruenser, hvilket giver.
Således,
.
Derfor:
Et arbejdseksempel
Her er et eksempel på RSA-kryptering og dekryptering. De primtal, der anvendes her, er for små til, at vi kan kryptere noget sikkert. Du kan bruge OpenSSL til at generere og undersøge et rigtigt nøglepar.
1. Vælg to tilfældige primtal og :
og ;
2. Beregn :
;
3. Beregn totienten :
;
4. Vælg coprime til :
;
5. Vælg til at opfylde :
, med .
Den offentlige nøgle er ( ). For en polstret meddelelse bliver krypteringsfunktionen :
Den private nøgle er (
). Dekrypteringsfunktionen bliver:
For eksempel for at kryptere , beregner vi
For at dekryptere
beregner vi
Begge disse beregninger kan beregnes hurtigt og nemt ved hjælp af kvadrat-og-multiplikator-algoritmen for modulær eksponering.
Udledning af RSA-ligningen fra Eulers sætning
RSA kan let udledes ved hjælp af Eulers sætning og Eulers totientfunktion.
Vi starter med Eulers sætning,
skal vi vise, at dekryptering af en krypteret meddelelse med den korrekte nøgle vil give den oprindelige meddelelse. Givet en polstret meddelelse m, beregnes den krypterede tekst c ved at
Ved at indsætte den i dekrypteringsalgoritmen får vi følgende
Vi ønsker at vise, at denne værdi også er kongruent med m. Værdierne for e og d er valgt, så de opfylder,
Det vil sige, at der findes et helt tal k, således at
Nu erstatter vi den krypterede og derefter dekrypterede meddelelse,
Vi anvender Eulers teorem og opnår resultatet.
Polstringsordninger
Når RSA anvendes i praksis, skal den kombineres med en eller anden form for padding-ordning, så ingen værdier af M resulterer i usikre ciphertexter. RSA kan have visse problemer, hvis den anvendes uden padding:
- Værdierne m = 0 eller m = 1 giver altid krypterede tekster svarende til henholdsvis 0 eller 1 på grund af eksponeringens egenskaber.
- Ved kryptering med små krypteringseksponenter (f.eks. e = 3) og små værdier af m kan det (ikke-modulære) resultat af være strengt mindre end modulet n. I dette tilfælde kan krypterede tekster let dekrypteres ved at tage eth-roden af den krypterede tekst uden hensyn til modulet.
- RSA-kryptering er en deterministisk krypteringsalgoritme. Den har ingen tilfældig komponent. Derfor kan en angriber med held iværksætte et angreb med valgt klartekst mod kryptosystemet. De kan lave en ordbog ved at kryptere sandsynlige klartekster med den offentlige nøgle og lagre de resulterende ciphertexter. Angriberen kan derefter observere kommunikationskanalen. Så snart de ser ciffertekster, der passer til dem i deres ordbog, kan angriberne bruge denne ordbog til at få kendskab til meddelelsens indhold.
I praksis kan de to første problemer opstå, når der sendes korte ASCII-meddelelser. I sådanne meddelelser kan m være en sammenkædning af et eller flere ASCII-kodede tegn. En meddelelse bestående af et enkelt ASCII NUL-tegn (hvis numeriske værdi er 0) vil blive kodet som m = 0, hvilket giver en ciffertekst på 0, uanset hvilke værdier af e og N der anvendes. På samme måde vil et enkelt ASCII SOH
(hvis numeriske værdi er 1) altid give en ciffertekst på 1. For systemer, der konventionelt anvender små værdier af e, f.eks. 3, vil alle ASCII-meddelelser med et enkelt tegn, der er kodet efter dette skema, være usikre, da den største m vil have værdien 255, og 2553 er mindre end ethvert rimeligt modul. Sådanne klartekster kan genfindes ved simpelthen at tage kubikroden af den krypterede tekst.
For at undgå disse problemer indlejrer praktiske RSA-implementeringer typisk en form for struktureret, randomiseret polstring i værdien m, før den krypteres. Denne udfyldning sikrer, at m ikke falder inden for området af usikre plaintexter, og at en given meddelelse, når den er udfyldt, vil blive krypteret til en af et stort antal forskellige mulige ciphertexter. Sidstnævnte egenskab kan øge omkostningerne ved et ordbogsangreb ud over en rimelig angriberes muligheder.
Standarder som PKCS er omhyggeligt designet til at sikre, at beskederne er beskyttet inden RSA-kryptering. Fordi disse ordninger fylder klarteksten m med et vist antal ekstra bits, skal størrelsen af den ikke-polstrede meddelelse M være noget mindre. RSA-padding-ordninger skal være omhyggeligt udformet for at forhindre avancerede angreb. Dette kan gøres lettere ved at have en forudsigelig meddelelsesstruktur. I de tidlige versioner af PKCS-standarden blev der anvendt ad hoc-konstruktioner, som senere viste sig at være sårbare over for et praktisk adaptivt angreb på den valgte ciffertekst. Moderne konstruktioner anvender sikre teknikker som f.eks. optimal asymmetrisk krypteringspadding (OAEP) til at beskytte meddelelser og samtidig forhindre disse angreb. PKCS-standarden indeholder også behandlingsordninger, der er udformet til at give yderligere sikkerhed for RSA-signaturer, f.eks. den probabilistiske signaturordning for RSA (RSA-PSS).
Signering af meddelelser
Antag, at Alice bruger Bobs offentlige nøgle til at sende ham en krypteret meddelelse. I meddelelsen kan hun hævde at være Alice, men Bob har ingen mulighed for at verificere, at meddelelsen faktisk er fra Alice, da alle kan bruge Bobs offentlige nøgle til at sende ham krypterede meddelelser. Så for at verificere en meddelelses oprindelse kan RSA også bruges til at signere en meddelelse.
Lad os antage, at Alice ønsker at sende en signeret meddelelse til Bob. Hun fremstiller en hash-værdi af meddelelsen, forhøjer den til potensen af d mod n (ligesom ved dekryptering af en meddelelse) og vedhæfter den som en "signatur" til meddelelsen. Når Bob modtager den signerede meddelelse, forhøjer han signaturen til potensen e mod n (ligesom ved kryptering af en meddelelse) og sammenligner den resulterende hash-værdi med meddelelsens faktiske hash-værdi. Hvis de to værdier stemmer overens, ved han, at ophavsmanden til meddelelsen var i besiddelse af Alices hemmelige nøgle, og at meddelelsen ikke er blevet ændret siden da.
Bemærk, at sikre padding-ordninger som RSA-PSS er lige så vigtige for sikkerheden ved signering af meddelelser som for kryptering af meddelelser, og at den samme nøgle aldrig bør anvendes til både kryptering og signering.
Spørgsmål og svar
Q: Hvad er RSA?
A: RSA (Rivest-Shamir-Adleman) er en algoritme, der bruges af moderne computere til at kryptere og dekryptere meddelelser. Det er en asymmetrisk kryptografisk algoritme.
Spørgsmål: Hvad betyder asymmetrisk?
A: Asymmetrisk betyder, at der er to forskellige nøgler - en offentlig nøgle og en privat nøgle.
Spørgsmål: Hvad er grundlaget for RSA-algoritmen?
Svar: Algoritmen er baseret på det faktum, at det er vanskeligt at finde faktorerne til et stort sammensat tal - når faktorerne er primtal, kaldes dette problem primfaktorisering.
Spørgsmål: Hvordan fungerer RSA?
A: RSA involverer en offentlig nøgle og en privat nøgle. Den offentlige nøgle kan være kendt af alle - den bruges til at kryptere meddelelser. Meddelelser, der er krypteret med den offentlige nøgle, kan kun dekrypteres med den private nøgle, som skal holdes hemmelig. Det er meget vanskeligt at beregne den private nøgle ud fra den offentlige nøgle.
Spørgsmål: Er der et andet navn for denne type kryptografi?
Svar: Denne type kryptografi kaldes også for kryptografi med offentlig nøgle, fordi en af nøglerne kan gives til hvem som helst, mens den anden nøgle holdes privat.
Spørgsmål: Genererer RSA et par nøgler?
Svar: Ja, RSA genererer et par nøgler - en offentlig og en privat nøgle - som bruges til henholdsvis kryptering og dekryptering.