Funzione CryptDecrypt (wincrypt.h)

Importante Questa API è deprecata. Il software nuovo ed esistente deve iniziare a usare le API cryptography next generation. Microsoft potrebbe rimuovere questa API nelle versioni future.
 
La funzione CryptDecrypt decrittografa i dati crittografati in precedenza usando la funzione CryptEncrypt .

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
CRYPT_OAEP
0x00000040
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 .
CRYPT_DECRYPT_RSA_NO_PADDING_CHECK
0x00000020
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
ERROR_INVALID_HANDLE
Uno dei parametri specifica un handle non valido.
ERROR_INVALID_PARAMETER
Uno dei parametri contiene un valore non valido. Si tratta più spesso di un puntatore che non è valido.
NTE_BAD_ALGID
La chiave di sessionehKey specifica un algoritmo non supportato da questo provider di servizi di configurazione.
NTE_BAD_DATA
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.
NTE_BAD_FLAGS
Il parametro dwFlags è diverso da zero.
NTE_BAD_HASH
Il parametro hHash contiene un handle non valido.
NTE_BAD_KEY
Il parametro hKey non contiene un handle valido per una chiave.
NTE_BAD_LEN
Le dimensioni del buffer di output sono troppo piccole per contenere il testo non crittografato generato.
NTE_BAD_UID
Impossibile trovare il contesto CSP specificato al momento della creazione della chiave.
NTE_DOUBLE_ENCRYPT
L'applicazione ha tentato di decrittografare gli stessi dati due volte.
NTE_FAIL
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

CryptCreateHash

CryptEncrypt

CryptGenKey

CryptGetHashParam

CryptGetKeyParam

CryptImportKey

CryptMsgOpenToEncode

CryptSignHash

CryptVerifySignature

Funzioni di crittografia dei dati/decrittografia