Codieren umhüllter Daten

Umhüllte Daten bestehen aus verschlüsselten Inhalten beliebiger Art und verschlüsselten Sitzungsschlüsseln für die Inhaltsverschlüsselung für einen oder mehrere Empfänger. Umgehüllte Nachrichten behalten den Inhalt der Nachricht geheim und erlauben nur bestimmten Personen oder Entitäten, den Inhalt abzurufen.

Kryptografische Nachrichtensyntax (CMS) kann verwendet werden, um umhüllte Nachrichten zu codieren. CMS unterstützt drei Schlüsselverwaltungstechniken: Schlüsseltransport, Schlüsselvereinbarung und zuvor verteilte symmetrische Schlüsselverschlüsselungsschlüssel (KEK). Zuvor verteilte symmetrische KEK werden auch als Verteilung von Adresslistenschlüsseln bezeichnet.

Bei jeder dieser drei Techniken wird ein einzelner Sitzungsschlüssel generiert, um die umhüllte Nachricht zu verschlüsseln. Schlüsselverwaltungsprobleme betreffen die Art und Weise, wie der Sitzungsschlüssel vom Absender verschlüsselt und von einem Empfänger entschlüsselt wird. Eine einzelne verschlüsselte Nachricht kann mithilfe einer Mischung der Schlüsselverwaltungstechniken an viele Empfänger verteilt werden.

Die Schlüsseltransportschlüsselverwaltung verwendet den öffentlichen Schlüssel eines beabsichtigten Empfängers, um den Sitzungsschlüssel zu verschlüsseln. Der Empfänger entschlüsselt den Sitzungsschlüssel mithilfe des privaten Schlüssels, der dem öffentlichen Schlüssel zugeordnet ist, der zum Verschlüsseln verwendet wurde. Der Empfänger verwendet dann den entschlüsselten Sitzungsschlüssel, um die umgehüllten Daten zu entschlüsseln. Wenn der Schlüsseltransport verwendet wird, hat der Empfänger keine Informationen über die Identität des Absenders bestätigt.

Bei der Schlüsselvereinbarungsverwaltung wird ein temporärer, kurzlebiger Diffie-Hellman privater Schlüssel generiert und zum Verschlüsseln des Sitzungsschlüssels verwendet. Der öffentliche Schlüssel, der dem kurzlebigen privaten Schlüssel entspricht, wird als Teil der Empfängerinformationen der Nachricht eingeschlossen. Der Empfänger entschlüsselt den Sitzungsschlüssel mithilfe des empfangenen kurzlebigen Schlüssels und verwendet diesen entschlüsselten Sitzungsschlüssel, um die umhüllte Nachricht zu entschlüsseln. Mithilfe der kurzlebigen Schlüsselvereinbarung in Verbindung mit dem privaten Schlüssel des Empfängers verfügt der Nachrichtenempfänger über bestätigte Informationen zur Identität des Absenders.

Für die Schlüsselverwaltung mit zuvor verteilten symmetrischen Schlüsseln enthält jede Nachricht den Inhaltsverschlüsselungsschlüssel, der mit einem zuvor verteilten Schlüsselverschlüsselungsschlüssel verschlüsselt wurde. Empfänger verwenden den zuvor verteilten Schlüsselverschlüsselungsschlüssel, um den Inhaltsverschlüsselungsschlüssel zu entschlüsseln, und verwenden dann den entschlüsselten Inhaltsverschlüsselungsschlüssel, um die umgehüllte Nachricht zu entschlüsseln.

Eine typische CMS-Ereignissequenz zum Codieren umhüllter Daten ist in der folgenden Abbildung dargestellt.

Codieren von umhüllten Daten

  • Ein Zeiger auf die Nur-Text-Nachricht wird abgerufen.
  • Ein symmetrischer Schlüssel (Sitzungsschlüssel) wird generiert.
  • Der symmetrische Schlüssel und der angegebene Verschlüsselungsalgorithmus werden verwendet, um die Nachrichtendaten zu verschlüsseln.
  • Ein Zertifikatspeicher wird geöffnet.
  • Das Zertifikat des Empfängers wird aus dem Speicher abgerufen.
  • Der öffentliche Schlüssel wird aus dem Zertifikat des Empfängers abgerufen.
  • Mit dem öffentlichen Schlüssel des Empfängers wird der symmetrische Schlüssel verschlüsselt.
  • Aus dem Zertifikat des Empfängers wird die ID des Empfängers abgerufen.
  • Die folgenden Informationen sind in der digital umhüllten Nachricht enthalten: der Datenverschlüsselungsalgorithmus, die verschlüsselten Daten, der verschlüsselte symmetrische Schlüssel und die Struktur der Empfängerinformationen.

Führen Sie das folgende Verfahren aus, um Nachrichtenfunktionen auf niedriger Ebene zum Ausführen der soeben aufgeführten typischen Aufgaben zu verwenden.

So codieren Sie eine umhüllte Nachricht

  1. Erstellen oder Abrufen des Inhalts.

  2. Rufen Sie einen Kryptografieanbieter ab.

  3. Abrufen eines Empfängerzertifikats.

  4. Initialisieren Sie die CMSG_ENVELOPED_ENCODE_INFO-Struktur .

  5. Rufen Sie CryptMsgCalculateEncodedLength auf, um die Größe des codierten Nachrichtenblobs abzurufen. Weisen Sie Dafür Arbeitsspeicher zu.

  6. Rufen Sie CryptMsgOpenToEncode auf, und übergeben Sie CMSG_ENVELOPED für dwMsgType und einen Zeiger auf CMSG_ENVELOPED_ENCODE_INFO für pvMsgEncodeInfo. Als Ergebnis dieses Aufrufs erhalten Sie ein Handle für die geöffnete Nachricht.

  7. Rufen Sie CryptMsgUpdate auf, und übergeben Sie das in Schritt 6 abgerufene Handle und einen Zeiger auf die Daten, die verschlüsselt, umhüllt und codiert werden sollen. Diese Funktion kann so oft wie nötig aufgerufen werden, um den Codierungsprozess abzuschließen.

  8. Rufen Sie CryptMsgGetParam auf, und übergeben Sie dabei das in Schritt 6 abgerufene Handle und die entsprechenden Parametertypen, um auf die gewünschten, codierten Daten zuzugreifen. Übergeben Sie beispielsweise CMSG_CONTENT_PARAM, um einen Zeiger auf die gesamte PKCS #7-Nachricht zu erhalten.

    Wenn das Ergebnis dieser Codierung als innere Daten für eine andere codierte Nachricht verwendet werden soll, z. B. eine umhüllte Nachricht, muss der parameter CMSG_BARE_CONTENT_PARAM übergeben werden. Ein Beispiel finden Sie unter Alternativer Code zum Codieren einer umhüllten Nachricht.

  9. Schließen Sie die Nachricht, indem Sie CryptMsgClose aufrufen.

Das Ergebnis dieser Prozedur ist eine codierte Nachricht, die die verschlüsselten Daten, den symmetrischen Schlüssel , der mit den öffentlichen Schlüsseln des Empfängers verschlüsselt wird, und die Datenstrukturen der Empfängerinformationen enthält. Die Kombination aus verschlüsseltem Inhalt und einem verschlüsselten symmetrischen Schlüssel für einen Empfänger ist ein digitaler Umschlag für diesen Empfänger. Jede Art von Inhalt kann für mehrere Empfänger umschlaget werden.

Beispiel-C-Programm: Codieren einer umhüllten, signierten Nachricht