CryptDecrypt-Funktion (wincrypt.h)

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

Wichtige Änderungen zur Unterstützung von Secure/Multipurpose Internet Mail Extensions (S/MIME) E-Mail-Interoperabilität wurden an CryptoAPI vorgenommen, die sich auf die Behandlung von umschlägen 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 entweder mithilfe der CryptGenKey- oder CryptImportKey-Funktion ab.

Dieser Schlüssel gibt den zu verwendenden Entschlüsselungsalgorithmus an.

[in] hHash

Ein Handle zu einem Hashobjekt. Wenn Daten gleichzeitig entschlüsselt und mit Hash versehen werden sollen, wird ein Handle zu einem Hashobjekt in diesem Parameter übergeben. Der Hashwert wird mit dem entschlüsselten Nur-Text-aktualisiert. Diese Option ist nützlich, wenn eine Signatur gleichzeitig entschlüsselt und überprüft wird.

Vor dem Aufrufen CryptDecryptmuss die Anwendung ein Handle für das Hashobjekt abrufen, indem die CryptCreateHash--Funktion aufgerufen wird. Nachdem die Entschlüsselung abgeschlossen ist, kann der Hashwert mithilfe der CryptGetHashParam--Funktion abgerufen werden, sie kann auch mit der CryptSignHash--Funktion signiert werden, oder sie kann verwendet werden, um eine digitale Signatur mithilfe der CryptVerifySignature-Funktion zu überprüfen.

Wenn kein Hash ausgeführt werden soll, muss dieser Parameter null sein.

[in] Final

Ein boolescher Wert, der angibt, ob dies der letzte Abschnitt in einer Datenreihe 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 optimalen asymmetrischen Verschlüsselungsabstand (OAEP) (PKCS #1 Version 2). Dieses Kennzeichen wird nur vom Microsoft Enhanced Cryptographic Provider mit RSA-Verschlüsselung/Entschlüsselung unterstützt. Dieses Kennzeichen kann nicht mit der CRYPT_DECRYPT_RSA_NO_PADDING_CHECK-Kennzeichnung kombiniert werden.
CRYPT_DECRYPT_RSA_NO_PADDING_CHECK
0x00000020
Führen Sie die Entschlüsselung für die BLOB- aus, ohne den Abstand zu überprüfen. Dieses Kennzeichen wird nur vom Microsoft Enhanced Cryptographic Provider mit RSA-Verschlüsselung/Entschlüsselung unterstützt. Diese Kennzeichnung kann nicht mit der CRYPT_OAEP-Kennzeichnung 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 Nur-Text wieder in diesen Puffer eingefügt.

Die Anzahl der verschlüsselten Bytes in diesem Puffer wird durch 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. Bei 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 Zuschnitt der zu entschlüsselnden Daten, und der parameter Final ist TRUE.

Rückgabewert

Wenn die Funktion erfolgreich ist, gibt die Funktion nonzero (TRUE) zurück.

Wenn die Funktion fehlschlägt, wird null (FALSE) zurückgegeben. Rufen Sie für erweiterte Fehlerinformationen GetLastError-auf.

Die von NTE vorgestellten Fehlercodes werden von dem verwendeten CSP generiert. Einige mögliche Fehlercodes folgen.

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 am häufigsten ein ungültiger Zeiger.
NTE_BAD_ALGID
Der hKeySitzungsschlü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 Flag FALSEist, muss der durch pdwDataLen- angegebene Wert ein Vielfaches der Blockgröße sein. Dieser Fehler kann auch zurückgegeben werden, wenn der Abstand 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 keinen gültigen Handle für einen Schlüssel.
NTE_BAD_LEN
Die Größe des Ausgabepuffers ist zu klein, um den generierten Nurtext zu speichern.
NTE_BAD_UID
Der CSP-Kontext, der beim Erstellen des Schlüssels angegeben wurde, kann nicht gefunden werden.
NTE_DOUBLE_ENCRYPT
Die Anwendung hat versucht, die gleichen Daten zweimal zu entschlüsseln.
NTE_FAIL
Die Funktion konnte auf unerwartete Weise nicht ausgeführt werden.

Bemerkungen

Wenn eine große Menge an Daten entschlüsselt werden soll, kann sie in Abschnitten durch Aufrufen CryptDecrypt wiederholt erfolgen. Der Parameter Final muss auf TRUE nur für den letzten Aufruf von CryptDecryptfestgelegt werden, damit das Entschlüsselungsmodul den Entschlüsselungsprozess ordnungsgemäß abschließen kann. Die folgenden zusätzlichen Aktionen werden ausgeführt, wenn FinalTRUEist:

  • Wenn es sich bei dem Schlüssel um einen Blockchiffreschlüssel handelt, werden die Daten auf ein Vielfaches der Blockgröße der Chiffre aufgefüllt. Um die Blockgröße einer Chiffre zu finden, verwenden Sie CryptGetKeyParam-, um den KP_BLOCKLEN Wert des Schlüssels abzurufen.
  • Wenn die Verschlüsselung in einem Verkettungsmodusausgefü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 Datenstromchiffrehandelt, setzt der nächste CryptDecrypt-Aufruf die Verschlüsselung auf den ursprünglichen Zustandzurück.

Es gibt keine Möglichkeit, das Feedbackregister der Chiffre auf den KP_IV Wert des Schlüssels festzulegen, ohne den Parameter Final auf TRUEfestzulegen. Wenn dies erforderlich ist, können Sie dies simulieren, wie in dem Fall, in dem Sie keinen zusätzlichen Abstandsblock hinzufügen oder die Größe jedes Blocks ändern möchten, dies simulieren, indem Sie ein Duplikat des ursprünglichen Schlüssels erstellen, indem Sie die funktion CryptDuplicateKey verwenden und den doppelten Schlüssel an die CryptDecrypt-Funktion übergeben. Dies bewirkt, dass die KP_IV des ursprünglichen Schlüssels in den doppelten Schlüssel eingefügt wird. Nachdem Sie den ursprünglichen Schlüssel erstellt oder importiert haben, können Sie den ursprünglichen Schlüssel nicht 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 Microsoft Enhanced Cryptographic Provider unterstützt die direkte Verschlüsselung mit RSAöffentlichen Schlüsseln und Entschlüsselung mit RSA privaten Schlüsseln. Die Verschlüsselung verwendet PKCS #1 Abstand. Bei der Entschlüsselung wird dieser Abstand überprüft. Die Länge von Chiffretext zu entschlüsselnden Daten muss dieselbe Länge wie der Modulus des RSA-Schlüssels sein, der zum Entschlüsseln der Daten verwendet wird. Wenn der Chiffretext nullen in den wichtigsten Bytes enthält, müssen diese Bytes in den Eingabedatenpuffer und in die Länge des Eingabepuffers eingeschlossen werden. Der Chiffretext muss little-endian Format aufweisen.

Beispiele

Ein Beispiel, das diese Funktion verwendet, finden Sie unter Beispiel C-Programm: Entschlüsseln einer Datei.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows XP [nur Desktop-Apps]
mindestens unterstützte Server- Windows Server 2003 [Nur Desktop-Apps]
Zielplattform- Fenster
Header- wincrypt.h
Library Advapi32.lib
DLL- Advapi32.dll

Siehe auch

CryptCreateHash-

CryptEncrypt

CryptGenKey-

CryptGetHashParam

CryptGetKeyParam

CryptImportKey-

CryptMsgOpenToEncode

CryptSignHash

CryptVerifySignature

Datenverschlüsselungs-/Entschlüsselungsfunktionen