Snel Grootste Gemene Delers uitrekenen

advertisement
Snel Grootste Gemene Delers uitrekenen
Technische Universiteit Eindhoven: Bachelorproject
Bouke Cloostermans 0640381
19 juni 2012
Tijdens mijn bachelorproject heb ik mij bezig
gehouden met het uitrekenen van Grootste Gemene Delers (GGD’s). De GGD van twee getallen
is het grootste getal dat beide getallen deelt.
Bijvoorbeeld, de GGD van 12 en 8 is 4.
Het uitrekenen van een GGD is niet heel moeilijk.
Er zijn documenten uit het jaar 300 B.C. waarin
al het algoritme van Euclides staat om de GGD
van twee getallen uit te rekenen. Een algoritme
is een stappenplan om een probleem systematisch
op te lossen. Dit algoritme wordt vandaag de dag
nog steeds gebruikt, dus waarom zou je hier nog
dingen willen verbeteren?
Het nadeel van het algoritme van Euclides is dat
het naarmate de twee getallen waarmee je begint
groter worden het heel veel langzamer wordt om de
GGD van de getallen uit te rekenen. Ik heb tijdens
mijn bachelorproject twee algoritmes bestudeerd
en hiervoor een computerprogramma gemaakt die
weliswaar voor kleine getallen langzamer zijn dan
het algoritme van Euclides maar naarmate de
getallen groter worden hebben ze weinig extra tijd
nodig. Deze algoritmes zijn dus uitermate geschikt
voor het uitrekenen van GGD’s van zeer grote
getallen.
Deze algoritmes zijn recursieve algoritmes. Dat
wil zeggen: ze herhalen zichzelf een aantal keren
met een steeds eenvoudiger wordend probleem. Zo
begin je met twee hele grote getallen waarvan je de
GGD wil weten, bijvoorbeeld getallen van 10000
cijfers. Het recursieve algoritme versimpelt deze
eerst naar 5000, dan naar 2500 enzovoorts. Zo
wordt het probleem snel veel eenvoudiger.
In het plaatje kun je zien hoe snel de algoritmes
zijn voor verschillende groottes van getallen. Je
ziet dat BinaryGCD (het algoritme van Euclides)
in het begin nog snel is maar voor grote getallen
uiteindelijk verliest van de andere twee algoritmes.
Figuur 1: De oplostijd van de algoritmes (n is het
aantal cijfers van de getallen waarvan je de GGD
uitrekent, T (n) is de oplostijd)
Wat RSA doet is twee hele grote priemgetallen
(getallen die alleen deelbaar zijn door 1 en zichzelf) pakken en deze vermenigvuldigen. De uitkomst hiervan wordt dan vrijgegeven voor iedereen,
maar de twee priemgetallen blijven geheim. De code is dan zo gemaakt dat je iets kan versleutelen
met het grote getal, maar het lezen van versleutelde informatie kan alleen als je beide priemgetallen
hebt. Het is momenteel nog heel moeilijk om deze berekening om te draaien, dus van de uitkomst
weer terug gaan naar de twee priemgetallen. Dat is
waar de veiligheid van RSA op is gebaseerd.
Wat ik heb gedaan is heel veel RSA sleutels (vermenigvuldigingen van twee priemgetallen) verzamelen
en vervolgens de grootste gemene deler tussen deze
getallen bepalen. Op deze manier zouden sommige
sleutels kunnen worden gekraakt.
Dit blijkt echter alleen zo te zijn als de sleutels niet
heel slim (niet willekeurig genoeg) zijn gemaakt,
maar de sleutels die niet slim genoeg zijn gemaakt
zijn dus wel degelijk te kraken.
In een vergelijkbaar onderzoek van een jaar terug
bleek dat met deze strategie ongeveer 0,2% van alle
RSA sleutels te kraken waren. Dat lijkt niet veel,
maar elke onveilig sleutel zou bijvoorbeeld een lek
in de website van een bank kunnen zijn, en dan is
een enkele onveilige sleutel al te veel!
Het tweede deel van mijn bachelorproject ging
hier op door. Het ging niet meer GGD’s uitrekenen
van twee getallen, maar van heel veel getallen.
Hiermee heb ik een algoritme geformuleerd dat
sommige codes van RSA (het meest gebruikte
algoritme voor beveiliging op internet) kan kraken.
1
Download