RSA (cryptografie) | algoritme usted om berichten te versleutelen en te ontsleutelen

RSA (Rivest-Shamir-Adleman) is een algoritme dat door moderne computers wordt gebruikt om berichten te versleutelen en te ontsleutelen. Het is een asymmetrisch cryptografisch algoritme. Asymmetrisch betekent dat er twee verschillende sleutels zijn. Dit wordt ook wel public key cryptografie genoemd, omdat één van de sleutels aan iedereen kan worden gegeven. De andere sleutel moet privé worden gehouden. Het algoritme is gebaseerd op het feit dat het vinden van de factoren van een groot samengesteld getal moeilijk is: wanneer de factoren priemgetallen zijn, wordt het probleem priemfactorisatie genoemd. Het is ook een sleutelpaar (publieke en private sleutel) generator.

RSA omvat een openbare sleutel en een privésleutel. De openbare sleutel kan bij iedereen bekend zijn - hij wordt gebruikt om berichten te versleutelen. Berichten die met de openbare sleutel zijn gecodeerd, kunnen alleen worden ontcijferd met de privésleutel. De privésleutel moet geheim worden gehouden. Het berekenen van de privésleutel uit de openbare sleutel is erg moeilijk.



 

Gebruikte concepten

RSA gebruikt een aantal concepten uit de cryptografie:

  • Een eenrichtingsfunctie die gemakkelijk te berekenen is; een functie vinden die deze functie omkeert, of deze functie berekenen is zeer moeilijk.
  • RSA gebruikt een concept dat discrete logaritme heet. Dit werkt ongeveer hetzelfde als het normale logaritme: Het verschil is dat alleen hele getallen worden gebruikt, en dat er in het algemeen een modulusoperatie bij komt kijken. Bijvoorbeeld ax =b, modulo n. Bij de discrete logaritme gaat het erom de kleinste x te vinden die voldoet aan de vergelijking, wanneer a b en n worden gegeven
  • Het kan worden tegengegaan door het algoritme van Shor.


 

Sleutels genereren

De sleutels voor het RSA-algoritme worden als volgt gegenereerd:

  1. Kies twee verschillende grote willekeurige priemgetallen {\displaystyle p} en q . Dit moet geheim blijven.
  2. Bereken {\displaystyle n=pq} .
    • n is de modulus voor de openbare sleutel en de privésleutels.
  3. Bereken de totiënt: ϕ {\displaystyle \phi (n)=(p-1)(q-1)} .
  4. Kies een geheel getal {\displaystyle e} zodanig dat {\displaystyle 1<e<\phi (n)} , en {\displaystyle e} is co-priem met ϕ {\displaystyle \phi (n)} .
    d.w.z.:
    {\displaystyle e} en ϕ {\displaystyle \phi (n)} delen geen andere factoren dan {\displaystyle 1}: {\displaystyle \gcd(e,\phi (n))=1} ; Zie grootste gemene deler.
    • {\displaystyle e} wordt vrijgegeven als de exponent van de openbare sleutel.
  5. Bereken {\displaystyle d} om aan de congruentierelatie voldoen. {\displaystyle de\equiv 1\!\!\!\!{\pmod {\phi (n)}}} .
    d.w.z.:
    {\displaystyle de=1+x\cdot \phi (n)} voor een geheel getal x . (Eenvoudig gezegd: Bereken {\displaystyle d=(1+x\cdot \phi (n))/e} een geheel getal te zijn).
    • {\displaystyle d} wordt bewaard als de exponent van de privésleutel.

Opmerkingen over bovenstaande stappen:

  • Stap 1: Getallen kunnen probabilistisch worden getest op primaliteit.
  • Stap 3: gewijzigd in PKCS#1 v2.0 in λ {\displaystyle \lambda (n)={\rm {lcm}}(p-1,q-1)} in plaats van ϕ {\displaystyle \phi (n)=(p-1)(q-1)} .
  • Stap 4: Een populaire keuze voor de openbare exponenten is {\displaystyle e=2^{16}+1=65537} . Sommige toepassingen kiezen kleinere waarden zoals {\displaystyle e=3}, {\displaystyle 5}of {\displaystyle 35} . Dit wordt gedaan om encryptie en handtekeningverificatie sneller te maken op kleine apparaten zoals smartcards, maar kleine publieke exponenten kunnen leiden tot grotere veiligheidsrisico's.
  • De stappen 4 en 5 kunnen worden uitgevoerd met het uitgebreide algoritme van Euclides [en]; zie modulair rekenen.


 De openbare sleutel bestaat uit de modulus {\displaystyle n\,} en de openbare exponent {\displaystyle e\,} .
De persoonlijke sleutel bestaat uit p, q en de privé (of ontcijfering) exponent {\displaystyle d\,} die geheim moet blijven.

  • Voor de efficiëntie kan een andere vorm van de privésleutel worden opgeslagen:
    • {\displaystyle p} en q : de priemgetallen van de sleutelgeneratie;
    • {\displaystyle d{\bmod {(}}p-1)} en {\displaystyle d{\bmod {(}}q-1)} : vaak dmp1 en dmq1 genoemd;
    • {\displaystyle q^{-1}{\bmod {p}}} : vaak iqmp genoemd.
  • Alle delen van de privésleutel moeten in deze vorm geheim blijven. {\displaystyle p\,} en {\displaystyle q\,} zijn gevoelig omdat zij de factoren zijn van {\displaystyle n\,} en de berekening van {\displaystyle d\,} op basis van {\displaystyle e\,} mogelijk maken. Als {\displaystyle p\,} ) en {\displaystyle q\,} ) niet zijn opgeslagen in deze vorm van de privésleutel, worden ze veilig verwijderd, samen met andere tussenliggende waarden van de sleutelgeneratie.
  • Hoewel deze vorm snellere ontcijfering en ondertekening mogelijk maakt door gebruik te maken van het Chinese Remainder Theorem (CRT), is het aanzienlijk minder veilig omdat het aanvallen via het zijkanaal mogelijk maakt [en]. Dit is vooral een probleem bij implementatie op smartcards, die het meest profiteren van de verbeterde efficiëntie. 
    (Begin met
    {\displaystyle y\equiv x^{e}\!\!\!\!{\pmod {n}}}en laat de kaart dat ontcijferen. Hij berekent dus {\displaystyle (y^{d}{\bmod {p}})} of {\displaystyle (y^{d}{\bmod {q}})}waarvan de resultaten een bepaalde waarde opleveren{\displaystyle z} . Veroorzaak nu een fout in een van de berekeningen. Dan zal {\displaystyle \gcd(z-x,n)} {\displaystyle p} of q .)


 

Bericht versleutelen

Alice geeft haar openbare sleutel {\displaystyle (n,e)} aan Bob en houdt haar privésleutel geheim. Bob wil bericht {\displaystyle M} naar Alice sturen.

Eerst verandert hij {\displaystyle M} in een getal m dat kleiner is dan n met behulp van een overeengekomen omkeerbaar protocol, bekend als een opvulschema. Vervolgens berekent hij de cijfertekst {\displaystyle c\,} die overeenkomt met:

{\displaystyle c=m^{e}\mod {n}}

Dit kan snel gebeuren met de methode van exponentiëren door kwadrateren. Bob stuurt vervolgens {\displaystyle c\,} naar Alice.



 

Bericht ontcijferen

Alice kan {\displaystyle m\,} ) herstellen van {\displaystyle c\,} ) door haar privésleutel {\displaystyle d\,} ) te gebruiken in de volgende procedure:

Gegeven {\displaystyle m\,} , kan zij de oorspronkelijke afzonderlijke priemgetallen terugvinden, door de Chinese reststelling toe te passen op deze twee congruenties.

{\displaystyle m^{ed}\equiv m{\bmod {pq}}} .

Dus,

{\displaystyle c^{d}\equiv m{\bmod {n}}} .

Daarom:

{\displaystyle m=c^{d}\ mod\ n}

Een werkend voorbeeld

Hier is een voorbeeld van RSA-versleuteling en -ontsleuteling. De hier gebruikte priemgetallen zijn te klein om veilig iets te versleutelen. U kunt OpenSSL gebruiken om een echt sleutelpaar te genereren en te onderzoeken.

1. Kies twee willekeurige priemgetallen {\displaystyle p} en {\displaystyle q\,} :

{\displaystyle p=61} en {\displaystyle q=53\,} ;

2. Bereken {\displaystyle n=pq\,} :

{\displaystyle n=61\times 53=3233\!} ;

3. Bereken de totiënt ϕ {\displaystyle \phi (n)=(p-1)(q-1)} :

{\displaystyle \phi (n)=(61-1)(53-1)=3120\!} ;

4. Kies {\displaystyle e>1} coprime to {\displaystyle 3120\,} :

{\displaystyle e=17\,} ;

5. Kies {\displaystyle d\,} om te voldoen aan {\displaystyle ed\equiv 1{\bmod {\phi (n)}}} :

{\displaystyle d=2753\,} , met {\displaystyle 17\times 2753=46801=1+15\times 3120} .


 De openbare sleutel is ( {\displaystyle n=3233} , {\displaystyle e=17} ). Voor een opgevuld bericht {\displaystyle m\,} wordt de coderingsfunctie {\displaystyle c=m^{e}{\bmod {n}}} :

{\displaystyle c=m^{17}{\bmod {3}}233\,}

De privésleutel is ( {\displaystyle n=3233} , {\displaystyle d=2753} ). De ontcijferingsfunctie {\displaystyle m=c^{d}{\bmod {n}}} wordt:

{\displaystyle m=c^{2753}{\bmod {3}}233\,}


 Bijvoorbeeld, om
versleutelen, berekenen we {\displaystyle m=123}berekenen we

{\displaystyle c=123^{17}{\bmod {3}}233=855}

Om ontcijferen {\displaystyle c=855}berekenen we

{\displaystyle m=855^{2753}{\bmod {3}}233=123}

Beide berekeningen kunnen snel en gemakkelijk worden uitgevoerd met het kwadraat-en-vermenigvuldigingsalgoritme voor modulaire exponentiatie.



 

RSA-vergelijking afleiden uit de stelling van Euler

RSA kan gemakkelijk worden afgeleid met behulp van de stelling van Euler en de totiëntfunctie van Euler.

Te beginnen met de stelling van Euler,

{\displaystyle m^{\phi (n)}\equiv 1{\pmod {n}}}

moeten we aantonen dat ontcijfering van een gecodeerd bericht, met de juiste sleutel, het oorspronkelijke bericht oplevert. Gegeven een opgevuld bericht m, wordt de cijfertekst c berekend door

{\displaystyle c\equiv m^{e}{\pmod {n}}}

In het ontcijferingsalgoritme hebben we dan

{\displaystyle c^{d}\equiv (m^{e})^{d}\equiv m^{ed}{\pmod {n}}}

Wij willen aantonen dat deze waarde ook congruent is met m. De waarden van e en d zijn zo gekozen dat ze voldoen aan,

{\displaystyle ed\equiv 1{\pmod {\phi (n)}}}

Dat wil zeggen dat er een geheel getal k bestaat, zodat

{\displaystyle ed=k\times \phi (n)+1}

Nu vervangen wij het gecodeerde en vervolgens gedecodeerde bericht,

{\displaystyle {\begin{aligned}m^{ed}&\equiv m^{k\phi (n)+1}\\&\equiv m\times m^{k\phi (n)}\\&\equiv m\times \left(m^{\phi (n)}\right)^{k}{\pmod {n}}\end{aligned}}}

Wij passen de stelling van Euler toe en komen tot het resultaat.

{\displaystyle m\times (1)^{k}\equiv m{\pmod {n}}}



 

Opvulschema's

Bij gebruik in de praktijk moet RSA worden gecombineerd met enige vorm van opvulling, zodat geen enkele waarde van M resulteert in onveilige cijferteksten. RSA zonder opvulling kan enkele problemen opleveren:

  • De waarden m = 0 of m = 1 leveren altijd cijferteksten gelijk aan 0 respectievelijk 1 op, vanwege de eigenschappen van exponentiëring.
  • Bij vercijfering met kleine vercijferingsexponenten (bijv. e = 3) en kleine waarden van de m, kan het (niet-modulaire) resultaat van {\displaystyle m^{e}} strikt kleiner zijn dan de modulus n. In dit geval kunnen cijferteksten gemakkelijk worden ontcijferd door de eth-wortel van de cijfertekst te nemen zonder rekening te houden met de modulus.
  • RSA-codering is een deterministisch coderingsalgoritme. Het heeft geen willekeurige component. Daarom kan een aanvaller met succes een "chosen plaintext"-aanval uitvoeren op het cryptosysteem. Hij kan een woordenboek maken door waarschijnlijke plaintexts te versleutelen met de openbare sleutel, en de resulterende cijferteksten op te slaan. De aanvaller kan dan het communicatiekanaal observeren. Zodra zij cijferteksten zien die overeenkomen met die in hun woordenboek, kunnen de aanvallers dit woordenboek gebruiken om de inhoud van het bericht te achterhalen.

In de praktijk kunnen de eerste twee problemen zich voordoen wanneer korte ASCII-berichten worden verzonden. In dergelijke berichten kan m de aaneenschakeling zijn van een of meer ASCII-gecodeerde tekens. Een bericht dat bestaat uit een enkel ASCII NUL-teken (waarvan de numerieke waarde 0 is) wordt gecodeerd als m = 0, wat een cijfertekst van 0 oplevert, ongeacht de waarden van e en N die worden gebruikt. Evenzo zou een enkele ASCII SOH (waarvan de numerieke waarde 1 is) altijd een cijfertekst van 1 opleveren. Voor systemen die gewoonlijk kleine waarden van e gebruiken, zoals 3, zouden alle ASCII-berichten met één teken die met dit schema zijn gecodeerd onveilig zijn, aangezien de grootste m een waarde van 255 zou hebben, en 2553 minder is dan elke redelijke modulus. Dergelijke klaarteksten kunnen worden hersteld door eenvoudigweg de derdemachtswortel van de cijfertekst te nemen.

Om deze problemen te vermijden, voegen praktische RSA-implementaties gewoonlijk een vorm van gestructureerde, willekeurige opvulling toe aan de waarde m alvorens deze te vercijferen. Deze opvulling zorgt ervoor dat m niet in het bereik van onveilige klaarteksten valt, en dat een gegeven bericht, eenmaal opgevuld, zal versleutelen tot een van een groot aantal mogelijke cijferteksten. Deze laatste eigenschap kan de kosten van een woordenboekaanval verhogen tot boven de mogelijkheden van een redelijke aanvaller.

Standaarden zoals PKCS zijn zorgvuldig ontworpen om berichten veilig op te vullen vóór de RSA-versleuteling. Omdat deze regelingen de klaartekst m opvullen met een aantal extra bits, moet de omvang van het niet-opgevulde bericht M iets kleiner zijn. RSA-opvulsystemen moeten zorgvuldig worden ontworpen om geavanceerde aanvallen te voorkomen. Dit kan worden vergemakkelijkt door een voorspelbare berichtstructuur. Vroege versies van de PKCS-standaard gebruikten ad-hocconstructies, die later kwetsbaar bleken voor een praktische adaptieve gekozen cijfertekstaanval. Moderne constructies maken gebruik van veilige technieken zoals optimale asymmetrische encryptie opvulling (OAEP) om berichten te beschermen en tegelijkertijd deze aanvallen te voorkomen. De PKCS-standaard heeft ook verwerkingsschema's die zijn ontworpen om extra veiligheid te bieden voor RSA-handtekeningen, bijvoorbeeld het Probabilistic Signature Scheme for RSA (RSA-PSS).



 

Berichten ondertekenen

Stel dat Alice de openbare sleutel van Bob gebruikt om hem een gecodeerd bericht te sturen. In het bericht kan zij beweren Alice te zijn, maar Bob kan niet controleren of het bericht werkelijk van Alice afkomstig is, aangezien iedereen de openbare sleutel van Bob kan gebruiken om hem gecodeerde berichten te sturen. Om de herkomst van een bericht te verifiëren, kan RSA dus ook worden gebruikt om een bericht te ondertekenen.

Stel dat Alice een ondertekend bericht naar Bob wil sturen. Zij produceert een hashwaarde van het bericht, verhoogt deze tot de macht d mod n (net als bij het ontcijferen van een bericht), en voegt deze als "handtekening" toe aan het bericht. Wanneer Bob het ondertekende bericht ontvangt, verhoogt hij de handtekening tot de macht e mod n (net als bij het versleutelen van een bericht), en vergelijkt de resulterende hashwaarde met de werkelijke hashwaarde van het bericht. Als de twee overeenstemmen, weet hij dat de auteur van het bericht in het bezit was van de geheime sleutel van Alice, en dat er sindsdien niet met het bericht is geknoeid.

Merk op dat veilige opvulsystemen zoals RSA-PSS even essentieel zijn voor de veiligheid van het ondertekenen van berichten als voor het vercijferen ervan, en dat dezelfde sleutel nooit mag worden gebruikt voor zowel vercijfering als ondertekening.

 

Vragen en antwoorden

V: Wat is RSA?


A: RSA (Rivest-Shamir-Adleman) is een algoritme dat door moderne computers wordt gebruikt om berichten te versleutelen en te ontsleutelen. Het is een asymmetrisch cryptografisch algoritme.

V: Wat betekent asymmetrisch?


A: Asymmetrisch betekent dat er twee verschillende sleutels zijn - een openbare sleutel en een privésleutel.

V: Wat is de basis van het RSA-algoritme?


A: Het algoritme is gebaseerd op het feit dat het vinden van de factoren van een groot samengesteld getal moeilijk is - wanneer de factoren priemgetallen zijn, wordt dit probleem priemfactorisatie genoemd.

V: Hoe werkt RSA?


A: RSA heeft een openbare sleutel en een privésleutel. De openbare sleutel kan bij iedereen bekend zijn - hij wordt gebruikt om berichten te versleutelen. Berichten die met de openbare sleutel zijn gecodeerd, kunnen alleen worden ontcijferd met de privésleutel, die geheim moet worden gehouden. Het berekenen van de privésleutel uit de openbare sleutel is erg moeilijk.

V: Bestaat er een andere naam voor dit type cryptografie?


A: Dit type cryptografie wordt ook publieke-sleutelcryptografie genoemd, omdat een van de sleutels aan iedereen kan worden gegeven terwijl de andere privé blijft.

V: Genereert RSA een sleutelpaar?


A: Ja, RSA genereert een sleutelpaar - een openbare en een privésleutel - die respectievelijk worden gebruikt voor vercijfering en ontcijfering.

AlegsaOnline.com - 2020 / 2023 - License CC3