CryptDecrypt-Funktion (wincrypt.h)

Wichtig Diese API ist veraltet. Neue und vorhandene Software sollten mit der Verwendung von Kryptografie-APIs der nächsten Generation beginnen. Microsoft kann diese API in zukünftigen Releases entfernen.
 
Die CryptDecrypt-Funktion entschlüsselt Daten, die zuvor mit der CryptEncrypt-Funktion verschlüsselt wurden.

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
CRYPT_OAEP
0x00000040
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.
CRYPT_DECRYPT_RSA_NO_PADDING_CHECK
0x00000020
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
ERROR_INVALID_HANDLE
Einer der Parameter gibt ein ungültiges Handle an.
ERROR_INVALID_PARAMETER
Einer der Parameter enthält einen ungültigen Wert. Dies ist in den meisten Fällen ein nicht gültiger Zeiger.
NTE_BAD_ALGID
Der hKey-Sitzungsschlüssel gibt einen Algorithmus an, den dieser CSP nicht unterstützt.
NTE_BAD_DATA
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.
NTE_BAD_FLAGS
Der dwFlags-Parameter ist nonzero.
NTE_BAD_HASH
Der hHash-Parameter enthält ein ungültiges Handle.
NTE_BAD_KEY
Der hKey-Parameter enthält kein gültiges Handle für einen Schlüssel.
NTE_BAD_LEN
Die Größe des Ausgabepuffers ist zu klein, um den generierten Klartext aufzunehmen.
NTE_BAD_UID
Der CSP-Kontext, der beim Erstellen des Schlüssels angegeben wurde, kann nicht gefunden werden.
NTE_DOUBLE_ENCRYPT
Die Anwendung hat zweimal versucht, dieselben Daten zu entschlüsseln.
NTE_FAIL
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

CryptCreateHash

CryptEncrypt

CryptGenKey

CryptGetHashParam

CryptGetKeyParam

CryptImportKey

CryptMsgOpenToEncode

CryptSignHash

CryptVerifySignature

Datenverschlüsselungs-/Entschlüsselungsfunktionen