Het RSA Algoritme

advertisement
Het RSA Algoritme
Erik Aarts
-1-
1
Wiskunde............................................................................................................................ 3
1.1
Het algoritme van Euclides ........................................................................................ 3
1.1.1
Stelling 1 ............................................................................................................ 4
1.2
Het uitgebreide algoritme van Euclides ..................................................................... 5
1.3
Modulo rekenen.......................................................................................................... 7
1.3.1
Optellen, aftrekken en vermenigvuldigen bij modulo rekenen .......................... 8
1.3.2
Delen bij modulo rekenen .................................................................................. 8
1.3.3
Machtsverheffen bij modulo rekenen................................................................. 9
1.4
Handige stellingen bij modulo rekenen.................................................................... 11
1.4.1
Stelling 4 .......................................................................................................... 11
1.4.2
Stelling 5 .......................................................................................................... 11
1.4.3
Stelling 6 .......................................................................................................... 11
2
Geheimschrift voor computers ......................................................................................... 11
2.1
Asymmetrische sleutels............................................................................................ 12
2.2
Geheimschriften met asymmetrische sleutels .......................................................... 12
2.3
RSA .......................................................................................................................... 13
2.3.1
Stelling 7 .......................................................................................................... 15
3
Slot ................................................................................................................................... 16
4
Bewijzen van alle stellingen die niet in de tekst zijn bewezen ........................................ 17
Inleiding
De cryptografie, oftewel geheimschrift, heeft een lange geschiedenis. De Romeinen
gebruikten al geheimschrift in het leger. Het beste boek over de geschiedenis van het
geheimschrift is wel het (uit het Engels vertaalde) boek van Simon Singh: Code. Hij vertelt
prachtige verhalen over geheimschrift in de oudheid en de Middeleeuwen. De cryptografie is
een eeuwenlang durende wedstrijd geweest tussen code makers en code brekers. Singh gaat
ook uitgebreid in op de Enigma, de “geheimschriftmachine” die in de 2e Wereldoorlog
gebruikt werd door de Duitsers om hun onderlinge communicatie te beveiligen. Deze machine
werd al vrij vroeg in de oorlog gekraakt door de Engelsen waardoor zij de communicatie van
de Duitsers af konden luisteren. De Duitsers hadden dit niet door, pas na de oorlog bleek dat
de Engelsen van alle Duitse plannen op de hoogte waren.
De uitvinding van de computer heeft de cryptografie sterk veranderd. Door de brute
rekenkracht van een computer werden bijna alle tot dan toe bestaande geheimschriften
waardeloos omdat ze gemakkelijk te kraken zijn met een computer. Maar gelukkig zijn er
weer nieuwe vormen van cryptografie ontwikkeld die ook met een computer niet te kraken
zijn. Dit boekje gaat over de bekendste moderne vorm van geheimschrift. Dit geheimschrift is
bedacht door 3 mensen (althans zij waren de eersten die hun idee in het openbaar bekend
maakten): Rivest, Shamir en Adleman.
-2-
De letters van hun achternamen vormen de naam van dit geheimschrift: RSA.
Met het RSA algoritme (computerprogramma) kan iedereen berichten sturen die niet te
ontcijferen zijn door anderen. Het algoritme wordt overal toegepast om computers te
beveiligen, en om te zorgen dat computers met elkaar kunnen communiceren op een veilige
manier. Zonder moderne cryptografie zou het bijvoorbeeld onmogelijk zijn om veilig te
kunnen internet bankieren.
Dit boekje legt uit hoe het RSA algoritme werkt. Het gaat niet over de praktijk van computer
beveiliging maar over de (briljante) wiskundige theorie achter het RSA algoritme. Als je snapt
hoe het werkt kun je deze kennis daarna gaan toepassen om computers veiliger te maken.
Maar eerst dus de theorie, en die wordt hier uitgelegd. Veel plezier!
1
Wiskunde
Om het RSA systeem te kunnen begrijpen beginnen we met twee basisideeën:
1. het algoritme van Euclides
2. modulo rekenen.
1.1 Het algoritme van Euclides
Het algoritme van Euclides is een manier om de grootste gemene deler te berekenen. Het
begrip grootste gemene deler leggen we uit aan de hand van een voorbeeld..
522
en we willen deze breuk vereenvoudigen. De meeste mensen
Stel we hebben de breuk
738
lossen het als volgt op: je deelt eerst boven en onder door hetzelfde getal (bijvoorbeeld 2), en
dan ga je verder. Kortom je probeert een getal te vinden waardoor je de teller en de noemer
kan delen. Na de deling probeer je weer verder te komen.
522 261 87 29
=
=
=
en dan stop je. Als we meteen gezien hadden dat 522 en 738 beiden
738 369 123 41
deelbaar zijn door 18 waren we sneller klaar geweest. Het getal 18 is de grootste gemene
deler van 522 en 738.
Definitie van grootste gemene deler
1. a is een deler van b als je b door a kan delen.
2. c is een gemene deler van a en b als je a en b door c kan delen. “Gemeen” betekent
hier dus niet “vals” maar “gemeenschappelijk”.
-3-
3. c is de grootste gemene deler van a en b als er geen grotere is (“da’s logisch” zou
Cruijff zeggen). We schrijven dan c = ggd (a, b) .
Opgave 1
ggd(24,18) =
ggd(48,39) =
ggd(37,23) =
Als de getallen groter worden, wordt het lastiger om de grootste gemene
deler te vinden alleen door te proberen. De Griekse wiskundige Euclides
(325-265 v.C.) heeft hier al over nagedacht. In zijn boek “De
Elementen” (boek 7 propositie 2) staat een berekening om de grootste
gemene deler te vinden. Het basisidee achter zijn algoritme is
1.1.1 Stelling 1
ggd (a, b) = ggd (a − b, b) als a > b .
Om de tekst wat leesbaarder te houden staan een aantal bewijzen achterin het boek. Het
bewijs van stelling 1 staat in hoofdstuk 6.
Een manier om de grootste gemene deler van twee getallen a en b te bepalen zou zijn:
•
•
•
als a = b heb je ggd(a,a) = a, je bent klaar.
als a < b draai je a en b om, ggd(b,a) = ggd(a,b)
als a > b om ggd(a,b) te berekenen, bereken je ggd(a-b,b).
Je trekt dus telkens het kleinste getal van het grootste getal af. Omdat je telkens met kleinere
getallen gaat werken, kom je op een gegeven moment in het eerste geval uit ( a = b ) en dan
ben je klaar.
Als we dit toepassen op het vinden van de grootste gemene deler van 522 en 738 krijgen we:
ggd (522, 738) = ggd (738,522) = ggd (216, 522) = ggd (522, 216) = ggd (216,306) =
ggd (216,90) = ggd (126,90) = ggd (36, 90) = ggd (54,36) = ggd (36,18) = ggd (18,18) = 18
Er zijn erg veel stappen nodig om tot het antwoord te komen. Euclides’ idee was dan ook om
met delingen en resten te werken in plaats van telkens af te trekken.
Voor de rest voeren we een nieuwe naam in: mod. We zullen later zien waar die naam
vandaan komt. Dus in plaats van “14 gedeeld door 4 is 3 rest 2” schrijven we nu
“14 mod 4=2”.
Definitie van mod
• r = a mod n , als je a deelt door n is de rest r. Bijvoorbeeld a=14, n=4. Dan geldt r=2.
Opgave 2
-4-
35 mod 8 =
43 mod 6 =
196 mod 13 =
Het algoritme van Euclides gebruikt de regel ggd (a, b) = ggd (b, a mod b) .
De regel ggd (a, b) = ggd (b, a mod b) is het herhaald toepassen van de regels
ggd (a, b) = ggd (a − b, b) en ggd (a, b) = ggd (b, a ) en zullen we niet bewijzen.
Algoritme van Euclides om ggd (a, b) (met a > b) te berekenen gaat als volgt:
• als b = 0 dan ggd(a,0)=a
• als b ≠ 0 om ggd (a, b) te berekenen, bereken je ggd (b, a mod b) .
Het algoritme van Euclides is sneller dan het vorige algoritme:
ggd (738,522) = ggd (522, 216) = ggd (306, 216) = ggd (216,90) = ggd (90,36) =
ggd (36,18) = ggd (18,18) = 18
Opgave 3
Bepaal met het algoritme van Euclides
ggd(738,27)
ggd(37,77)
In opgave 3 zien we dat de grootste gemene deler 1 kan zijn. Als de grootste gemene deler 1
is noemen we de getallen co-priem. De getallen 8 en 9 zijn co-priem, want ze hebben geen
andere deler gemeenschappelijk dan 1. Maar 8 en 10 zijn niet co-priem, want 8 en 10 zijn
beide deelbaar door 2.
Definitie
• Als ggd (a, b) = 1 zijn a en b co-priem.
Opgave 4
Welke paren getallen zijn co-priem?
15 en 24
24 en 7
24 en 14
21 en 55
De begrippen grootste gemene deler, mod en co-priem komen nog vaak terug in de rest van
dit boek.
1.2 Het uitgebreide algoritme van Euclides
We gaan het algoritme van Euclides nu uitbreiden. Het uitgebreide algoritme kan het
volgende probleem oplossen:
-5-
Probleem
Stel ggd (a, b) = c . Vind dan getallen k en l zo dat c = k ⋅ a + l ⋅ b
We noemen dit “c schrijven als een lineaire combinatie van a en b”.
Voorbeeld
ggd(10,18) = 2
Zoek een k en l zo dat 2 = k ⋅10 + l ⋅18 .
Oplossing: k = 2 en l = −1 want 2 = 2 ⋅10 − 18
We zullen het algoritme uitleggen met een voorbeeld. We nemen a=99 en b=78. We gaan een
tabel maken met 4 kolommen. We beginnen bovenaan en voegen telkens een nieuwe rij toe
tot we klaar zijn. Bij elke stap in het algoritme van Euclides maken we een nieuwe rij. We
gaan eerst de ggd (99, 78) berekenen. 99 mod 78 = 21. Dus we gaan ggd(78,21) berekenen. Zo
gaan we verder tot we uitkomen op ggd(3,0). In de tweede kolom houden we bij “hoeveel
keer het getal er in past”. Als we klaar zijn weten we dat ggd (99, 78) = 3 . Nu gaan we
getallen k en l zoeken zo dat 3 = k ⋅ 99 + l ⋅ 78 want we willen 3 schrijven als een lineaire
combinatie van 99 en 78.
ggd(99,78)
ggd(78,21)
ggd(21,15)
ggd(15,6)
ggd(6,3)
ggd(3,0)
99 = 78 + 21
78 = 3 ⋅ 21 + 15
21 = 1 ⋅15 + 6
15 = 2 ⋅ 6 + 3
6 = 2⋅3+ 0
ggd(3,0)=3
In de derde kolom komen de vergelijkingen uit de tweede kolom te staan, waarbij de rest
vooraan komt te staan. In de tweede kolom staat …=…+ rest, in de derde kolom staat dan
rest =…-…
ggd(99,78)
ggd(78,21)
ggd(21,15)
ggd(15,6)
ggd(6,3)
ggd(3,0)
99 = 78 + 21
78 = 3 ⋅ 21 + 15
21 = 1 ⋅15 + 6
15 = 2 ⋅ 6 + 3
6 = 2⋅3+ 0
ggd(3,0)=3
21 = 99 − 78
15 = 78 − 3 ⋅ 21
6 = 21 − 1 ⋅15
3 = 15 − 2 ⋅ 6
0 = 6 − 2⋅3
De laatste kolom vullen we van onder naar boven. We schrijven in alle vakjes behalve de
drie onderste “3=”. De regel uit de derde kolom ( 3 = 15 − 2 ⋅ 6 ) schrijven we over in de vierde
kolom. De onderste twee vakjes laten we leeg.
-6-
ggd(99,78)
ggd(78,21)
ggd(21,15)
ggd(15,6)
ggd(6,3)
ggd(3,0)
99 = 78 + 21
78 = 3 ⋅ 21 + 15
21 = 1 ⋅15 + 6
15 = 2 ⋅ 6 + 3
6 = 2⋅3+ 0
ggd(3,0)=3
21 = 99 − 78
15 = 78 − 3 ⋅ 21
6 = 21 − 1 ⋅15
3 = 15 − 2 ⋅ 6
0 = 6 − 2⋅3
3=
3=
3=
3 = 15 − 2 ⋅ 6
We gaan nu van onder naar boven de vergelijkingen uit de derde kolom invullen in de vierde
kolom. Als we bovenaan zijn gekomen hebben we de lineaire combinatie die we zochten
gevonden (de eerste kolom laten we even weg i.v.m. ruimtegebrek).
99 = 78 + 21
78 = 3 ⋅ 21 + 15
21 = 1 ⋅15 + 6
15 = 2 ⋅ 6 + 3
6 = 2⋅3+ 0
ggd(3,0)=3
21 = 99 − 78
15 = 78 - 3 ⋅ 21
6 = 21 − 1 ⋅15
3 = 15 − 2 ⋅ 6
0 = 6 − 2⋅3
3 = 3 ⋅ 78 − 11 ⋅ (99 − 78) = 14 ⋅ 78 − 11 ⋅ 99
3 = 3 ⋅ (78 - 3 ⋅ 21) − 2 ⋅ 21 = 3 ⋅ 78 − 9 ⋅ 21 − 2 ⋅ 21 = 3 ⋅ 78 − 11 ⋅ 21
3 = 15 − 2 ⋅ (21 − 1 ⋅15) = 15 − 2 ⋅ 21 + 2 ⋅15 = 3 ⋅ 15 − 2 ⋅ 21
3 = 15 − 2 ⋅ 6
We zijn begonnen met a = 99 en b = 78. De ggd(99,78) bleek 3 te zijn. Met het uitgebreide
algoritme zien we dat 3 = 14 ⋅ 78 − 11 ⋅ 99 (bovenste regel in de laatste kolom). Dus 14 en –11
zijn de getallen die we zochten. We hebben 3 geschreven als combinatie van 99 en 78.
1.3 Modulo rekenen
In het vorige hoofdstuk zijn we het woord mod tegengekomen, en mod is een afkorting van
het Latijnse woord modulo. Modulo betekent rest. Om te kunnen modulo rekenen gaan we
werken met een nieuw is-gelijk-teken-met-drie-streepjes: ... ≡ ...(mod...)
Definitie
a ≡ b (mod n) als a mod n = b mod n
Dus twee getallen zijn aan elkaar gelijk modulo n als hun resten na deling door n aan elkaar
gelijk zijn. Het getal n noemen we de modulus.
Een voorbeeld. Neem n = 7 . Dan geldt
•
•
1 ≡ 8 (mod 7) . Want 1 mod 7 = 1 en 8 mod 7 = 1 .
8 ≡ 15 (mod 7) . Want 8 mod 7 = 1 en 15 mod 7 = 1
We mogen de tekens ook “koppelen” zoals we dat bij de gewone = doen:
• 1 ≡ 8 ≡ 15 ≡ 22 ≡ 29 ≡ 36 (mod 7)
• 2 ≡ 9 ≡ 16 ≡ 23 ≡ 30 ≡ 37 (mod 7)
De (mod 7) hoort dan bij alle is-tekens. De eerste keer dat je dit ziet is het misschien even
wennen. Toch ben je deze manier van rekenen al vaak tegengekomen. Als je klok kijkt reken
je namelijk modulo 12.
-7-
Stel we hebben de volgende opgave:
Het is 11 uur. Jan gaat 3 uur wandelen. Hoe laat komt hij terug?
Met het nieuwe ≡ -teken kunnen we dit eindelijk netjes opschrijven:
11 + 3 ≡ 14 ≡ 2 (mod 12) , dus om 2 uur.
Het woord mod wordt op twee verschillende manieren gebruikt:
1. tussen twee getallen in. Dan is het de rest na deling, zoals in: 15 mod 7 = 1 .
2. tussen haakjes achter het ≡ -teken. Dan geeft het aan welke modulus bij het ≡ -teken
hoort, zoals in 1 ≡ 8 (mod 7) .
Haal deze notaties niet door elkaar!
1.3.1 Optellen, aftrekken en vermenigvuldigen bij modulo rekenen
Modulo rekenen erg lijkt op gewoon rekenen. Het voordeel is dat je altijd met kleine getallen
kunt werken. Als je grote getallen krijgt (groter dan n), neem je de rest en reken je daarmee
verder. Dat mag omdat de volgende regels gelden voor modulo rekenen:
•
•
•
x + y ≡ ( x mod n) + ( y mod n) (mod n)
x − y ≡ ( x mod n) − ( y mod n) (mod n)
x ⋅ y ≡ ( x mod n) ⋅ ( y mod n) (mod n)
Bereken de volgende sommen op twee manieren. Eerst reken je de som gewoon uit en neemt
dan de rest. Daarna neem je eerst de rest en maak je dan de som.
Voorbeeld
14 + 15 mod 6 .
Methode 1: 14+15=29, 29 mod 6 = 5. Antwoord is 5
Methode 2: 14 mod 6 = 2, 15 mod 6 = 3, 2+3=5. Antwoord is 5
Opgave
Bereken op twee manieren:
23 ⋅15 mod 7
14 ⋅15 mod 6
23 − 15 mod 7
15 − 23 mod 8
1.3.2 Delen bij modulo rekenen
Zoals je misschien gemerkt hebt hebben we niets gezegd over (modulo) delen. Optellen,
aftrekken en vermenigvuldigen gaat prima. Delen kan echter niet omdat er bij een deling
verschillende uitkomsten kunnen zijn. Stel we rekenen modulo 24. Dan geldt
1 ⋅ 6 ≡ 6 (mod 24), 5 ⋅ 6 ≡ 30 ≡ 6 (mod 24), 9 ⋅ 6 ≡ 54 ≡ 6 (mod 24)
-8-
6
(mod 24) ? Is het 1, 5 of 9? Alle drie de antwoorden zijn
6
goed, en daarom kunnen we niet delen als we modulo rekenen.
Wat is de uitkomst van de som
Er zijn wel regels die te maken hebben met delen, en dat zijn deze twee.
1. Je kunt soms links en rechts dezelfde factor wegstrepen. Als je gewoon rekent mag je
uit de vergelijking 6 ⋅ x = 6 ⋅ 9 de 6 wegstrepen. Je houdt dan x = 9 over. Het getal 0
mag je nooit wegstrepen. Wegstrepen mag ook bij modulo rekenen als de modulus een
priemgetal is. Stel p is een priemgetal en je hebt de gelijkheid a ⋅ x ≡ b ⋅ x (mod p ) met
niet x ≡ 0 (mod p ) Dan geldt a ≡ b (mod p ) . (Stelling 2)
2. Als je modulo n rekent kun je van elke x die co-priem is met n de inverse x −1
berekenen. Dit is in feite “1 gedeeld door x”, want x ⋅ x −1 ≡ 1 (mod n) . (Stelling 3)
De bewijzen van stellingen 2 en 3 staan in hoofdstuk 6. In het bewijs van stelling 3 staat ook
hoe je de inverse (tot de macht −1 ) kan berekenen.
Opgave
Bereken 4−1 (mod 7) .
1.3.3 Machtsverheffen bij modulo rekenen
We hebben nu optellen, aftrekken, vermenigvuldigen en delen gehad. Het wordt nu tijd voor
machtsverheffen. Machtsverheffen is herhaald vermenigvuldigen, daarom geldt
x y ≡ ( x mod n) y (mod n)
Het is echter niet zo dat x y ≡ x y mod n (mod n) . Je mag wel de modulus nemen van het grondtal
maar niet van de macht! Als je met machten rekent is het handig de rest te nemen zo gauw je
boven de modulus uitkomt. Bijvoorbeeld
25 ≡ 2 ⋅ 2 ⋅ 2 ⋅ 2 ⋅ 2 ≡ 4 ⋅ 2 ⋅ 2 ⋅ 2 ≡ 8 ⋅ 2 ⋅ 2 ≡ 3 ⋅ 2 ⋅ 2 ≡ 6 ⋅ 2 ≡ 1 ⋅ 2 ≡ 2 (mod 5) .
Door Excel te gebruiken om heel veel berekeningen tegelijk uit te voeren kunnne we bepaalde
regelmatigheden ontdekken bij het machtsverheffen. En deze regelmatigheden vormen de
kern van het RSA algoritme.
Opdracht
Start Excel (of een ander spreadsheet programma) op met een nieuw werkblad. Excel
kent de mod functie. De uitdrukking x mod n zet je in Excel als MOD ( x; n)
De grondtallen komen op de verticale as, de exponenten op de horizontale.
•
•
•
In cel A1 zetten we de modulus waarmee we gaan rekenen. Zet daar om te
beginnen een priemgetal in, bijvoorbeeld 7.
Zet in cel B1 het getal 2.
In rij 1 moeten nu de getallen vanaf 2 komen, C1=3, D1=4 enz.
-9-
•
Zet in cel C1 de formule “=B1+1”. Kopieer deze formule tot en met de kolom
AI (in AI1 staat dan 35).
Kopiëren kan in Excel gemakkelijk met de vulgreep (“fill handle”). Als je rechtsonder
in een cel gaat staan verandert de cursor in een +-teken zoals in de afbeelding
hieronder. Als je dan (naar rechts) sleept wordt de formule gekopiëerd.
Voor de eerste kolom doe je exact hetzelfde als voor de eerste rij. Zet in A2 getal 2, in
A3 zet je “=A2+1” en kopiëer de formule naar beneden, tot rij 35.
In cel B2 zet je nu de formule
=MOD((A2*$A2);$A$1)*($A2<$A$1)
Deze formule gebruikt de MOD functie van Excel. In cel B2 komt nu 4 ( 22 mod 7 ) te
staan.
$A$1 is het getal dat je in cel A1 hebt gezet. De cel A1 “misbruiken” we om de
modulus op te slaan. Het stukje “*($A2<$A$1)” zorgt er voor dat in de rijen waar het
grondtal groter is dan de modulus nullen verschijnen. Dit is in feite niet juist maar
hierdoor blijft de boel wat overzichtelijker. De formule in cel B2 moet naar rechts en
naar beneden gekopieerd worden. Helaas kan dit niet in 1 keer, je moet het rij voor rij
of kolom voor kolom doen.
Als je het goed hebt gedaan ziet het er als volgt uit:
Opdracht
Vul in cel A1 verschillende getallen in en kijk wat er gebeurt.
Als je in A1 een priemgetal zet krijg je een kolom met allemaal enen erin. Welke
kolom is dat?
- 10 -
Als het goed is heb je zojuist ontdekt dat x p −1 ≡ 1 (mod p ) als p een priemgetal is.
Dit gaan we bewijzen in het volgende hoofdstuk.
1.4 Handige stellingen bij modulo rekenen
1.4.1 Stelling 4
We kunnen bewijzen dat:
Stelling 4
x p −1 ≡ 1 (mod p ) als p een priemgetal is en niet x ≡ 0 (mod p )
Het bewijs staat in hoofdstuk 6.
1.4.2 Stelling 5
Nu we dit hebben bewezen kunnen we ook het volgende bewijzen:
Stelling 5
x1+ k ( p −1) ≡ x (mod p ) als p een priemgetal is.
Bewijs van stelling 5.
Stel dat niet x ≡ 0 (mod p ) . Dan geldt
x1+ k ( p −1) ≡ x ⋅ x k ( p −1) ≡ x ⋅ ( x p −1 ) k ≡ x ⋅1k ≡ x ⋅1 ≡ x (mod p) .
Als x ≡ 0 (mod p ) geldt de stelling ook, want 01+ k ( p −1) ≡ 0 (mod p ) .
Einde bewijs van stelling 5.
Opgave
Controleer de stelling x1+ k ( p −1) ≡ x (mod p ) in je Excel werkblad, bijvoorbeeld voor
p = 13 .
Hoe heb je dat gedaan?
1.4.3 Stelling 6
Dit is de Chinese rest stelling:
Stelling 6
Als x ≡ y (mod p ) en x ≡ y (mod q ) en p en q zijn co-priem, dan geldt
x ≡ y (mod p ⋅ q ) .
Het bewijs staat in hoofdstuk 6.
Opgave
Vul 4 getallen groter dan 10 in in de Chinese reststelling en laat zien dat de stelling klopt
voor deze 4 getallen.
Nu we de wiskundige theorie hebben gehad kunnen we teruggaan naar het onderwerp van dit
boekje: geheimschrift.
2
Geheimschrift voor computers
- 11 -
2.1 Asymmetrische sleutels
Eindelijk kunnen we nu overstappen naar het onderwerp van dit boek: het RSA
cryptosysteem. Om dit systeem uit te leggen maken we een vergelijking met een heel andere
manier van geheim communiceren.
Stel Astrid en Bert willen met elkaar op afstand communiceren zonder dat ze afgeluisterd
kunnen worden. Ze kunnen dan geheimschrift gebruiken. Maar ze kunnen ook hun brieven in
een envelop stoppen en hem heel goed dichtplakken. Helaas is een envelop gemakkelijk te
openen. Maar stel dat er lichtgewicht kluisjes bestaan die je per post kan versturen. Deze
kluisjes hebben een cijferslot van 4 cijfers. Dan kunnen Astrid en Bert elkaar brieven sturen
door ze in het kluisje te stoppen en het kluisje op te sturen. Omdat niemand
de code kent kan niemand de brieven lezen. Het nadeel is wel dat Astrid en
Bert elkaar één keer moeten zien om de code af te spreken. En ze moeten
er op vertrouwen dat de ander de code geheim houdt. Maar voor deze twee
problemen is een oplossing. Er bestaan ook kluisjes met twee codes:
1. de sluitcode. Dit is de code die je nodig hebt om het kluisje dicht te doen.
2. de opencode. Hiermee kan je het kluisje openen.
Het werkt als volgt. Astrid en Bert kopen ieder een eigen kluisje. Ze houden allebei de
opencode van hun kluisje geheim, ze vertellen het ook niet aan elkaar. Het enige wat de ander
hoeft te weten is de sluitcode. Hierover kunnen ze elkaar opbellen of E-mailen. De sluitcode
is helemaal niet geheim, iedereen mag hem weten. Bert stuurt nu eerst zijn lege kluisje naar
Astrid. Astrid stopt er wat in, en sluit Bert’s kluisje met zijn sluitcode. Dan stuurt ze beide
kluisjes naar Bert. Omdat alleen Bert de opencode van zijn kluisje weet kan niemand anders
het kluisje openen. Als Bert de twee kluisjes krijgt opent hij zijn kluisje. Hij leest de brief,
schrijft een antwoord en stopt het antwoord in Astrid’s kluisje. Hij sluit het kluisje met haar
sluitcode en stuurt beide kluisjes terug. Op deze manier kunnen Astrid en Bert met elkaar
communiceren zonder dat iemand ze afluistert. Verder
1. hoeven ze elkaar niet meer te ontmoeten om een sleutel af te spreken.
2. ze weten allebei zeker dat niemand anders kan meeluisteren omdat er maar één
persoon is die de opencode weet.
Dit is een mooi verhaal maar in de praktijk werkt het niet. Kluisjes zijn zwaar en het is dus
heel duur om telkens twee kluisjes op te sturen. En kluisjes zijn ook altijd te kraken met goed
gereedschap. Laten we dus toch maar eens kijken of Astrid en Bert niet via geheimschrift
kunnen communiceren.
2.2 Geheimschriften met asymmetrische sleutels
Bij geheimschrift zetten we een tekst eerst om in een onleesbare tekst. Dit heet coderen. De
onleesbare tekst sturen we op. De ontvanger zet de onleesbare tekst weer om in de
oorspronkelijke tekst, dit noemen we decoderen. Andere woorden die vaak gebruikt worden
zijn: vercijferen, encryptie, ontcijferen, decryptie.
De oorspronkelijke tekst noemen we de klare tekst. De gecodeerde tekst noemen we de
cijfertekst. Om te kunnen coderen en decoderen heb je sleutels nodig. De sleutel vertelt hoe je
de tekst kan coderen en decoderen. Als er maar één sleutel is, noemen we het systeem dat je
gebruikt symmetrisch. Bij een symmetrisch geheimschrift decodeer je een gecodeerde tekst
door het coderings proces achterstevoren uit te voeren zodat je de klare tekst weer terug krijgt.
- 12 -
s
m
c
m = klare tekst (message)
c = cijfertext
s = sleutel
Dit is te vergelijken met het kluisje waarbij de code om te openen en te sluiten hetzelfde
waren. Het RSA geheimschrift systeem is echter asymmetrisch. Er zijn twee sleutels. De
eerste sleutel vertelt hoe je moet coderen, dit is de codeersleutel (vergelijkbaar met de
sluitcode van het kluisje). De tweede sleutel zegt hoe te decoderen, en heet de
decodeersleutel. Dit is de opencode van het kluisje.
e
m
d
c
m
Als Astrid en Bert met elkaar communiceren hebben ze allebei twee sleutels, er zijn dus in
totaal 4 sleutels in het spel. Als Astrid een berichtje stuurt codeert ze het met Bert’s
codeersleutel. Bert kan het dan lezen met zijn decodeersleutel. Bert codeert zijn antwoord met
Astrid’s codeersleutel zodat alleen Astrid het kan decoderen.
De codeersleutels zijn niet geheim maar openbaar. Daarom worden ze openbare sleutels
genoemd. De decodeersleutels worden geheime sleutels genoemd.
Als Astrid en Bert hun openbare codeersleutels publiceren, bijvoorbeeld door ze op hun
website te zetten, kan iedereen geheime boodschappen naar Astrid en Bert sturen. Iedereen
kan teksten coderen met de openbare sleutel. De gecodeerde tekst is alleen door de
geadresseerde te lezen en niet door anderen, ook niet door de afzender, omdat niemand de
geheime decodeersleutels van Astrid en Bert weet. De ontwikkeling van asymmetrische
geheimschrift systemen met openbare sleutels is een grote revolutie geweest op het gebied
van geheimschrift.
2.3 RSA
Rivest, Shamir en Adleman hebben niet het idee van de openbare sleutels bedacht (dat waren
Diffie en Hellman), maar zij hebben wel het eerste geheimschrift systeem bedacht dat er mee
werkt. Omdat het algoritme met getallen werkt moet de tekst eerst worden omgezet in
getallen:
abc
t
010
e
m
d
c
010
m
abc
t
Tekst kan natuurlijk op verschillende manieren omgezet worden naar getallen. Wij gebruiken
de volgende methode:
- 13 -
1. We kiezen eerst een blokgrootte. De blokgrootte is het aantal letters dat samen een
getal vormt. Als je een blokgrootte kiest van één wordt elke letter apart omgezet. Je
geheime tekst is dan makkelijk te kraken met frequentieanalyse. Het is dus aan te
raden om een blokgrootte groter dan drie te kiezen.
2. Voor elke letter neem je de ASCII waarde en telt daar 100 bij op. Dan heeft het getal
altijd lengte 3. Zie bijgaande tabel:
132
165
166
167
168
169
A
B
C
D
E
F 170 L 176 R 182 X 188 d 200 j
G 171 M 177 S 183 Y 189 e 201 k
H 172 N
T
Z 190 F 202 l
I
O
U
a 197 g 203 m
J
P
V
b 198 h 204 n
K
Q
W
c 199 i 205 o
206
207
208
209
210
211
p 212 v 218
q
w
r
x
s
y
t
z
u
Coderen met RSA gaat als volgt. De klare tekst wordt eerst omgezet in een getal, noem dit
getal m. Het vercijferen gebeurt door machtsverheffen tot de macht e modulo n. Ontcijferen
gebeurt ook door machtsverheffen, tot de macht d modulo n. Het getal dat we er uit krijgen
zetten we om naar klare tekst.
abc
t
c=me
010
m
m=cd
c
010
m
abc
t
Om dit goed te laten werken moeten we getallen drie getallen zoeken, e, d en n zo dat we m
weer terug krijgen na ontcijferen.
We weten uit het vorige hoofstuk dat x1+ k ( p −1) ≡ x (mod p) .
We willen dat (me ) d ≡ m (mod n) en dus me d ≡ m (mod n)
Het ligt voor de hand om n gelijk te nemen aan p (een priemgetal), en e en d zo te kiezen dat
e ⋅ d = 1 + k ( p − 1) oftewel e ⋅ d ≡ 1 (mod ( p − 1)) .
Laten we eens naar een voorbeeld kijken. Eerst kiezen we een priemgetal p, bijvoorbeeld
p=29. Dan geldt dat x ≡ x 29 ≡ x57 ≡ x85 (mod 29) .
We kiezen e en d zo dat e ⋅ d ≡ 1 (mod 28) , bijvoorbeeld e = 19 en d = 3 , of e = 5 en d = 17 .
Om te coderen nemen we c = m19 (mod 29) . c is het getal dat we gaan versturen. Om te
3
decoderen nemen we m = c3 (mod 29) . Er geldt c3 ≡ m19 ≡ m57 ≡ m (mod 29) . Dus je krijgt
inderdaad de klare tekst die hoort bij m terug.
De openbare sleutel is nu (19,29). De geheime sleutel is (3,29).
Helaas werkt dit systeem niet want het is gemakkelijk te kraken. Als je de openbare sleutel
(e,n) weet kun je d eenvoudig berekenen door de inverse te nemen: d = e−1 (mod ( p − 1))
- 14 -
De volgende (en echt, dit is de laatste) stap is dat we een andere modulus nemen. Voor n
nemen we het product van twee verschillende priemgetallen.
Opgave
Zoek uit met behulp van Excel bij welke exponenten geldt x? ≡ x (mod p ⋅ q) als p en q
priem zijn. Doe dit door de volgende rijtjes aan te vullen:
x1 ≡ x 9 ≡ x17 ≡ x 25 ≡ x (mod 15) , dus x1+ 4⋅k ≡ x (mod 15)
x... ≡ x... ≡ x... ≡ x... ≡ x (mod 21)
x... ≡ x... ≡ x... ≡ x... ≡ x (mod 35)
1
1+ k ⋅ ⋅( p −1)⋅( q −1)
2
≡ x (mod p ⋅ q) . Dit is echter niet zo makkelijk te bewijzen.
Het lijkt dat x
Het is eenvoudiger om te bewijzen dat x1+ k ⋅( p −1)⋅( q −1) ≡ x (mod p ⋅ q) .
De factor
1
laten we dus even weg en we gaan bewijzen dat x1+ k ⋅( p −1)⋅( q −1) ≡ x (mod p ⋅ q) .
2
waarbij p en q priemgetallen zijn,
2.3.1 Stelling 7
x1+ k ⋅( p −1)⋅( q −1) ≡ x (mod p ⋅ q) , met p en q priem.
Bewijs
Als x ≡ 0 (mod pq ) geldt de stelling.
Als niet x ≡ 0 (mod pq ) ook. Bewijs:
k ⋅( q−1)
≡ x ⋅1
k ⋅( p −1)
≡ x ⋅1
x1+ k ⋅( p −1)⋅( q −1) ≡ x ⋅ x k ⋅( p −1)⋅( q −1) ≡ x ⋅ x ( p −1)
x1+ k ⋅( p −1)⋅( q −1) ≡ x (mod p)
x1+ k ⋅( p −1)⋅( q −1) ≡ x ⋅ x k ⋅( p −1)⋅( q −1) ≡ x ⋅ x ( q −1)
x1+ k ⋅( p −1)⋅( q −1) ≡ x (mod q)
k ⋅( q−1)
≡ x (mod p) dus
k ⋅( p −1)
≡ x (mod q) dus
Met de Chinese reststelling krijgen we x1+ k ⋅( p −1)⋅( q −1) ≡ x (mod p ⋅ q) en dit moesten we
bewijzen. Einde bewijs stelling 7.
Net als in de vorige paragraaf willen we weer exponenten e en d zoeken zo dat
d
c = me mod pq en m = c d mod pq . Dan geldt me ≡ me⋅d ≡ m (mod pq) .
We zoeken e en d zo dat e ⋅ d = 1 + k ⋅ ( p − 1) ⋅ (q − 1) oftewel e ⋅ d ≡ 1 (mod ( p − 1)(q − 1)) .
We kiezen eerst een e zo dat e en ( p − 1)(q − 1) co-priem zijn. Dan kunnen we de inverse van
e berekenen, zo dat e ⋅ e−1 ≡ 1 (mod ( p − 1)(q − 1)) . De d die we zoeken is dus e−1 .
Het lijkt nu alsof we nog steeds een systeem hebben dat makkelijk te kraken is.
Opgave
De publieke sleutel is: e = 37, n = 265 .
De boodschap is 217 57 232 232 225 46
De blokgroote is 1. Wat is de klare tekst ?
- 15 -
Het kraken ging als volgt:
• bereken de priemfactoren p en q van n.
• bereken e−1 (mod ( p − 1)(q − 1))
Toch is dit systeem niet te kraken als je zorgt dat n heel groot is. De eerste stap is dan
namelijk heel moeilijk.
Van het getal 255 waren de factoren nog gemakkelijk te bereken. Maar stel dat je voor p en q
heel grote priemgetallen neemt. Je kan ze zo groot kiezen dat het met hedendaagse computers
onmogelijk is om de factoren van n te vinden.
Samenvattend bestaat het RSA systeem uit de volgende stappen:
•
•
•
•
•
•
•
kies twee priemgetallen p en q, n = p ⋅ q . p,q zijn geheim, n is niet geheim
kies een getal e, co-priem met (p-1)(q-1). De GGD(e,((p-1)(q-1)))=1. (p-1)(q-1) is
geheim
bereken d als inverse van e, e ⋅ d ≡ 1 (mod ( p − 1)(q − 1))
publiceer (e,n), dit is je publieke sleutel
houd d geheim, (d,n) is je geheime steutel.
Coderen doe je zo: c = me (mod n)
En decoderen gaat zo: m = c d (mod n)
Opgave
Bereken zelf getallen e,d en n die ongeveer 200 cijfers lang zijn. Hiervoor heb je een
crypto rekenmachine nodig, bijvoorbeeld die op http://crypto.aartsvandertogt.nl .
Maak dan een geheime tekst. Zet die om (neem een blokgrootte groter dan 25 letters).
E-mail de cijfertekst naar iemand en geeft ook d en n. De ander kan hiermee de
boodschap decoderen.
3
Slot
Je begrijpt nu hoe encryptie werkt in moderne computers. Om computers echt te beveiligen is
dit nog maar het begin. Omdat de sleutels zulke grote getallen zijn worden ze meestal ook op
de computer opgeslagen en niet op een briefje geschreven. Maar dan moet je wel zorgen dat
niemand je sleutel kan kopiëren. Een ander probleem is dat je niet zeker weet of sleutels wel
echt zijn. Als iemand je een USB stick geeft met de sleutel er op is er geen probleem. Als je
sleutels gaat mailen bijvoorbeeld is er al kans dat iemand onderweg de sleutel verandert.
Het leuke van assymmetrische sleutels is dat ze niet alleen gebruikt kunnen worden om
boodschappen geheim te houden maar dat ze ook gebruikt kunnen worden als handtekening.
Als je namelijk je berichten codeert met je eigen geheime sleutel kan iedereen de boodschap
decoderen met je publieke sleutel. Het is dan wel zeker dat jij de schrijver bent (anderen
kunnen geen teksten maken die met jouw sleutel decodeerbaar zijn). Dus heb je het document
ondertekend.
Ik hoop dat je nu begrijpt hoe het RSA algoritme werkt en dat je verder gaat lezen over
moderne cryptografie!
- 16 -
4
Bewijzen van alle stellingen die niet in de tekst zijn bewezen
Stelling 1
ggd (a, b) = ggd (a − b, b) als a > b .
Bewijs van Stelling 1
2. Als c een deler is van a en van b, dan is c ook een deler van a-b. Stel a = k ⋅ c en
b = l ⋅ c , dan is a − b = k ⋅ c − l ⋅ c = (k − l ) ⋅ c
3. Als c een deler is van a en van b, dan is c ook een deler van a+b (zelfde manier).
4. Als c een deler is van a − b en b, dan is c ook een deler van a (door 2. ( a − b )+b=a)
5. uit 1. en 3. volgt dat de paren (a,b) en ( a − b ,b) dezelfde gemene delers hebben, dus is
ggd (a, b) = ggd (a − b, b)
Einde
Bewijs van Stelling 2
Bewijs: Er geldt a ⋅ x = b ⋅ x + k ⋅ p .
a. a ⋅ x = b ⋅ x + k ⋅ p
b. a ⋅ x − b ⋅ x = k ⋅ p
c. (a − b) ⋅ x = k ⋅ p
d. p is een deler van a-b of p is een deler van x. Maar p is geen deler van x want
dan zou gelden x ≡ 0 (mod p ) . Dus is p een deler van a-b en geldt a − b = l ⋅ p
e. a − b = l ⋅ p
f. a = b + l ⋅ p
g. a ≡ b (mod p )
We hebben nu bewezen dat je de x-en mag wegstrepen als de x niet 0 is.
Bewijs van Stelling 3.
Dit doen we met het uitgebreide algoritme van Euclides. De getallen x en n zijn co-priem, dus
ggd(x,n)=1. Dan vinden we met het algoritme getallen k en l zo dat 1 = k ⋅ x + l ⋅ n . Oftewel
1 ≡ k ⋅ x (mod n) . De l die we vinden is onbelangrijk, maar de k die we vinden met het
algoritme is precies de gezochte x −1 ! Er is overigens maar 1 inverse.Stel dat x 2 verschillende
inverses zou hebben: xa−1 en xb−1 . Dan zou gelden x ⋅ xa−1 ≡ 1 (mod n) en x ⋅ xb−1 ≡ 1 (mod n) . Dan
ook x ⋅ xa−1 ≡ x ⋅ xb−1 (mod n) . We mogen de x wegstrepen links en rechts. Dus xa−1 en xb−1 zijn
aan elkaar gelijk. Er is dus maar 1 inverse!
Bewijs van Stelling 4
We kijken naar de getallen 1, 2,3,..., ( p − 1) . We gaan al deze getallen met x vermenigvuldigen
(x is niet 0). Dan krijgen we de rij 1 ⋅ x, 2 ⋅ x,3 ⋅ x,..., ( p − 1) ⋅ x . Voor deze rij geldt:
• Geen enkel getal in de rij is gelijk aan 0: Noem het getal waarmee je x
vermenigvuldigt a. ax ≡ 0 (mod p ) betekent dat ax door p gedeeld kan worden. Als ax
door p gedeeld kan worden kan a gedeeld worden door p of x kan gedeeld worden
door p. Dus a ≡ 0 (mod p ) of x ≡ 0 (mod p ) . Dit kan allebei niet.
- 17 -
Alle getallen in de rij zijn verschillend: Neem 2 getallen in de rij, a ⋅ x en b ⋅ x ( a ≠ b ).
Als a ⋅ x ≡ b ⋅ x (mod p ) dan geldt a ≡ b (mod p ) want je kan links en rechts door x
delen. Dus alle getallen 1 ⋅ x, 2 ⋅ x,3 ⋅ x,..., ( p − 1) ⋅ x zijn verschillend.
We kijken even hoe dit er in de praktijk uit ziet. Neem bijvoorbeeld p = 11 . Bovenaan staat
de rij 1, 2,3,..., ( p − 1) . Daaronder staan de rijen die je krijgt door te vermenigvuldigen met 1,
2, 3 enz. Je ziet in dit voorbeeld:
• er zijn geen nullen.
• in een rij staan nooit twee dezelfde getallen.
•
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
2
4
6
8
10
1
3
5
7
9
3
6
9
1
4
7
10
2
5
8
4
8
1
5
9
2
6
10
3
7
5
10
4
9
3
8
2
7
1
6
6
1
7
2
8
3
9
4
10
5
7
3
10
6
2
9
5
1
8
4
8
5
2
10
7
4
1
9
6
3
9
7
5
3
1
10
8
6
4
2
10
9
8
7
6
5
4
3
2
1
Als je in deze tabel alle getallen uit een willekeurige rij of kolom met elkaar vermenigvuldigt,
krijg je altijd 10!= 3628800 als uitkomst. Dit idee passen we toe op de rijen 1,2,…,p-1 en
1 ⋅ x, 2 ⋅ x,3 ⋅ x,..., ( p − 1) ⋅ x . Omdat we net hebben bewezen dat in de twee rijen precies
dezelfde getallen voorkomen (in een andere volgorde) moeten hun producten gelijk zijn:
1 ⋅ 2 ⋅ 3 ⋅ ... ⋅ ( p − 1) = 1 ⋅ x, 2 ⋅ x,3 ⋅ x,..., ( p − 1) ⋅ x (mod p )
We kunnen 1, 2, 3, enz. wegstrepen en houden over 1 ≡ x p −1 (mod p) . En dit is wat we
moesten bewijzen.
Einde bewijs van Stelling 4.
Bewijs van stelling 6
x ≡ y (mod p )
x= y+k⋅ p
x− y = k⋅ p
x − y is deelbaar door p.
x − y is ook deelbaar door q (op dezelfde manier). Omdat p en q co-priem zijn is x − y ook
deelbaar door pq.
x − y = l ⋅ p⋅q
x ≡ y (mod p ⋅ q )
Einde bewijs van Stelling 6.
- 18 -
Download