Funzione CryptDecrypt (wincrypt.h)
Modifiche importanti per supportare l'interoperabilità della posta elettronica S/MIME ( Secure/Multipurpose Internet Mail Extensions ) sono state apportate 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 o CryptImportKey .
Questa chiave specifica l'algoritmo di decrittografia da utilizzare.
[in] hHash
Handle per un oggetto hash. Se i dati devono essere decrittografati e hash contemporaneamente, viene passato un handle a un oggetto hash in questo parametro. Il valore hash viene aggiornato con il 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 CryptGetHashParam , può anche essere firmato usando la funzione CryptSignHash oppure può essere usato per verificare una firma digitale usando la funzione CryptVerifySignature .
Se non deve essere eseguito 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 questo non è l'ultimo blocco, questo valore è FALSE. Per altre informazioni, vedere la sezione Osservazioni.
[in] dwFlags
Vengono definiti i valori del 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 nel BLOB senza controllare la spaziatura interna. Questo flag è supportato solo dal provider di crittografia avanzato Microsoft con crittografia/decrittografia RSA. Questo flag non può essere combinato con il flag CRYPT_OAEP . |
[in, out] pbData
Puntatore a un buffer contenente 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 che indica la lunghezza del buffer pbData . Prima di chiamare questa funzione, l'applicazione chiamante imposta il valore DWORD sul numero di byte da decrittografare. Al termine, il valore DWORD contiene il numero di byte del testo non crittografato decrittografato.
Quando viene usata una crittografia a blocchi , questa lunghezza dei dati deve essere un multiplo delle dimensioni del blocco, a meno che non si tratta della sezione finale dei dati da decrittografare e che il parametro Final sia TRUE.
Valore restituito
Se la funzione ha esito positivo, la funzione restituisce un valore diverso da zero (TRUE).
Se la funzione non riesce, 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.
Valore | Descrizione |
---|---|
|
Uno dei parametri specifica un handle non valido. |
|
Uno dei parametri contiene un valore non valido. Si tratta più spesso di un puntatore che non è valido. |
|
La chiave di sessionehKey specifica un algoritmo non supportato da questo provider di servizi di configurazione. |
|
I dati da decrittografare non sono validi. Ad esempio, quando viene usata una crittografia a blocchi e il flag Finale è FALSE, il valore specificato da pdwDataLen deve essere un multiplo delle dimensioni del blocco. Questo errore può essere restituito anche quando la spaziatura interna non è valida. |
|
Il parametro dwFlags è diverso da zero. |
|
Il parametro hHash contiene un handle non valido. |
|
Il parametro hKey non contiene un handle valido per una chiave. |
|
Le dimensioni del buffer di output sono troppo piccole per contenere il testo non crittografato generato. |
|
Impossibile trovare il contesto CSP specificato al momento della creazione della chiave. |
|
L'applicazione ha tentato di decrittografare gli stessi dati due volte. |
|
La funzione non è riuscita in modo imprevisto. |
Commenti
Se una grande quantità di dati deve essere decrittografata, può essere eseguita in sezioni chiamando ripetutamente CryptDecrypt . Il parametro Final deve essere impostato su TRUE solo nell'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 Final è 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 opera in modalità concatenamento, l'operazione CryptDecrypt successiva reimposta il registro dei commenti e suggerimenti della crittografia sul valore KP_IV della chiave.
- Se la crittografia è una crittografia di flusso, la chiamata successiva a CryptDecrypt reimposta lo stato iniziale della crittografia.
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 vuole 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 illustra 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 supporta la crittografia diretta con chiavi pubblicheRSA e decrittografia con chiavi private RSA. La crittografia usa la spaziatura interna PKCS #1. In caso di decrittografia, questa spaziatura interna viene verificata. La lunghezza dei dati crittografati da decrittografare deve essere la stessa lunghezza del modulo della chiave RSA usata per decrittografare i dati. Se il testo crittografato ha zeri nei byte più significativi, questi byte devono essere inclusi nel buffer dei dati di input e nella lunghezza del buffer di input. Il testo crittografato deve essere in formato little-endian .
Esempio
Per un esempio che usa questa funzione, vedere Esempio di programma C: Decrittografia di un file.
Requisiti
Client minimo supportato | Windows XP [solo app desktop] |
Server minimo supportato | Windows Server 2003 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | wincrypt.h |
Libreria | Advapi32.lib |
DLL | Advapi32.dll |
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per