So kommunizieren Sie den AES-Initialisierungsvektor mit dem Client für das hybride Kryptosystem

8

Ich muss Sicherheit für die Client-Server-Kommunikation implementieren. Ich habe das folgende Hybrid-Kryptosystem

implementiert

Um eine an Alice gerichtete Nachricht in einem hybriden Kryptosystem zu verschlüsseln, macht Bob folgendes:

  1. Erhält den öffentlichen Schlüssel von Alice.
  2. Erzeugt einen frischen symmetrischen Schlüssel für das Datenkapselungsschema.
  3. Verschlüsselt die Nachricht unter dem Datenkapselungsschema unter Verwendung des gerade generierten symmetrischen Schlüssels.
  4. Verschlüsseln Sie den symmetrischen Schlüssel unter dem Schlüsselverkapselungsschema mit dem öffentlichen Schlüssel von Alice.
  5. Schicke diese beiden Verschlüsselungen an Alice.

Um diesen hybriden Geheimtext zu entschlüsseln, macht Alice folgendes:

  1. verwendet ihren privaten Schlüssel zum Entschlüsseln des im Schlüsselkapselungssegment enthaltenen symmetrischen Schlüssels.
  2. verwendet diesen symmetrischen Schlüssel zum Entschlüsseln der Nachricht im Datenkapselungssegment.

Ich verwende RSA für ein Kryptosystem mit öffentlichem Schlüssel und AES für Kryptosystem mit symmetrischem Schlüssel. Alles funktioniert gut, aber ich bin mir nicht sicher, wie man den AES-Initialisierungsvektor behandelt. Momentan verkette ich den AES-Schlüssel und den Initialisierungsvektor mit dem öffentlichen Schlüssel und sende ihn an den Server.

Ich wollte nur ein paar Meinungen zu diesem Ansatz bekommen. Wie dieses Problem von anderen Kommunikationsprotokollen SSL etc gelöst wird.

Danke.

    
Faisal Mansoor 08.10.2009, 21:06
quelle

3 Antworten

9

Sie verschlüsseln die IV nicht. Bündeln Sie es mit dem verschlüsselten Schlüssel und senden Sie es (im Klartext) an den Empfänger.

Standards dafür existieren. Dieses Schema wird im CMS "KeyTransRecipientInfo" genannt (auf dem S / MIME basiert), und PGP bietet einen ähnlichen Modus. TLS enthält auch den Initialisierungsvektor als Parameter in der Schlüsselverschlüsselungsalgorithmus-ID, wobei dieselbe ASN.1-Syntax wie CMS verwendet wird. Eine robuste Open-Source-Bibliothek für diese Operation ist für viele, viele Plattformen verfügbar.

Zumindest könnte das Studium der CMS-Spezifikation dazu beitragen, einige der vielen Fallstricke bei einer hausgemachten Umsetzung zu vermeiden. Siehe §6.1 und §6.2.1 von RFC 3369.

    
erickson 08.10.2009, 21:42
quelle
2

Ich habe das gleiche getan, und ich habe es auf die gleiche Weise gehandhabt - verkette den AES-Schlüssel mit dem IV und verschlüssele sie beide.

Sie können auch einfach den Schlüssel senden und den Schlüssel selbst verwenden, um eine IV zu generieren - zum Beispiel indem Sie die ersten 128 Bits eines Hashs des Schlüssels als IV verwenden. Das sollte in Bezug auf die Sicherheit OK sein, solange Sie einen neuen AES-Schlüssel für jede Sitzung generieren und nicht denselben AES-Schlüssel immer wieder mit demselben IV verwenden.

    
Eric Petroelje 08.10.2009 21:18
quelle
2

Es gibt keinen Grund, die IV zu verschlüsseln - Sie können das im Klartext senden. Stellen Sie sicher, dass Sie jedes Mal ein neues auswählen (genauso wie Sie den AES-Schlüssel verwenden).

Das heißt, es ist oft praktisch, den AES-Schlüssel und IV zusammen zu verpacken. Die Verschlüsselung von 16 Bytes ist nicht so teuer.

    
Keith Randall 08.10.2009 21:22
quelle