Codieren und Decodieren einer Hashnachricht
Hashdaten bestehen aus Inhalten eines beliebigen Typs und einem Hash des Inhalts. Sie kann verwendet werden, wenn nur bestätigt werden muss, dass der Nachrichteninhalt seit der Erstellung des Hashs nicht geändert wurde.
Beim Erstellen einer Hashnachricht können mehrere Hashalgorithmen und mehrere Hashes vorhanden sein. Die folgende Abbildung zeigt die Aufgaben, die zum Codieren einer Hashnachricht erforderlich sind. Die Prozedur wird in dem Text beschrieben, der der Abbildung folgt.
So erstellen Sie eine Hashnachricht
- Rufen Sie einen Zeiger auf die Daten ab, die gehasht werden sollen.
- Wählen Sie den zu verwendenden Hashalgorithmus aus.
- Durchlaufen Sie die Daten mithilfe des Hashalgorithmus über eine Hashfunktion.
- Fügen Sie die ursprünglich zu hashenden Daten, die Hashingalgorithmen und die Hashes in die codierte Nachricht ein.
Führen Sie das folgende Verfahren aus, um Nachrichtenfunktionen auf niedriger Ebene zum Ausführen der soeben beschriebenen Aufgaben zu verwenden.
So hashen und codieren Sie eine Nachricht mithilfe von Nachrichtenfunktionen auf niedriger Ebene
Erstellen oder Abrufen des Inhalts, der gehasht werden soll.
Rufen Sie einen Kryptografieanbieter ab.
Initialisieren Sie die CMSG_HASHED_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_HASHED für den parameter dwMsgType und einen Zeiger auf CMSG_HASHED_ENCODE_INFO für den parameter pvMsgEncodeInfo . Als Ergebnis dieses Aufrufs erhalten Sie ein Handle für die geöffnete Nachricht.
Rufen Sie CryptMsgUpdate auf, und übergeben Sie dabei das in Schritt 5 abgerufene Handle und einen Zeiger auf die Daten, die hash- 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 dabei das in Schritt 5 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 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, die Hashingalgorithmen und den Hash dieser Daten enthält. Ein Zeiger auf das codierte Nachrichtenblob wird in Schritt 7 abgerufen.
Die folgenden beiden Verfahren decodieren und überprüfen dann Hashdaten.
So decodieren Sie Hashdaten
- Ruft einen Zeiger auf das codierte BLOB ab.
- Rufen Sie CryptMsgOpenToDecode auf, und übergeben Sie die erforderlichen Argumente.
- Rufen Sie CryptMsgUpdate einmal auf, und übergeben Sie dabei das in Schritt 2 abgerufene Handle und einen Zeiger auf die Daten, die decodiert werden sollen. Dies bewirkt, dass die entsprechenden Aktionen für die Nachricht ausgeführt werden, je nach Nachrichtentyp.
- Rufen Sie CryptMsgGetParam auf, und übergeben Sie dabei das in Schritt 2 abgerufene Handle und die entsprechenden Parametertypen, um auf die gewünschten, decodierten Daten zuzugreifen. Übergeben Sie beispielsweise CMSG_CONTENT_PARAM, um einen Zeiger auf den decodierten Inhalt abzurufen.
So überprüfen Sie den Hash
- Rufen Sie CryptMsgControl auf, und übergeben Sie CMSG_CTRL_VERIFY_HASH, um die Hashes zu überprüfen.
- Rufen Sie CryptMsgClose auf, um die Nachricht zu schließen.
Ein Beispielprogramm finden Sie unter Beispiel-C-Programm: Codieren und Decodieren einer Hashnachricht.