Funzione CryptDecrypt (wincrypt.h)
Sono state apportate modifiche importanti per supportare l'interoperabilità della posta elettronica sicura/multiuso (S/MIME) a CryptoAPI che influiscono sulla gestione dei messaggi in busta. Per altre informazioni, vedere la sezione Osservazioni di CryptMsgOpenToEncode.
Sintassi
BOOL CryptDecrypt(
[in] HCRYPTKEY hKey,
[in] HCRYPTHASH hHash,
[in] BOOL Final,
[in] DWORD dwFlags,
[in, out] BYTE *pbData,
[in, out] DWORD *pdwDataLen
);
Parametri
[in] hKey
Handle per la chiave da usare per la decrittografia. Un'applicazione ottiene questo handle usando la funzione CryptGenKey
Questa chiave specifica l'algoritmo di decrittografia da utilizzare.
[in] hHash
Handle per un oggetto hash . Se i dati devono essere decrittografati e contemporaneamente con hash, viene passato un handle a un oggetto hash in questo parametro. Il valore hash viene aggiornato con l'testo non crittografato decrittografato. Questa opzione è utile quando si decrittografa e si verifica contemporaneamente una firma.
Prima di chiamare CryptDecrypt, l'applicazione deve ottenere un handle per l'oggetto hash chiamando la funzione CryptCreateHash. Al termine della decrittografia, il valore hash può essere ottenuto usando la funzione
Se non è necessario eseguire alcun hash, questo parametro deve essere zero.
[in] Final
Valore booleano che specifica se si tratta dell'ultima sezione di una serie da decrittografare. Questo valore è TRUE se si tratta dell'ultimo blocco o solo. Se non si tratta dell'ultimo blocco, questo valore è FALSE. Per altre informazioni, vedere Osservazioni.
[in] dwFlags
Vengono definiti i valori di flag seguenti.
Valore | Significato |
---|---|
|
Usare il riempimento OAEP (Optimal Asymmetric Encryption Padding) (PKCS #1 versione 2). Questo flag è supportato solo dal provider di crittografia avanzato Microsoft con crittografia/decrittografia RSA. Questo flag non può essere combinato con il flag CRYPT_DECRYPT_RSA_NO_PADDING_CHECK. |
|
Eseguire la decrittografia sul BLOB |
[in, out] pbData
Puntatore a un buffer che contiene i dati da decrittografare. Dopo l'esecuzione della decrittografia, il testo non crittografato viene inserito nuovamente nello stesso buffer.
Il numero di byte crittografati in questo buffer viene specificato da pdwDataLen.
[in, out] pdwDataLen
Puntatore a un valore DWORD
Quando si usa un di crittografia a blocchi
Valore restituito
Se la funzione ha esito positivo, la funzione restituisce un valore diverso da zero (TRUE).
Se la funzione ha esito negativo, restituisce zero (FALSE). Per informazioni sugli errori estesi, chiamare GetLastError.
I codici di errore preceduti dall'NTE vengono generati dal CSP specifico usato. Di seguito sono riportati alcuni possibili codici di errore.
Osservazioni
Se una grande quantità di dati deve essere decrittografata, può essere eseguita in sezioni chiamando CryptDecrypt ripetutamente. Il parametro Final deve essere impostato su TRUE solo sull'ultima chiamata a CryptDecrypt, in modo che il motore di decrittografia possa completare correttamente il processo di decrittografia. Le azioni aggiuntive seguenti vengono eseguite quando finale viene TRUE:
- Se la chiave è una chiave di crittografia a blocchi, i dati vengono riempiti in un multiplo delle dimensioni del blocco della crittografia. Per trovare le dimensioni del blocco di una crittografia, usare CryptGetKeyParam per ottenere il valore KP_BLOCKLEN della chiave.
- Se la crittografia funziona in modalità di concatenamento , la successiva operazione di CryptDecrypt reimposta il registro dei commenti e suggerimenti della crittografia sul valore KP_IV della chiave.
- Se la crittografia è una crittografia flusso, la successiva chiamata CryptDecrypt reimposta lo stato iniziale .
Non è possibile impostare il registro dei commenti e suggerimenti della crittografia sul valore KP_IV della chiave senza impostare il parametro Final su TRUE. Se ciò è necessario, come nel caso in cui non si voglia aggiungere un blocco di riempimento aggiuntivo o modificare le dimensioni di ogni blocco, è possibile simularlo creando un duplicato della chiave originale usando la funzione CryptDuplicateKey e passando la chiave duplicata alla funzione CryptDecrypt. In questo modo la KP_IV della chiave originale viene inserita nella chiave duplicata. Dopo aver creato o importato la chiave originale, non è possibile usare la chiave originale per la crittografia perché il registro dei commenti e suggerimenti della chiave verrà modificato. Lo pseudocodice seguente mostra come eseguire questa operazione.
// 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)
}
Il provider di crittografia avanzato Microsoft
Esempi
Per un esempio che usa questa funzione, vedere Programma C di esempio: Decrittografia di un file.
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows XP [solo app desktop] |
server minimo supportato | Windows Server 2003 [solo app desktop] |
piattaforma di destinazione | Finestre |
intestazione |
wincrypt.h |
libreria |
Advapi32.lib |
dll | Advapi32.dll |