In dieser Folge soll es um die Verhinderung der in About Security #77 vorgestellten Angriffe auf RSA gehen.
Um den Angriff auf RSA als Konzelationssystem zu verhindern, wird es zuerst zu einem indeterministischen Konzelationssystem gemacht, indem bei der Verschlüsselung mit jedem Klartextblock eine neue Zufallszahl verschlüsselt wird. Dadurch ergeben gleiche Klartextblöcke unterschiedliche Schlüsseltextblöcke.
Um aktive Angriffe zu verhindern, wird jedem Klartextblock vor der Verschlüsselung Redundanz hinzugefügt, die beim Entschlüsseln geprüft wird. Dabei darf die modulare Multiplikation zweier Klartextblöcke mit Redundanz keinen dritten Klartextblock mit passender Redundanz ergeben.
Die Redundanz kann z.B. erzeugt werden, indem auf den Klartextblock eine kollisionsfreie Hashfunktion (dazu demnächst mehr) angewendet und das Ergebnis an den Klartextblock angehängt wird. Um die multiplikative Struktur von RSA aufzuheben, muss die multiplikative Struktur der Hashfunktion (sofern vorhanden) eine andere als die von RSA sein.
Der Einsatz von RSA als Konzelationssystem erfolgt dann folgendermaßen:
- Verschlüsselung:
- Vor den Klartextblock m wird eine Zufallszahl z
geschrieben:
z, m - Eine kollisionsfreie Hashfunktion h wird auf
Zufallszahl und Klartextblock angewendet und das Ergebnis hinter
den Klartextblock geschrieben:
z, m, h(z,m) - Alle drei Komponenten werden gemeinsam modular mit c
exponentiert:

- Vor den Klartextblock m wird eine Zufallszahl z
geschrieben:
- Entschlüsselung:
- Der Schlüsseltextblock wird modular mit d
exponentiert:

- Es wird geprüft, ob sich bei der Anwendung der
Hashfunktion h auf die ersten beiden Komponenten die dritte
Komponente ergibt:
h(z, m) = y ? - Nur wenn dies zutrifft, wird die zweite Komponente ausgegeben.
- Der Schlüsseltextblock wird modular mit d
exponentiert:
N E U ! Security aktuell
Täglich aktuelle Security-Infos!
Um beim Einsatz von RSA als digitales Signatursystem ein Rückwärtsrechnen zu verhindern und die multiplikative Struktur von RSA aufzuheben, wird vor der Berechnung der Signatur eine kollisionsfreie Hashfunktion auf den zu signierenden Textblock angewandt. Arbeitet die Hashfunktion mit Argumenten beliebiger Länge hat dies zusätzlich den Vorteil, dass dadurch unbeschränkt lange Texte ohne vorherige Aufteilung in passende Blöcke signiert werden können. Ist die Hashfunktion außerdem noch schneller zu berechnen als RSA, beschleunigt dies auch das Gesamtsystem gegenüber einem alleinigen Einsatz von RSA.
Der Einsatz von RSA als digitales Signatursystem erfolgt dann folgendermaßen:
- Signieren:
- Auf den zu signierenden Textblock m wird eine kollisionsfreie
Hashfunktion h angewendet:
h(m) - Das Ergebnis wird modular mit s exponentiert:

- Auf den zu signierenden Textblock m wird eine kollisionsfreie
Hashfunktion h angewendet:
- Testen:
- Die empfangene Signatur wird mit t modular
exponentiert:
- Es wird geprüft, ob die Anwendung der Hashfunktion
h auf den Textblock das gleiche Ergebnis wie der
übertragene Wert y ergibt:
h(m) = y ? - Nur wenn dies zutrifft, wird "richtig" ausgegeben.
- Die empfangene Signatur wird mit t modular
exponentiert:
Ein hybrides Verschlüsselungsverfahren
Dass bei einem hybriden Verschlüsselungsverfahren ein symmetrisches und ein asymmetrisches Verfahren kombiniert werden, wurde bereits in About Security #75 kurz erwähnt. Im Folgenden soll das Vorgehen eines hybriden Verschlüsselungsverfahren beschrieben werden.
Als Algorithmen sollen AES als symmetrisches und RSA als asymmetrisches System verwendet werden. Die folgenden Aussagen gelten natürlich auch für alle anderen Systeme.
Die verschiedenen Funktionen werden folgendermaßen bezeichnet:
- AESver(k, m)
- ist die AES-Verschlüsselung des Blocks m mit dem Schlüssel k,
- AESent(k, m')
- entsprechend die AES-Entschlüsselung eines verschlüsselten Blocks m'.
- RSAver(c, m)
- ist die RSA-Verschlüsselung des Blocks m mit dem öffentlichen Schlüssel c,
- RSAent(d, m')
- entsprechend die RSA-Entschlüsselung eines verschlüsselten Blocks m'.
Das hybride Verfahren (Gesamtbild) läuft dann folgendermaßen ab:
- Verschlüsselung:
- Erzeugung eines zufälligen Schlüssels k für die AES-Verschlüsselung
- AES-Verschlüsselung des Klartexts m mit Schlüssel
k:
AESver(k, m) =: m' - RSA-Verschlüsselung des (geheimzuhaltenden) Schlüssels
k mit dem öffentlichen Schlüssel c des
Empfängers:
RSAver(c, k) =: k' - Verbinden von m' und k' und Übertragung an
den Empfänger:
(m', k')
- Entschlüsselung:
- RSA-Entschlüsselung der 2. Komponente (= der Schlüssel
für AES) der empfangenen Nachricht mit dem privaten
Schlüssel des Empfängers:
RSAent(d, k') =: k - AES-Entschlüsselung der 1. Komponente mit dem soeben
entschlüsselten Schlüssel k:
AESent(k, m') =: m
- RSA-Entschlüsselung der 2. Komponente (= der Schlüssel
für AES) der empfangenen Nachricht mit dem privaten
Schlüssel des Empfängers:
Soll zusätzlich die Integrität des Klartexts sichergestellt werden, muss der Sender ihn vor dem Verschlüsseln mit seinem geheimem Schlüssel signieren. Danach werden Klartext und Signatur gemeinsam verschlüsselt. Der Empfänger prüft nach dem Entschlüsseln die Signatur mit dem öffentlichen Schlüssel des Senders. Zum Ablauf siehe hier.
Nach der Beschreibung asymmetrischer Verfahren stellt sich die Frage, wie Sender und Empfänger an die benötigten öffentlichen Schlüssel ihrer jeweiligen Kommunikationspartner gelangen und dabei sicherstellen, ob wirklich die richtigen Schlüssel verwendet werden. Dies ist das Thema der nächsten Folge.
Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen!


















Neuen Kommentar verfassen