CryptDecrypt-Funktion (wincrypt.h)
Wichtige Änderungen zur Unterstützung der S/MIME-E-Mail-Interoperabilität ( Secure/Multipurpose Internet Mail Extensions ) wurden an CryptoAPI vorgenommen, die sich auf die Verarbeitung umhüllter Nachrichten auswirken. Weitere Informationen finden Sie im Abschnitt Hinweise von CryptMsgOpenToEncode.
Syntax
BOOL CryptDecrypt(
[in] HCRYPTKEY hKey,
[in] HCRYPTHASH hHash,
[in] BOOL Final,
[in] DWORD dwFlags,
[in, out] BYTE *pbData,
[in, out] DWORD *pdwDataLen
);
Parameter
[in] hKey
Ein Handle für den Schlüssel, der für die Entschlüsselung verwendet werden soll. Eine Anwendung ruft dieses Handle mithilfe der Funktion CryptGenKey oder CryptImportKey ab.
Dieser Schlüssel gibt den zu verwendenden Entschlüsselungsalgorithmus an.
[in] hHash
Ein Handle für ein Hashobjekt. Wenn Daten gleichzeitig entschlüsselt und hashed werden sollen, wird in diesem Parameter ein Handle an ein Hashobjekt übergeben. Der Hashwert wird mit dem entschlüsselten Klartext aktualisiert. Diese Option ist nützlich beim gleichzeitigen Entschlüsseln und Überprüfen einer Signatur.
Vor dem Aufrufen von CryptDecrypt muss die Anwendung ein Handle für das Hashobjekt abrufen, indem sie die CryptCreateHash-Funktion aufruft. Nach Abschluss der Entschlüsselung kann der Hashwert mithilfe der CryptGetHashParam-Funktion abgerufen werden, er kann auch mit der CryptSignHash-Funktion signiert oder zum Überprüfen einer digitalen Signatur mithilfe der CryptVerifySignature-Funktion verwendet werden.
Wenn kein Hash ausgeführt werden soll, muss dieser Parameter 0 sein.
[in] Final
Ein boolescher Wert, der angibt, ob dies der letzte Abschnitt in einer Reihe ist, die entschlüsselt wird. Dieser Wert ist TRUE , wenn dies der letzte oder einzige Block ist. Wenn dies nicht der letzte Block ist, ist dieser Wert FALSE. Weitere Informationen finden Sie in den Hinweisen.
[in] dwFlags
Die folgenden Flagwerte werden definiert.
Wert | Bedeutung |
---|---|
|
Verwenden Sie Optimal Asymmetric Encryption Padding (OAEP) (PKCS #1 Version 2). Dieses Flag wird nur vom Microsoft Enhanced Cryptographic Provider mit RSA-Verschlüsselung/Entschlüsselung unterstützt. Dieses Flag kann nicht mit dem CRYPT_DECRYPT_RSA_NO_PADDING_CHECK-Flag kombiniert werden. |
|
Führen Sie die Entschlüsselung für das BLOB aus, ohne die Auffüllung zu überprüfen. Dieses Flag wird nur vom Microsoft Enhanced Cryptographic Provider mit RSA-Verschlüsselung/Entschlüsselung unterstützt. Dieses Flag kann nicht mit dem CRYPT_OAEP-Flag kombiniert werden. |
[in, out] pbData
Ein Zeiger auf einen Puffer, der die zu entschlüsselnden Daten enthält. Nachdem die Entschlüsselung durchgeführt wurde, wird der Klartext wieder in diesen Puffer eingefügt.
Die Anzahl der verschlüsselten Bytes in diesem Puffer wird von pdwDataLen angegeben.
[in, out] pdwDataLen
Ein Zeiger auf einen DWORD-Wert , der die Länge des pbData-Puffers angibt. Vor dem Aufrufen dieser Funktion legt die aufrufende Anwendung den DWORD-Wert auf die Anzahl der zu entschlüsselnden Bytes fest. Nach der Rückgabe enthält der DWORD-Wert die Anzahl der Bytes des entschlüsselten Klartexts.
Wenn eine Blockchiffre verwendet wird, muss diese Datenlänge ein Vielfaches der Blockgröße sein, es sei denn, dies ist der letzte Abschnitt der zu entschlüsselnden Daten und der Final-Parameterist TRUE.
Rückgabewert
Wenn die Funktion erfolgreich ist, gibt die Funktion nonzero (TRUE) zurück.
Wenn die Funktion fehlschlägt, gibt sie null (FALSE) zurück. Rufen Sie GetLastError auf, um erweiterte Fehlerinformationen zu erhalten.
Die von NTE vorangestellten Fehlercodes werden vom verwendeten CSP generiert. Es folgen einige mögliche Fehlercodes.
Wert | BESCHREIBUNG |
---|---|
|
Einer der Parameter gibt ein ungültiges Handle an. |
|
Einer der Parameter enthält einen ungültigen Wert. Dies ist in den meisten Fällen ein nicht gültiger Zeiger. |
|
Der hKey-Sitzungsschlüssel gibt einen Algorithmus an, den dieser CSP nicht unterstützt. |
|
Die zu entschlüsselnden Daten sind ungültig. Wenn beispielsweise eine Blockchiffre verwendet wird und das Final-FlagFALSE ist, muss der von pdwDataLen angegebene Wert ein Vielfaches der Blockgröße sein. Dieser Fehler kann auch zurückgegeben werden, wenn festgestellt wird , dass die Auffüllung ungültig ist. |
|
Der dwFlags-Parameter ist nonzero. |
|
Der hHash-Parameter enthält ein ungültiges Handle. |
|
Der hKey-Parameter enthält kein gültiges Handle für einen Schlüssel. |
|
Die Größe des Ausgabepuffers ist zu klein, um den generierten Klartext aufzunehmen. |
|
Der CSP-Kontext, der beim Erstellen des Schlüssels angegeben wurde, kann nicht gefunden werden. |
|
Die Anwendung hat zweimal versucht, dieselben Daten zu entschlüsseln. |
|
Die Funktion ist auf unerwartete Weise fehlgeschlagen. |
Hinweise
Wenn eine große Menge an Daten entschlüsselt werden soll, kann dies in Abschnitten erfolgen, indem CryptDecrypt wiederholt aufgerufen wird. Der Final-Parameter muss nur beim letzten Aufruf von CryptDecrypt auf TRUE festgelegt werden, damit die Entschlüsselungs-Engine den Entschlüsselungsprozess ordnungsgemäß abschließen kann. Die folgenden zusätzlichen Aktionen werden ausgeführt, wenn FinalTRUE ist:
- Wenn es sich bei dem Schlüssel um einen Blockchiffreschlüssel handelt, werden die Daten auf ein Vielfaches der Blockgröße der Verschlüsselung aufgefüllt. Um die Blockgröße einer Verschlüsselung zu ermitteln, verwenden Sie CryptGetKeyParam , um den KP_BLOCKLEN Wert des Schlüssels abzurufen.
- Wenn die Verschlüsselung in einem Verkettungsmodus ausgeführt wird, setzt der nächste CryptDecrypt-Vorgang das Feedbackregister der Verschlüsselung auf den KP_IV Wert des Schlüssels zurück.
- Wenn es sich bei der Chiffre um eine Streamchiffre handelt, setzt der nächste CryptDecrypt-Aufruf die Verschlüsselung auf den Ursprünglichen Zustand zurück.
Es gibt keine Möglichkeit, das Feedbackregister der Chiffre auf den KP_IV Wert des Schlüssels festzulegen, ohne den Final-Parameter auf TRUE festzulegen. Wenn dies erforderlich ist, wie in dem Fall, in dem Sie keinen zusätzlichen Auffüllblock hinzufügen oder die Größe jedes Blocks ändern möchten, können Sie dies simulieren, indem Sie mithilfe der CryptDuplicateKey-Funktion ein Duplikat des ursprünglichen Schlüssels erstellen und den doppelten Schlüssel an die CryptDecrypt-Funktion übergeben. Dadurch wird der KP_IV des ursprünglichen Schlüssels im doppelten Schlüssel platziert. Nachdem Sie den ursprünglichen Schlüssel erstellt oder importiert haben, können Sie den ursprünglichen Schlüssel nicht mehr für die Verschlüsselung verwenden, da das Feedbackregister des Schlüssels geändert wird. Der folgende Pseudocode zeigt, wie dies geschehen kann.
// Set the IV for the original key. Do not use the original key for
// encryption or decryption after doing this because the key's
// feedback register will get modified and you cannot change it.
CryptSetKeyParam(hOriginalKey, KP_IV, newIV)
while(block = NextBlock())
{
// Create a duplicate of the original key. This causes the
// original key's IV to be copied into the duplicate key's
// feedback register.
hDuplicateKey = CryptDuplicateKey(hOriginalKey)
// Decrypt the block with the duplicate key.
CryptDecrypt(hDuplicateKey, block)
// Destroy the duplicate key. Its feedback register has been
// modified by the CryptEncrypt function, so it cannot be used
// again. It will be re-duplicated in the next iteration of the
// loop.
CryptDestroyKey(hDuplicateKey)
}
Der erweiterte Kryptografieanbieter von Microsoft unterstützt die direkte Verschlüsselung mit öffentlichen RSA-Schlüsseln und die Entschlüsselung mit privaten RSA-Schlüsseln. Die Verschlüsselung verwendet PKCS # 1-Auffüllung. Bei der Entschlüsselung wird diese Auffüllung überprüft. Die Länge der zu entschlüsselnden Chiffretextdaten muss die gleiche Länge aufweisen wie das Modul des RSA-Schlüssels, der zum Entschlüsseln der Daten verwendet wird. Wenn der Chiffretext Nullen in den wichtigsten Bytes aufweist, müssen diese Bytes im Eingabedatenpuffer und in der Eingabepufferlänge enthalten sein. Der Chiffretext muss im Little-Endian-Format vorliegen.
Beispiele
Ein Beispiel, das diese Funktion verwendet, finden Sie unter Beispiel C-Programm: Entschlüsseln einer Datei.
Anforderungen
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | wincrypt.h |
Bibliothek | Advapi32.lib |
DLL | Advapi32.dll |
Weitere Informationen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für