RSA (cryptografie)

cryptografie

RSA is een asymmetrisch encryptiealgoritme, dat veel gebruikt wordt bij gegevensoverdracht, bijvoorbeeld voor de beveiliging van transacties. Het algoritme werd in 1977 ontworpen door Ron Rivest, Adi Shamir en Len Adleman, vandaar de afkorting RSA.

Clifford Cocks, een Britse wiskundige, die voor het Government Communications Headquarters werkte, heeft in 1973 in een intern document een gelijkwaardig algoritme beschreven, dat pas in 1997 boven water is gekomen, omdat het als topgeheim geclassificeerd was.

De veiligheid van RSA steunt op het probleem van de ontbinding in factoren bij heel grote getallen: op dit moment is het bijna onmogelijk de twee oorspronkelijke priemgetallen en te achterhalen als alleen hun product bekend is en en groot genoeg zijn. Vergelijk het met een hashfunctie. Het zou te veel tijd in beslag nemen.

Het Massachusetts Institute of Technology heeft in 1983 in de Verenigde Staten het algoritme gepatenteerd, maar dat liep op 21 september 2000 af. Omdat het algoritme werd gepubliceerd voordat er in een ander land patent op werd aangevraagd, kon er in andere landen geen patent meer op worden aangevraagd.

Werking

bewerken

Sleutels

bewerken

Veronderstel dat Alice ervoor wil zorgen dat Bob haar een geheim bericht kan zenden over een onveilig medium, per telefoon, internet of post. Alice doet het volgende om een publieke sleutel en een geheime sleutel te maken:

  1. Ze kiest willekeurig twee grote priemgetallen   en   en berekent het product  .
  2. Ze berekent de indicator   van  . Omdat   een product is van twee priemgetallen, is dat gemakkelijk. Namelijk, de indicator van een priemgetal   is   en   is multiplicatief:   =   . Dus  .
  3. Ze kiest een geheel getal   (de encryptiesleutel) dat tussen 1 en   ligt:   en dat onderling ondeelbaar met   is:  . De encryptiesleutel   mag bekend gemaakt worden aan Bob (en eventueel aan de rest van de wereld).
  4. Ze berekent de decryptiesleutel   als modulaire inverse van de encryptiesleutel  , dat wil zeggen dat  , dus   voor zekere gehele  . De decryptiesleutel   blijft geheim, ook voor Bob.
  • Alice kan stap 4 met het uitgebreide algoritme van Euclides uitvoeren. Het getallenpaar   vormt de publieke sleutel, het getallenpaar   de geheime sleutel. Daarin is alleen de sleutel   dus geheim, want   is bekend. Alice stuurt het product   en de openbare sleutel   naar Bob via een mogelijk onveilig medium en ze houdt de sleutel   geheim.
Voorbeeld
  • Alice kiest  ,  ,  . Dus  .
  • Alice kiest de publieke sleutel   en stuurt deze naar Bob tezamen met het product 319.
  • Om de kleinst mogelijke geheime sleutel te verkrijgen berekent Alice: ggd(p-1, q-1) = ggd(10, 28) = 2 en neemt   = 280 / 2 = 140.
  • Alice berekent met het uitgebreide algoritme van Euclides de geheime sleutel   als de inverse van   modulo  :
 , waaruit volgt dat   de decryptiesleutel is die Alice geheim houdt voor Bob en de rest van de wereld.

Versleutelen

bewerken

Veronderstel dat Bob een bericht   naar Alice wil zenden. Hij kent   en  , de publieke sleutel, want die heeft Alice hem gezonden. Hij zet de klare tekst   om in een getal   met  , gebruikmakend van een eerder afgesproken, omkeerbaar en niet-geheim protocol. Bijvoorbeeld, elk teken in een bericht kan worden omgezet in zijn ASCII-code, en de codes samengevoegd tot een enkel getal. Als het nodig is (bijvoorbeeld omdat  ) kan   worden opgesplitst in tokens en elke token kan afzonderlijk versleuteld worden. Dan berekent hij de cijfertekst (de versleutelde tekst),   met behulp van de vergelijking:

 

Dit kan snel worden gedaan door machtsverheffing door kwadrateren. Bob verzendt dan   naar Alice.

Voorbeeld

Als Bob de letter 'Y', met ASCII-code 89 (< 319), naar Alice wil sturen, versleutelt hij deze en berekent de cijfertekst:

 .

Bob stuurt de cijfertekst voor de letter 'Y', het getal 298, naar Alice.

Ontsleutelen

bewerken

Alice ontvangt de cijfertekst   van Bob, en ze kent haar geheime sleutel  . Ze kan  , de boodschap in numerieke vorm, te weten komen door   tot de macht   te verheffen en dan de volgende ontsleutelingsrelatie toe te passen:

 
Voorbeeld

Om de cijfertekst met de geheime sleutel te ontsleutelen, berekent Alice:[1]

 ,

wat inderdaad weer de ASCII-code van de letter 'Y' is.

Als laatste stap krijgt Alice het bericht   door op de numerieke vorm   ervan het afgesproken, niet-geheime, protocol in omgekeerde richting toe te passen.

Kanttekeningen

bewerken

Omdat  , lijkt voor de ontsleuteling de congruentie   voor de hand te liggen, maar merk op dat de congruentie niet modulo   is, maar modulo  

Als de complexiteit die het modulo rekenen met zich meebrengt even wordt vergeten, lijkt de congruentie eenvoudig. Immers, omdat   en   uit de publieke sleutel bekend is, volgt voor de geheime sleutel dat  . De corresponderende congruentie voor   daarentegen:  , vraagt de waarden van   en   afzonderlijk om   uit   te verkrijgen. Zoals al in de inleiding is opgemerkt, zijn   en   moeilijk uit   terug te vinden en daarom geeft de congruentie een moeilijk te kraken waarde voor  .

Bewijs congruentie

bewerken

Het bewijs gebruikt de kleine stelling van Fermat. Die stelt dat voor   priem,   geheel en   geldt dat:

 

Gegeven is:

 

Dus

 

voor zekere gehele  . Neemt men aan dat  , dan volgt:

 

Als   en omdat   priem is, geldt  , en in totaal

 

Analoog:

 

Dus is voor zekere gehele  :

 

en is dit ook een veelvoud van  . Omdat   geen veelvoud van   is moet   dit wel zijn,   voor zekere gehele  . Dus geldt

 

en omdat   en  , is de ontsleutelingsrelatie bewezen.

Ondertekenen

bewerken

RSA kan ook worden gebruikt om een bericht digitaal te ondertekenen. Veronderstel dat Alice een ondertekend bericht wil zenden naar Bob. Ze berekent dan een hashwaarde uit het bericht, versleutelt die met haar geheime sleutel, en voegt dat als een handtekening bij het bericht. Deze handtekening kan alleen met haar publieke sleutel worden ontsleuteld. Wanneer Bob het ondertekende bericht ontvangt, ontsleutelt hij de handtekening met Alices publieke sleutel, en vergelijkt de berekende hashwaarde met de eigenlijke hashwaarde van het bericht. Als die gelijk zijn, weet hij dat de auteur van het bericht de geheime sleutel van Alice bezit en dat het bericht na verzending niet meer is veranderd.

Veiligheid

bewerken

Veronderstel dat Charlotte, een afluisteraar, de publieke sleutel   en  , en de cijfertekst   onderschept. Ze kan niet rechtstreeks aan de geheime sleutel   komen, omdat Alice die geheimhoudt. De meest voor de hand liggende manier voor Charlotte om   te vinden uit  , is om   in de factoren   en   te ontbinden, zodat ze   kan berekenen en   kan vinden uit  . Er is nog geen methode gevonden om getallen in polynomiale tijd in factoren te ontbinden met een gewone computer, de benodigde tijd wordt veel sneller groter dan bij lineair groter wordende getallen, maar het is niet bewezen dat er geen bestaat.

Het is ook niet bewezen dat de enige manier om   uit   te berekenen, is om   in factoren te ontbinden, maar er is nog geen gemakkelijkere manier ontdekt, tenminste geen publiek bekende. Daarom wordt algemeen verondersteld dat Charlotte het bericht niet kan terugvinden als   groot genoeg is.

Als   uit 256 of minder bits bestaat, kunnen de factoren in een paar uur met een personal computer worden gevonden, gebruik makende van software die op het internet vrij toegankelijk is. Als   512 bits, kan sinds 1999 het ontbinden in factoren door enkele honderden computers in een aanvaardbare tijd worden uitgevoerd. Het is tegenwoordig aan te raden   ten minste 1024 bits lang te kiezen. De 2013 NIST standaard FIPS 186-4 beveelt drie lengtes aan voor veilige moduli: 1024, 2048 of 3072 bits, die bestaan uit de respectievelijke aantallen decimale cijfers: 309, 617 en 972.

Peter Shor heeft in 1994 aangetoond dat wanneer er een kwantumcomputer zou bestaan, die in principe de een getal in polynomiale tijd in priemfactoren kan ontbinden. Mochten kwantumcomputers daarom werkelijkheid worden, dan maakt het algoritme van Shor RSA en andere soortgelijke algoritmes onbruikbaar. Als een efficiënte methode voor het ontbinden in factoren met een gewone computer zou worden gevonden, of als een kwantumcomputer zou worden gemaakt, dan kunnen nog langere sleutels een tijdelijke oplossing bieden, maar zo'n veiligheidslek in RSA zou wel retroactief zijn: de publieke sleutel en de cijfertekst kunnen worden bijgehouden totdat het mogelijk wordt om het bericht te ontcijferen. Dat is een reden om op de lange termijn niet alleen RSA gebruiken.

Praktische bedenkingen

bewerken

Sleutels

bewerken

Om de grote priemgetallen   en   te vinden, worden meestal eerst willekeurige getallen van de juiste grootte gekozen. Die getallen worden dan getest met snelle methoden, die de meeste niet-priemgetallen uitsluiten. Als dan een getal wordt gevonden dat waarschijnlijk een priemgetal is, kan op een zekere, maar langzamere, manier worden nagegaan of het getal inderdaad priem is.

De priemgetallen   en   mogen niet te dicht bij elkaar liggen, want anders zou de fermatfactorisatie voor   succesvol kunnen zijn. Bovendien kan, als   of   alleen kleine priemfactoren hebben,   snel in factoren worden ontbonden, zodat deze waarden voor   en   ook moeten worden gemeden.

Er mag geen methode om priemfactoren te zoeken worden gebruikt die een eventuele aanvaller enige informatie geeft over de priemgetallen. Een goede toevalsgenerator moet worden gebruikt. Coppersmith heeft in 1997 aangetoond dat als iemand de helft van de cijfers van   of   kan raden, hij gemakkelijk de andere helft kan berekenen.

Het is belangrijk dat de geheime exponent   groot genoeg is. Wiener heeft in 1990 aangetoond dat als   tussen   en   ligt, wat veel voorkomt, en  ,   op een efficiënte manier uit   en   kan worden berekend.

Snelheid

bewerken

RSA is veel trager dan Data Encryption Standard en andere symmetrische encryptiealgoritmes. Bob vercijfert in de praktijk gewoonlijk zijn bericht met een symmetrisch algoritme en de symmetrische sleutel, kort in vergelijking met het bericht, met RSA. Het symmetrisch versleutelde bericht en de met RSA versleutelde sleutel worden dan beiden naar Alice verstuurd.

Deze methode zorgt voor bijkomende veiligheidsmoeilijkheden. De methode voor symmetrische encryptie moet veilig zijn, niet gemakkelijk te kraken zonder de sleutel, en de symmetrische sleutel moet met een goede toevalsgenerator worden gemaakt, want anders zou Charlotte om RSA heen kunnen door de symmetrische sleutel te raden.

Sleutelverdeling

bewerken

Zoals bij alle encryptiemethoden, is het belangrijk hoe de publieke sleutels worden verspreid. We moeten ons bewust zijn van de mogelijkheid van een man-in-the-middle-aanval. Veronderstel dat Charlotte de communicatie tussen Alice en Bob kan onderscheppen. Ze ontvangt dan een publieke sleutel van Alice, maakt zelf een nieuwe publieke en geheime sleutel en stuurt haar eigen publieke sleutel naar Bob, die denkt dat hij de publieke sleutel van Alice ontvangt. Dan kan ze verdere berichten van Bob, vercijferd met haar publieke sleutel, ontvangen, ontcijferen met haar geheime sleutel, en eventueel veranderd weer met de eerder ontvangen publieke sleutel vercijferd naar Alice sturen. Alice denkt dan dat het bericht rechtstreeks van Bob komt. Alice en Bob kunnen in principe niet merken dat Charlotte ertussen zit. Verdedigingen tegen zo'n aanval zijn meestal gebaseerd op digitale certificaten of andere onderdelen van een public key infrastructure. Uiteraard is de beste oplossing dat Alice en Bob de sleutels, of een controlegetal, vergelijken tijdens een echte ontmoeting.

Tijdsgebaseerde aanvallen

bewerken

Kocher beschreef in 1995 een ingenieuze nieuwe aanval op RSA: als Charlotte de hardware van Alice kent en de tijd nodig voor het ontcijferen van verschillende bekende cijferteksten kan meten, kan ze de geheime sleutel   snel vinden.[2] Om deze aanval af te slaan, moet de ontsleuteling in een constante tijd gebeuren.

Aangepast gekozen cijfertekst aanvallen

bewerken

Daniel Bleichenbacher beschreef in 1996 een poging om met RSA versleutelde berichten met de PKCS #1 v1 redundantiefunctie, een redundantiefunctie voegt structuur toe aan een RSA-bericht, zodat het mogelijk is om te weten of een ontsleuteld bericht goed is, te ontsleutelen. Omwille van zwakke plekken in het PKCS #1 schema kon Bleichenbacher een aanval tegen de RSA-implementatie van het Transport Layer Security protocol opzetten, en mogelijk de sleutels te weten komen. Daarom raden cryptografen nu aan om alleen redundantietesten te gebruiken, waarvan is bewezen dat ze veilig zijn. RSA Laboratories heeft nieuwe versies van PKCS #1 vrijgegeven, die niet gevoelig zijn voor deze aanvallen.

  NODES
Intern 3
mac 2
Note 1
os 4
web 1