Codieren umschlageierter Daten

Umschlagdaten bestehen aus verschlüsselten Inhalten beliebiger Art und verschlüsselten Sitzungsschlüsseln für die Inhaltsverschlüsselung für einen oder mehrere Empfänger. Umschlagnachrichten behalten den Inhalt des Nachrichtengeheimnisses bei und erlauben nur angegebenen Personen oder Entitäten, den Inhalt abzurufen.

Kryptografische Nachrichtensyntax (Cryptographic Message Syntax, CMS) kann verwendet werden, um umschlagete Nachrichten zu codieren. CMS unterstützt drei Schlüsselverwaltungstechniken: Schlüsseltransport, Schlüsselvereinbarung und zuvor verteilte symmetrische Schlüsselverschlüsselungsschlüssel (KEK). Zuvor verteilter symmetrischer KEK wird auch als Verteilung von Adressenlistenschlüsseln bezeichnet.

In jeder dieser drei Techniken wird ein einzelner Sitzungsschlüssel generiert, um die umschlagete Nachricht zu verschlüsseln. Probleme bei der Schlüsselverwaltung 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 aus 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 umschlageten Daten zu entschlüsseln. Wenn der Schlüsseltransport verwendet wird, hat der Empfänger keine Informationen zur 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 umschlagete Nachricht zu entschlüsseln. Bei Verwendung der Kurzschlüsselvereinbarung in Verbindung mit dem privaten Schlüssel des Empfängers verfügt der Nachrichtenempfänger über bestätigten Informationen zur Identität des Absenders.

Für die Schlüsselverwaltung mit zuvor verteilten symmetrischen Schlüsselnenthä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 Verschlüsselungsschlüssel für den Inhalt zu entschlüsseln, und verwenden dann den entschlüsselten Inhaltsverschlüsselungsschlüssel, um die umschlagete Nachricht zu entschlüsseln.

Eine typische CMS-Sequenz von Ereignissen für die Codierung umschlageierter Daten ist in der folgenden Abbildung dargestellt.

Codieren umschlageierter Daten

  • Ein Zeiger auf die Klartextnachricht wird abgerufen.
  • Ein symmetrischer Schlüssel (Sitzungsschlüssel)wird generiert.
  • Der symmetrische Schlüssel und der angegebene Verschlüsselungsalgorithmus werden zum Verschlüsseln der Nachrichtendaten verwendet.
  • 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.
  • Mithilfe des öffentlichen Schlüssels 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 DigitalUmschlagnachricht enthalten: der Datenverschlüsselungsalgorithmus, die verschlüsselten Daten, der verschlüsselte symmetrische Schlüssel und die Empfängerinformationsstruktur.

Um nachrichtenbasierte Funktionen auf niedriger Ebene zu verwenden, um die soeben aufgeführten typischen Aufgaben auszuführen, verwenden Sie das folgende Verfahren.

So codieren Sie eine umschlagete Nachricht

  1. Erstellen sie den Inhalt, oder rufen Sie den Inhalt ab.

  2. Abrufen eines Kryptografieanbieters.

  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. Belegen Sie Dafür Arbeitsspeicher.

  6. Rufen Sie CryptMsgOpenToEncodeauf, und übergeben Sie CMSG _ ENVELOPED für dwMsgType und einen Zeiger auf CMSG _ ENVELOPED _ ENCODE _ INFO for pvMsgEncodeInfo. Als Ergebnis dieses Aufrufs erhalten Sie ein Handle für die geöffnete Nachricht.

  7. Rufen Sie CryptMsgUpdateauf, und übergeben Sie das in Schritt 6 abgerufene Handle und einen Zeiger auf die Zu verschlüsselnden, umschlagenden und codierten Daten. Diese Funktion kann so oft wie nötig aufgerufen werden, um den Codierungsprozess abzuschließen.

  8. Rufen Sie CryptMsgGetParamauf, und übergeben Sie 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 abzurufen.

    Wenn das Ergebnis dieser Codierung als innere Daten für eine andere codierte Nachricht verwendet werden soll, z. B. eine umschlagbare Nachricht, muss der PARAMETER CMSG _ BARE CONTENT _ _ PARAM übergeben werden. Ein Beispiel finden Sie unter Alternativer Code für die Codierung einer umschlageten Nachricht.

  9. Schließen Sie die Nachricht, indem Sie CryptMsgCloseaufrufen.

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 Empfängerinformationsdatenstrukturen 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. Jeder Inhaltstyp kann für mehrere Empfänger umgeformt werden.

C-Beispielprogramm: Codieren einer umschlageten, signierten Nachricht