RSA (cryptografie)

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken
SecurID's uitgerust met RSA.

RSA is een asymmetrisch encryptiealgoritme, dat veel gebruikt wordt voor elektronische handel (beveiliging van transacties en dergelijke). Het formele 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 (GCHQ) werkte, heeft in 1973 een gelijkwaardig algoritme beschreven in een intern document, 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 p en q te achterhalen als alleen p*q bekend is en p en q groot genoeg zijn; het zou te veel tijd in beslag nemen. Nieuwe ontwikkelingen op dit gebied zouden RSA onbruikbaar kunnen maken.

MIT heeft in 1983 in de V.S. het algoritme gepatenteerd. Het patent liep op 21 september 2000 af. Omdat het algoritme gepubliceerd werd vóór de patentaanvraag, kon het niet worden gepatenteerd in andere landen.

Werking[bewerken]

Sleutels[bewerken]

Veronderstel dat Alice ervoor wil zorgen dat Bob haar een persoonlijk bericht kan zenden over een onveilig medium (telefoon, internet, ...). Ze doet het volgende om een publieke sleutel en een geheime sleutel te maken:

  1. Kies twee grote priemgetallen pq willekeurig en onafhankelijk van elkaar. Bereken N = p * q.
  2. Kies een geheel getal 1 < e < φ(n) , dat relatief priem is t.o.v. (p-1)*(q-1).
  3. Bereken d zo dat e * d mod (p-1)*(q-1) = 1
  4. Vernietig alle sporen van p en q.

N en e zijn de publieke sleutel, N en d zijn de geheime sleutel. Alleen d is dus een geheim, want N is bekend. Alice stuurt de publieke sleutel naar Bob (over het onveilige medium, bijvoorbeeld telefoon, internet, post), en houdt de geheime sleutel geheim.

Versleutelen[bewerken]

Veronderstel dat Bob een bericht m naar Alice wil zenden. Hij kent N en e (publieke sleutel), want die heeft Alice hem gezonden. Hij zet de klare tekst m om in een getal n < N, gebruik makend van een eerder afgesproken, omkeerbaar 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 kan m worden opgesplitst en elk stuk afzonderlijk vercijferd. Dan berekent hij de cijfertekst c:

 c = n^e\ \mathrm{mod}\ N

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

Ontcijferen[bewerken]

Alice ontvangt c van Bob, en kent haar geheime sleutel d. Ze kan n te weten komen uit c op de volgende manier:

 c^d\  \mathrm{mod}\ N = n

Alice kan dan n vinden, aangezien n < N, en uit n kan ze dan het oorspronkelijke bericht m vinden.

Het ontcijferen werkt omdat

 c^d \mathrm{mod}\ N= n^{e \cdot d}\ \mathrm{mod}\ N

en e*d mod (p-1) = 1 en e*d mod (q-1)= 1. Fermats kleine stelling geeft:

 n^{e \cdot d} \mathrm{mod}\ p = n\  en  n^{e \cdot d} \mathrm{mod}\ q = n

en dus (aangezien p en q verschillende priemgetallen zijn):

 n^{e \cdot d} \mathrm{mod}\ (p \cdot q) = n

Voorbeeld[bewerken]

Als voorbeeld kunnen we de priemgetallen 11 en 29 nemen: p=11, q=29. N is dan 319. We kiezen e=3. 3 is relatief priem ten opzichte van (p-1)(q-1) = 10*28 = 280. d wordt dan 187:

e * d\,\bmod\,(p-1)(q-1) \equiv 3 * 187\,\bmod\,280 \equiv 1

Als we nu de letter 'd' willen coderen (ASCII-code 100) dan krijgen we:

n^e \,\bmod\,N \equiv 100^3 \,\bmod\,319 \equiv 254

De codetekst bevat dus het karakter met de ASCII-code 254 (þ). Om de tekst vervolgens te decoderen met de geheime sleutel, krijgen we:

c^d \,\bmod\,N \equiv 254^{187} \,\bmod\,319 = 100

Ondertekenen[bewerken]

RSA kan ook worden gebruikt om een bericht te ondertekenen. Veronderstel dat Alice een ondertekend bericht wil zenden naar Bob. Ze berekent dan een hashwaarde uit het bericht, vercijfert die met haar geheime sleutel, en voegt dat als een "handtekening" bij het bericht. Deze handtekening kan alleen worden ontcijferd met haar publieke sleutel. Wanneer Bob het ondertekende bericht ontvangt, ontcijfert hij de handtekening met Alices publieke sleutel, en vergelijkt de aldus bekomen 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 (dus normaal gezien Alice is), en dat het bericht na verzending niet meer veranderd is.

Veiligheid[bewerken]

Veronderstel dat Charlotte, een afluisteraar, de publieke sleutel N en e, en de cijfertekst c onderschept. Ze kan niet rechtstreeks aan d geraken, omdat Alice dat geheim houdt. De meest voor de hand liggende manier voor Charlotte om n te vinden uit c, is om N in de factoren p en q te ontbinden, zodat ze (p-1)*(q-1) kan berekenen en d kan vinden uit e. Er is nog geen polynomische-tijd methode gevonden om getallen 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; zie priemfactor.

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

Als N 256 bits of korter is, kunnen de factoren in een paar uur gevonden worden met een personal computer, gebruik makende van software die vrij toegankelijk is op het internet. Als N 512 bits of korter is, kan, sinds 1999, de ontbinding uitgevoerd worden door enkele honderden computers (in een aanvaardbare tijd). Het is tegenwoordig aan te raden N ten minste 1024 bits lang te kiezen.

In 1993 heeft Peter Shor aangetoond dat een kwantumcomputer in principe de factorisatie in polynomiale tijd zal kunnen uitvoeren. Als (of wanneer) kwantumcomputers werkelijkheid worden, zal het algoritme van Shor RSA en andere soortgelijke algoritmes onbruikbaar maken. Als een efficiënte methode voor ontbinding 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. Daarom is het niet veilig om lange-termijn geheimen uit te wisselen met RSA.

Praktische bedenkingen[bewerken]

Sleutels[bewerken]

Om de grote priemgetallen p en q 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 "waarschijnlijk priemgetal" is gevonden, kan op een zekere (maar langzamere) manier worden nagegaan of het getal inderdaad priem is.

p en q mogen niet te dicht bij elkaar gelegen zijn, want anders zou de Fermatfactorisatie voor N succesvol kunnen zijn. Bovendien kan, als p-1 of q-1 enkel kleine priemfactoren hebben, N snel in factoren worden ontbonden, zodat deze waarden voor p en q ook moeten worden vermeden.

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 p of q kan raden, hij gemakkelijk de andere helft kan berekenen.

Het is belangrijk dat de geheime sleutel d groot genoeg is. Wiener heeft in 1990 aangetoond dat als p tussen q en 2*q ligt (wat veel voorkomt) en d < N1/4/3, d op een efficiënte manier kan worden berekend uit N en e.

Snelheid[bewerken]

RSA is veel trager dan DES en andere symmetrische encryptiealgoritmes. In de praktijk vercijfert Bob gewoonlijk zijn bericht met een symmetrisch algoritme en de symmetrische sleutel (kort in vergelijking met het bericht) met RSA. Het symmetrisch vercijferd bericht en de met RSA vercijferde sleutel worden dan beiden verstuurd naar Alice.

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 gemaakt worden met een goede toevalsgenerator, 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 verspreid worden. 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 geëncrypteerd met de eerder ontvangen publieke sleutel naar Alice sturen (Alice denkt dat het bericht rechtstreeks van Bob komt). In principe kunnen Alice en Bob 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 checksum) vergelijken tijdens een "echte" ontmoeting (als dat mogelijk is).

Tijdsgebaseerde aanvallen[bewerken]

Kocher beschreef een ingenieuze nieuwe aanval op RSA in 1995: 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 d snel vinden. Om deze aanval af te slaan, moet de decryptie in een constante tijd gebeuren, bekend onder de naam RSA blinding.

Aangepast gekozen cijfertekst aanvallen[bewerken]

In 1996 beschreef Daniel Bleichenbacher de eerste praktische aangepast gekozen cijfertekst aanval tegen met RSA vercijferde 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 gedecrypteerd bericht goed is). Omwille van zwakke plekken in het PKCS #1 schema kon Bleichenbacher een aanval tegen de RSA-implementatie van het SSL protocol opzetten, en mogelijk de sessie-sleutels te weten komen. Daarom raden cryptografen nu aan om bewijsbaar veilige redundantietesten zoals OAEP te gebruiken, en RSA Laboratories heeft nieuwe versies van PKCS #1 vrijgegeven, die niet gevoelig zijn voor deze aanvallen.

Zie ook[bewerken]

Externe links[bewerken]