RSA visuell und mehr
Didaktische Aufbereitung von RSAInterne ID | Name | Schlüsseltyp | Erstellt | Schlüssel | Aktion |
---|
- Verfügbare Kommandos: 'openssl help'
- Build-Informationen: 'openssl version -a'
Hintergrund
Das 1977 entwickelte RSA-Verfahren[1] ist ein asymmetrisches Krypto-Verfahren, welches auch heute noch sehr verbreitet ist – sowohl zum Verschlüsseln von Nachrichten als auch zum Erstellen von digitalen Signaturen. Benannt wurde das Verfahren nach seinen Entwicklern R. Rivest, A. Shamir und L. Adleman.
Dieses Plugin ist eine Web-Applikation, die pur lokal im Browser läuft. Sie hilft mit drei unterschiedlichen Ansätzen, das RSA-Verfahren zu verstehen.
Anmerkung: Ausführlicher noch als hier im zweiten Tab wird RSA samt Formeln im Plugin RSA (Schritt-für-Schritt) erklärt.
Über das Plugin
Das Plugin bietet Zugang zu RSA auf drei Arten, die sich ergänzen und jeweils in einem eigenen Unter-Tab (Reiter) dargestellt sind:
- RSA visuell zeigt grafisch, wie die (Zahlen-)Werte von Klartext und Geheimtext einander zugeordnet werden und bereitet die Eingabe der RSA-Parameter didaktisch auf.
- RSA didaktisch zeigt den RSA-Algorithmus in "Reinform" (das sogenannte Textbook-RSA) mit Schlüsselgenerierung und Ver- und Entschlüsselung.
- RSA reale Nutzung: Neben den beiden didaktischen Tabs zeigt das dritte Tab, wie RSA in der Praxis mit Hilfe von OpenSSL eingesetzt wird (um Schlüssel für Webserver zu erstellen, um sie schützen und zu speichern, um Zertifikate weiter zu geben und dass beim Verschlüsseln gepadded wird).
RSA visuell
Dieser Tab besteht aus einem oberen und einem unteren Teil. Im oberen Teil kann man die RSA-Parameter p
und q
eingeben und sich die Schlüsselparameter e
, d
, n
generieren lassen oder diese auch eingeben. Die Parameter e
, d
, n
und φ(n)
(oder lcm
) sind solange deaktiviert, bis für p
und q
valide Primzahlen eingegeben wurden. Durch eine valide Eingabe für die Primzahlen werden zunächst die Eingaben der zwei Parameter φ(n)
(oder lcm
) und n
aktiviert. Sind diese auch valide, werden die letzten Elemente e
und d
aktiviert. Außer bei den Primzahlen ist es bei den anderen Parametern möglich, sich die Felder automatisch ausfüllen zu lassen. Dies passiert durch das Drücken des Stift-Symbols rechts von der Eingabe. Das Parameterpaar (e
,n
) bezeichnet man als öffentlichen RSA-Schlüssel, das Parameterpaar (d
,n
) bezeichnet man als privaten RSA-Schlüssel.
Mit der Schaltfläche "Zufällige Schlüsselparameter generieren" kann man sich auch alle Parameter neu generieren lassen. Im linken Tab wird aus didaktischen Gründen mit kleinen Primzahlen gearbeitet. Ein typisches (p,q)-Paar ist (5,11). Das ergibt für phi(n)=40 und n=55; und für (e,d) dann bspw. (3,27), (7,23), (13,37), ...
Im unteren Teil kann man das RSA-Verfahren mit einem korrekten Schlüsselpaar visualisieren. Dazu werden valide Schlüssel automatisch für die Visualisierungen übernohmen. Zu beachten ist, dass der Schlüsselparameter n
in der Visualisierung kleiner oder gleich 200 sein muss. Für höhere Werte von n
würde die Übersichtlichkeit der Visualisierungen verloren gehen. Wird versucht, einen Wert für n
größer 200 zu übernehmen, kommt eine Warnung.
Es gibt zwei Arten der Visualisierung: Man kann das RSA-Verfahren in einer zweizeiligen Zuordnung (two-line assignment) oder in einer Kreis-Zuordnung (circle assigment) darstellen. Jeweils kann man zwischen Ver- und Entschlüsselung wählen. Die two-line-assignment-Darstellung zeigt deutlicher, dass RSA auch Fixpunkte hat; die circle-assigment-Darstellung spiegelt die Modulo-Rechnung in einem endlichen Körper besser wieder.
Die Grafik und Anzeigen der Rechenschritte rechts daneben sind dynamisch und synchron dargestellt. Hierbei besteht die Möglichkeit, mit Hilfe der Schaltflächen unterhalb der Grafik die Darstellung zu starten, einen Schritt zurück oder vorwärts zu gehen und die gesamte Visualisierung zurücksetzen. Außerdem kann man die Schnelligkeit einer automatischen Ausführung einstellen.
RSA didaktisch
Hier im zweiten Tab ist zu Lehr- und Lernzwecken der RSA-Algorithmus "in Reinform" (Textbook-RSA) implementiert (was dann in der Realität noch hinzukommt, kann man dann im dritten Tab "RSA reale Nutzung" ausprobieren). Trotzdem können auch hier SEHR große Zahlen verwendet werden (wie in realen RSA-Anwendungen).
Eine alternative Darstellung des RSA-Algorithmus finden Sie in CrypTool-Online in dem Plugin RSA Schritt-für-Schritt.
Der Haupt-Tab "RSA didaktisch" hat die drei Unter-Tabs "Schlüsselgenerierung", "Verschlüsselung" und "Schlüssel".
Im Unter-Tab Schlüsselgenerierung wird das RSA-Schlüsselpaar erzeugt. Die Parameter dafür kann man manuell eingeben oder sie sich erzeugen lassen. Dabei kann man den Bereich (Range) angeben, in dem die Primzahlen p
und q
liegen sollen.
Im Unter-Tab Schlüssel wird der interne Schlüsselspeicher dargestellt. Er kann mehrere Schlüssel für verschiedene Namen enthalten. Mit den Icons in der selektierten Zeile kann man den jeweiligen Schlüssel herunterladen oder löschen. Alternativ kann man mehrere Schlüssel ankreuzen und diese mit den Schaltflächen "Exportiere ausgewählte Schlüssel" auf einmal herunterladen bzw. mit "Lösche ausgewählt Schlüssel" auf einmal löschen. Zusätzlich kann man mit der Schaltfläche "Importiere" Schlüssel in den Schlüsselspeicher hochladen. So können Schüler im Unterricht öffentliche Schlüssel miteinander austauschen.
Die Schlüssel-Dateien müssen zum erfolgreichen Import folgendermaßen aufgebaut sein:
[
{
"name": "Alice",
"keytype": "public",
"keys": {
"e": "65537",
"n": "49163"
}
}
]
Im Unter-Tab Verschlüsselung stehen zur Ver- und Entschlüsselung mehrere Optionen zur Verfügung: Man kann unter anderem zwischen der ASCII-256-Codierung und einem selbst definierten Alphabet wählen. Beim selbst-definierten Alphabet wird darauf geachtet, dass keine doppelten Zeichen vorkommen. Bei doppelt eingegebenen Zeichen werden diese Zeichen aus dem Alphabet entfernt und anschließend in einer Informationsbox angezeigt.
Zudem kann man festlegen, mit welchem Trennzeichen (Separator) markiert werden soll, wo ein Block endet. Als Standard ist das Zeichen Komma (",") festgelegt. Alternativ kann man eines der zwei Zeichen Leerzeichen (" ") oder Raute ("#") auswählen.
Die Parameter d
, e
, n
zum Ver- und Entschlüsseln können nur aus einem Schüssel kommen, der entweder vorher erzeugt (im Unterreiter Key generation) oder der als Datei hochgeladen wurde. Anmerkung: Zum Verschlüsseln reicht es, wenn man nur einen öffentlichen Schlüssel hat.
Anschließend ist die Methode zur Umwandlung der Buchstaben (Zeichenfolge zu Ganzzahl) auszuwählen. Als Standardmethode ist b-adisch ausgewählt. Eine weitere Methode ist das Basensystem (welches auch als Verkettung geschrieben werden kann). Abhängig von der Bitlänge des RSA-Moduls n
und der Alphabetlänge wird die maximale Blocklänge (Anzahl der Buchstaben, die zu einer Gesamtzahl zusammengefasst werden) bestimmt. Diese Obergrenze stellt sicher, dass der Zahlenwert eines Blocks immer kleiner n
ist. Zwischen den möglichen Blocklängen kann dann ausgewählt werden, wenn die maximale Blocklänge größer 1 ist.
Wenn das Alphabet selbst festgelegt wurde und die gewählte Blocklänge k
größer als 1 ist, werden nach der Umwandlung der Buchstaben in Zahlen jeweils k
dieser Einzelzahlen zu einer Gesamtzahl zusammengefasst. Für die Umwandlung sind zwei Varianten implementiert: b-adisch (wobei b
die Anzahl der Buchstaben im Alphabet ist) und das Basensystem.
Im folgenden Beispiel hat das Alphabet 27 Zeichen und die Zeichen haben die Zahlenwerte von 0 bis 26 (<Leerzeichen>
= 0, A
= 1, ..., Z
= 26). Die Nachricht ATTACK AT DAWN
, zerlegt in Blöcke der Länge 2, ergibt: AT # TA # CK # <Leerzeichen>A # T <Leerzeichen> # DA # WN
.
Die Umwandlung der Einzelbuchstaben in Zahlen ergibt erst mal:
01 20 # 20 01 # 03 00 # 01 20 # 00 04 # 01 23 # 14 00
(Bei der Umwandlung von Klartext in Zahlen schreibt man die Zahlen mit führenden Nullen damit sie immer die gleiche Länge haben).
Wie man aus den Einzelzahlen eines Blockes eine Gesamtzahl generiert, mit der dann gerechnet werden kann, wird durch die Umwandlungsmethoden "b-adisch" oder "Basensystem" festgelegt:
- Beispiel b-adisch: Umwandlung der Einzelzahlen nach der b-adischen Formel (jeder neue Block im Beispiel besteht aus zwei Buchstaben). Die Base
b
ist die Alphabetlänge (hier 27). Das Ganze ergibt ein Stellenwertsystem, bei dem die Buchstaben von rechts beginnend bei 0 indiziert werden:
<Buchstabe1>
*b
1 +<Buchstabe0>
*b
0
⇔A
*b
1 +T
*b
0
⇔A
* 271 +T
* 270
⇔ 1 * 271 + 20 * 270
⇔ 27 + 20
⇔ 47
- Beispiel Basensystem (10
l
-System) ("Verkettung"): Umwandlung der Einzelzahlen nach der Basensystem-Methode (wählel
so, dass gilt: 10l
>= Alphabetlänge). Wenn die Alphabetlänge 27 ist, mussl
=2 sein, da 102 = 100 > 27. Wir bezeichnen jetzt den Wertb
= 10l
= 100 als Base.
<letter1>
* 1001 +<letter0>
* 1000 liefert die Codierung
⇔A
*b
1 +T
*b
0
⇔A
* 1001 +T
* 1000
⇔ 1 * 1001 + 20 * 1000
⇔ 100 + 20
⇔ 120
Analog für alle Einzelzahlen errechnet man die folgenden Gesamtzahlen des Klartexts:
0120 # 2001 # 0311 # 0001 # 2000 # 0401 # 2314
Diese Art der Umwandlung ist nicht optimal, da sie Gesamtzahlen generiert, die nicht mehr möglichst klein sind.
An Stelle der Rechnung kann man die Einzelzahlen auch einfach verketten, da die Einzelzahlen nach dem 10er-System aufgebaut sind. Wenn die Anzahl der Dezimalstellen bei der Verkettung kleiner als die Länge
l
(hierl
=2) ist, muss man der Einzelzahl eine führende Null voranstellen. Falls z.B.l
=3 wäre, so kann es sein, dass man sogar 2 führende Nullen voranstellen muss: ausA
=1 wird 001, ausB
=2 wird 002, etc. Die führenden Nullen sind nur notwendig, wenn man die Einzelzahlen ohne Basensystemumrechnung verkettet. Rechnet man mit dem Basensystem braucht man keine führenden Nullen schreiben.
Das Zahlensystem (dezimal, oktal, binär und hexadezimal) hat keinen Einfluss auf die Klartextbuchstaben-Blocklänge und auf die Umwandlung in Zahlenwerte, sondern dient nur zur Darstellung/Codierung der Zahlen. Die Länge des Geheimtexts ändert sich allerdings, wenn man das Zahlensystem ändert.
RSA reale Nutzung
In diesem Tab kann man mit OpenSSL das RSA-Verfahren wie in der Praxis anwenden, um Schlüssel zu generieren und zu managen oder um Texte/Dateien zu ver- und entschlüsseln. Anders als im Tab "RSA didaktisch" wird der Input vor der Verschlüsselung gepadded und Hybridverschlüsselung eingesetzt: Mit RSA verschlüsselt man nur den zufällig erzeugten Sessionkey; die eigentlichen Daten werden mit einem symmetrischen Verfahren wie AES verschlüsselt und der Sessionkey dient als symmetrischer Schlüssel.
Die Basis dafür bietet die Open-Source-Software OpenSSL[2].
Der Haupt-Tab "RSA reale Nutzung" hat vier Unter-Tabs: "Schlüsselgenerierung", "Verschlüsselung", "Erstelle config-Dateien" und "Dateien".
Unter-Tab RSA-Schlüsselgenerierung
Im ersten Unter-Tab kann man sich mit Hilfe der GUI und OpenSSL entweder RSA-Schlüsselpaare oder X.509-Zertifikate generieren lassen. Dieser Tab implementiert die Kommandos genrsa
, rsa
und req
aus OpenSSL. Um einen RSA-Schlüssel zu erzeugen wird das Kommando genrsa
benutzt. Mit dem Kommando rsa
kann man unter anderem Informationen zum RSA-Schlüssel anzeigen lassen. Das Kommando req
wird zur Erstellung von Zertifikaten benutzt. Wurde ein privater Schlüssel generiert, kann man sich den dazugehörigen öffentlichen Schlüssel als eigene Datei generieren lassen.
Folgende Optionen[3] sind in der GUI verfügbar:
Kommando | Option/Argument | GUI-Option | Funktion |
---|---|---|---|
genrsa | [numbits] | Schlüssellänge | Bitlänge des privaten Schlüssels |
-out <Dateiname> | Ausgabedatei | Name der Ausgabedatei | |
rsa | -in <Dateiname> | Privater Schlüssel | Ausgabe des privaten Schlüssels |
-pubin | Öffentlicher Schlüssel | Ausgabe des öffentlichen Schlüssels | |
-pubout | Öffentlicher Schlüssel | Erzeugen des öffentlichen Schlüssels | |
-text | Informationen | Ausgabe von Schlüsselinformationen (privat und öffentlich) | |
-noout | Informationen | Keine Ausgabe des Schlüssels (privat u. öffentlich) | |
req | -key <Dateiname> | Privater Schlüssel | Eingabe des privaten Schlüssels |
-out <Dateiname> | Ausgabedatei | Name der Ausgabedatei | |
-config <Dateiname> | Konfigurationsdatei | Eingabe der Konfigurationsdatei | |
-x509 | Ausgabe | Ausgabe eines selbstsignierten Zertifikats anstelle einer Zertifikatsanforderung |
Unter-Tab Verschlüsselung
Hier kann man Texte oder Dateien mit Hilfe der GUI und OpenSSL ver- und entschlüsseln. Dateien können aus dem internen Speicher ausgewählt werden (Achtung, dies ist nicht derselbe Speicher, der im Tab "RSA didaktisch" für die Schlüssel benutzt wird). Dazu wird das OpenSSL-Kommando pkeyutl
benutzt.
Folgende Optionen[3] sind in der GUI für dieses Kommando verfügbar:
Option/Argument | GUI-Option | Funktion |
---|---|---|
-encrypt | Modus | Verschlüsselt die Eingabe |
-decrypt | Modus | Entschlüsselt die Eingabe |
-in <Dateiname> | Eingabe | Name der Eingabedatei |
-out <Dateiname> | Ausgabedatei | Name der Ausgabedatei |
-pubin | Öffentlicher Schlüssel | Eingabe ist ein öffentlicher Schlüssel |
-inkey | Schlüssel | Eingabe des öffentlichen/ privaten Schlüssels |
-hexdump | Ansicht der Ausgabe | hexadezimale Ansicht der Ausgabe |
Unter-Tab Erstelle config-Dateien
Leider funktionieren momentan mit WebAssembly Terminal-Kommandos, die Nutzerabfragen tätigen, nicht wie auf der normalen Bash-Shell. Die Erstellung von X.509-Zertifikaten wird deshalb mit config-Dateien ausgeführt. Diese config-Dateien kann man hochladen oder in diesem Reiter selbst erstellen.
Unter-Tab Dateien
Für die übergreifende Nutzung von Dateien im Reiter "RSA reale Nutzung" wird ein interner Dateien-Speicher verwendet. Darin sind alle Dateien zu finden, die mit Hilfe von OpenSSL erstellt oder hochgeladen wurden (also z.B. config-Dateien für die Schlüssel-Generierung, pem-Dateien mit den Schlüsseln zur Verwendung bei der Verschlüsselung oder die Daten-Dateien, die verschlüsselt werden sollen). Für jede Datei wird überprüft, ob es sich um einen RSA-Schlüssel oder ein X.509v3-Zertifikat handelt. Dabei wird OpenSSL im Hintergrund ausgeführt. Handelt es sich um einen RSA-Schlüssel, wird in der entsprechenden Zeile eine dritte Schaltfläche mit einem "i" angezeigt: Klickt man darauf, werden Informationen über den RSA-Schlüssel im Terminal-Fenster angezeigt.
Verwendete Technik
Für RSA visual
Für die Visualisierungen wurde die Bibliothek JSXGraph[4] benutzt. JSXGraph ist eine freie, Browser-übergreifende JavaScript-Bibliothek für interaktive Geometrie, Funktionsplotten, Diagramme und Datenvisualisierung im Webbrowser.
Für RSA didaktisch
Zum Umgang mit SEHR großen Zahlen nutzt dieser Unter-Tab die Langzahl-Arithmetik-Bibliothek BigInteger.js[5].
Für RSA reale Nutzung
Basis dieses Unter-Tabs ist die Open-Source-Software OpenSSL[2]. Dieses weit verbreitete Toolkit dient in erster Linie dazu, eine sichere Datenübertragung im Web zu gewährleisten, indem es die Verschlüsselungsprotokolle SSL/TLS implementiert (nach Schätzungen verwenden 50% aller Webserver weltweit OpenSSL). Zusätzlich gehört zu OpenSSL ein Kommandozeilen-Programm, das man als kryptografisches Werkzeug nutzen kann, u.a. für:
- Ver- und Entschlüsselung
- Berechnung von Hash-Werten
- Erzeugung von Zufallszahlen
- Erzeugung von kryptografischen Schlüsseln
- Erstellung und Verwaltung von digitalen Zertifikaten
- SSL/TLS Client- und Server-Tests
OpenSSL wurde hier mit Hilfe von WebAssembly integriert. Dadurch ist es möglich, OpenSSL-Kommandos rein lokal im Browser auszuführen. In diesem Plugin wird das aktuell stabile Release von OpenSSL (Version 3.0) verwendet. Die Ende September 2021 veröffentlichten Plugins in CrypTool-Online waren die ersten WebAssembly-Portierungen von OpenSSL 3.0 überhaupt.
Im CrypTool-Online-Plugin OpenSSL werden weitere Funktionen von OpenSSL 3.0 in der GUI angeboten.