RSA (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
bewerkenSleutels
bewerkenVeronderstel 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:
- Ze kiest willekeurig twee grote priemgetallen en en berekent het product .
- 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 .
- 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).
- 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
bewerkenVeronderstel 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
bewerkenAlice 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
bewerkenOmdat , 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
bewerkenHet 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
bewerkenRSA 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
bewerkenVeronderstel 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
bewerkenSleutels
bewerkenOm 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
bewerkenRSA 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
bewerkenZoals 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
bewerkenKocher 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
bewerkenDaniel 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.
- voetnoten
- ↑ Gebruik modpow(298,47,319) op: bigint - large integer package, of in Python 3: 298**47%319.
- ↑ (en) PC Kocher. Advances in Cryptology — CRYPTO ’96, 1996. hoofdstuk Timing Attacks on Implementations of Diffie-Hellman, RSA, DSS, and Other Systems, blz 104–113, ISBN 9783540615125
- websites
- (en) RSA
- RSA Encryptie Applicatie. gearchiveerd