Codieren signierter Daten
Signierte Daten bestehen aus Inhalten eines beliebigen Typs und verschlüsselten Nachrichtenhashes des Inhalts mit 0 oder mehr Unterzeichnern. Der resultierende Hash kann bestätigen, dass die ursprüngliche Nachricht seit der Signatur nicht geändert wurde und dass bestimmte Personen oder Entitäten die Daten signiert haben.
Die folgende Abbildung zeigt das Verfahren zum Codieren einer signierten Nachricht. In der Liste nach der Abbildung werden die Schritte beschrieben.
Eine Nachricht kann mehrere Signierer, Hashingalgorithmen und Zertifikate enthalten. Die Abbildung zeigt, dass nur Zertifikate, Zertifikatsperrlisten und CTLs denselben Prozess verwenden können. Sie würden in die Abbildung passen, wo Zertifikate angezeigt werden.
Der allgemeine Prozess zum Codieren signierter Daten sieht wie folgt aus.
So codieren Sie signierte Daten
- Die Daten werden erstellt (falls erforderlich), und ein Zeiger darauf wird abgerufen.
- Es wird ein Zertifikatspeicher geöffnet, der das Zertifikat des Signierers enthält.
- Der private Schlüssel für das Zertifikat wird abgerufen. Es gibt zwei Eigenschaften, die für das Zertifikat festgelegt werden müssen, bevor es verwendet wird. Ein Zertifikat wird verwendet, um ein Zertifikat an einen bestimmten CSP und innerhalb dieses CSP an einen bestimmten Privaten Schlüsselcontainer zu binden. Die andere wird verwendet, um anzugeben, welcher Hashingalgorithmus verwendet werden soll, wenn ein Hashvorgang aufgerufen wird. Diese müssen nur einmal festgelegt werden.
- Die -Eigenschaft eines Zertifikats bestimmt den Hashalgorithmus.
- Ein Hash der Daten wird erstellt, indem die Daten über die Hashfunktion gesendet werden.
- Die Signatur wird erstellt, indem der Hash mit dem privaten Schlüssel verschlüsselt wird, der über eine Eigenschaft für das Zertifikat abgerufen wird.
- Die folgenden Daten sind in der fertigen, signierten Nachricht enthalten:
- Die zu signierten Originaldaten
- Die Hashalgorithmen
- Die Signaturen
- Die Unterzeichnerinformationsstrukturen, die den Signiererbezeichner (Zertifikataussteller und Seriennummer) enthalten.
- Die Zertifikate des Signierers (optional)
Dieses Verfahren veranschaulicht einen einfachen Fall. Komplexere Fälle umfassen authentifizierte Attribute, die in der Nachricht enthalten sind. Wenn der Inhaltstyp keine BYTE-Zeichenfolge ist oder mindestens ein authentifiziertes Attribut zusammen mit einem beliebigen Datentyp vorhanden ist, sind zwei standardmäßig authentifizierte Attribute erforderlich: der Inhaltstyp (Daten) und der Hash des Inhalts. Unter diesen Umständen stellt die CryptoAPI automatisch diese beiden erforderlichen Attribute bereit. Die Nachrichtenfunktionen auf niedriger Ebene hashen die authentifizierten Attribute, verschlüsseln den Hash mit dem privaten Schlüssel und geben diesen als Signatur an.
Verwenden Sie die Nachrichtenfunktionen auf niedriger Ebene, um die soeben aufgeführten Aufgaben mithilfe des folgenden Verfahrens auszuführen.
So codieren Sie eine signierte Nachricht
Erstellen oder Abrufen des Inhalts.
Rufen Sie einen Kryptografieanbieter ab.
Rufen Sie die Signiererzertifikate ab.
Initialisieren Sie die CMSG_SIGNER_ENCODE_INFO-Struktur .
Initialisieren Sie die CMSG_SIGNED_ENCODE_INFO-Struktur .
Rufen Sie CryptMsgCalculateEncodedLength auf, um die Größe des codierten Nachrichtenblobs abzurufen. Weisen Sie Dafür Arbeitsspeicher zu.
Rufen Sie CryptMsgOpenToEncode auf, und übergeben Sie CMSG_SIGNED für dwMsgType und einen Zeiger auf CMSG_SIGNED_ENCODE_INFO für pvMsgEncodeInfo , um ein Handle für die geöffnete Nachricht zu erhalten.
Rufen Sie CryptMsgUpdate auf, und übergeben Sie das in Schritt 7 abgerufene Handle und einen Zeiger auf die Daten, die signiert und codiert werden sollen. Diese Funktion kann so oft wie nötig aufgerufen werden, um den Codierungsprozess abzuschließen.
Rufen Sie CryptMsgGetParam auf, und übergeben Sie das in Schritt 7 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 dafür finden Sie unter Alternativer Code zum Codieren einer umhüllten Nachricht.
Schließen Sie die Nachricht, indem Sie CryptMsgClose aufrufen.
Das Ergebnis dieser Prozedur ist eine codierte Nachricht, die die ursprünglichen Daten, den verschlüsselten Hash dieser Daten (Signatur) und die Signiererinformationen enthält. Es gibt auch einen Zeiger auf das gewünschte, codierte BLOB.
Details zur C-Codierung finden Sie unter Beispiel-C-Programm: Signieren, Codieren, Decodieren und Überprüfen einer Nachricht.