Der RSA Algorithmus ist der aktuell am weitesten verbreitete asymmetrische Verschlüsselungsalgorithmus und wird etwa für die SSL/TLS Verschlüsselung beim HTTPS-Protokoll verwendet. Der Algorithmus wurde 1977 von Ronald Rivest, Adi Shamir und Leonard Adlerman unter dem Namen RSA entwickelt und publiziert1.
Funktionsweise
Die Funktionsweise basiert darauf, dass es leicht ist, zu berechnen, aber praktisch unmöglich, ohne den privaten Schlüssel d
die Umkehrfunktion zu berechnen.
- n
- öffentliche Zahl
- e
- öffentlicher Schlüssel des Empfängers
- d
- privater Schlüssel des Empfängers
- Klartext
- c
- Geheimtext
Verschlüsselung
Zur Verschlüsselung berechnet Bob den Geheimtext c
:
Wobei mod
der Ganzzahlige Rest bei der Division mit n
darstellt. Beispiel: , da .
Die Zahl ist das Produkt von zwei verschiedenen Primzahlen und , diese sind geheim. Wie können und geheim sein, wenn doch öffentlich ist? Dies beruht nur darauf, dass die Primfaktorzerlegung von zu rechenaufwendig ist, da sehr gross ist (z.B. 1024
Bit lang).
Für die Zahl e
muss gelten
Hierbei ist
die Anzahl der zu n teilerfremden Zahlen, die kleiner als n sind.
Entschlüsselung
Der Empfänger hat als privaten Schlüssel eine Zahl mit
daher
für irgend ein .
Ist , so gilt nach einem Satz von Euler für alle Zahlen mit und für alle natürlichen Zahlen :
Zur Entschlüsselung berechnet der Empfänger also
und erhält damit den Klartext .
Die RSA Schlüssel haben standardmässig 1024
oder 2048
bits, wobei Schlüssel mit 1024
bits mittelfristig als knackbar erachtet werden, so dass die Industrie heute oft mindestens 2048
bits voraussetzt.
RSA in Python
Schlüsselerzeugung:
Als erstes wählt man zwei Primzahlen und und berechnet daraus
und
Nun muss man ein Zahlenpaar und finden, die bezüglich multiplikativ invers zueiunander sind. Das bedeutet, dass gilt:
Das Zahlenpaar findet man mit dem sogenannten erweiterten euklidschen Algorithmus:
Erster Versuch: 3 hat kein multiplikatives inverses bezüglich
Zweiter Versuch: 5 hat auch kein multiplikatives inverses bezüglich
Dritter Versuch: 7 hat ein multiplikatives inverses bezüglich .
(Nebenbei: Der Grund, warum es mit 3 und 5 nicht geklappt hat: Die Zahlen müssen zu teilerfremd sein, aber 120 ist durch 3 und 5 teilbar)
Kurze Überprüfung: Ist das Produkt von und modulo tatsächlich 1?
Verschlüsselung
Der öffentliche Schlüssel besteht nun aus den Zahlen und . Diesen darf jeder wissen.
Der private Schlüssel besteht aus den Zahlen und . Dieser muss geheimgehalten werden.
Mit dem RSA-Verfahren lassen sich nun Zahlen von 0 bis (n-1) verschlüsseln.
Um eine Nachricht zu verschlüsseln, muss man folgendes berechnen:
Resultat ist eine verschlüsselte Nachricht
Entschlüsseln
Um die verschlüsselte Nachricht zu entschlüsseln, muss man folgendes berechnen:
Praktische Anwendung: Text mit RSA verschlüsseln:
Um einen Text mit RSA zu verschlüsseln hat man nun zahlreiche Möglichkeiten. Hier ist nur ein Beispiel:
Zunächst wandeln wir jeden Buchstaben der Nachricht 'HALLO'
in eine Zahl um:
Mit der Python-Funktion bin
machen wir daraus Binärzahlen in form eines strings
, allerdings brauchen wir die zwei ersten Zeichen 0b
, die Python vor jede Binärzahl schreibt nicht und zwacken diese ab. Ausserdem füllen wir die Zahl mit zfill
immer mit Nullen auf 5 Stellen auf. Warum 5 Stellen? Weil man für 26 Buchstaben mindestens 5 Bit (= 32 Möglichkeiten) braucht:
Aus diesen 5-Stelligen Binärzahlen machen wir 7-Stellige Binärzahlen, indem wir die Bits einfach der Reihe nach lesen. Falls es nicht aufgeht, hängen wir einfach noch Nullen dran.
Warum 7 Bit? Weil für dieses Beispiel ist, worin 127 (grösste Zahl mit 7 bit) gerade Platz hat. Das Resultat sind 4 Zahlen:
Diese vier Zahlen werden nun einzeln RSA-Verschlüsselt:
Am anderen Ende können die Zahlen wieder einzeln entschlüsselt werden:
Die Zahlen werden wieder binär umgewandelt, diesmal auf 7 Stellen mit Nullen gefüllt:
Aufgeteilt in 5-Stellige Binärzahlen erhalten wir die ursprünglichen Zahlen und daraus die ursprünglichen Buchstaben:
Sicherheit
Warum ist dies sicher? Dieses Beispiel wäre natürlich nicht sicher, weil die Primzahlen viel zu klein sind, aber bei grossen Primzahlen und würde es viel zu lange dauern, diese Teiler nur aus zu bestimmen.
Um dies zu verdeutlichen hier eine naive Funktion factors
, die die Teiler einer Zahl zurückgibt, falls sie exisiteren. In der Zelle darunter wird diese Funktion benutzt, um Primzahlen zu finden indem einfach eine Zahl nach der anderen durchprobiert wird. Wird eine Primzahl gefunden, verdoppeln wir unseren Kandidaten und suchen von dort aus weiter.
Am Anfang geht das ganze recht schnell, aber schon bald dauert es ewig lange, um die nächste Primzahl zu finden. Einerseits, weil es immer weniger Primzahlen gibt, aber andererseits wird die factors
-Funktion immer langsamer.
Quelle: techtarget.com
⭐ RSA Algorithmus