CryptDecrypt-Funktion (wincrypt.h)
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 |
---|---|
|
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. |
|
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 |
---|---|
|
Einer der Parameter gibt ein ungültiges Handle an. |
|
Einer der Parameter enthält einen ungültigen Wert. Dies ist am häufigsten ein ungültiger Zeiger. |
|
Der hKeySitzungsschlü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 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. |
|
Der dwFlags Parameter ist nonzero. |
|
Der hHash--Parameter enthält ein ungültiges Handle. |
|
Der hKey--Parameter enthält keinen gültigen Handle für einen Schlüssel. |
|
Die Größe des Ausgabepuffers ist zu klein, um den generierten Nurtext zu speichern. |
|
Der CSP-Kontext, der beim Erstellen des Schlüssels angegeben wurde, kann nicht gefunden werden. |
|
Die Anwendung hat versucht, die gleichen Daten zweimal zu entschlüsseln. |
|
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 |