Funzione CryptEncrypt (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 CryptEncrypt(
[in] HCRYPTKEY hKey,
[in] HCRYPTHASH hHash,
[in] BOOL Final,
[in] DWORD dwFlags,
[in, out] BYTE *pbData,
[in, out] DWORD *pdwDataLen,
[in] DWORD dwBufLen
);
Parametri
[in] hKey
Handle per la chiave di crittografia. Un'applicazione ottiene questo handle usando CryptGenKey o la funzione CryptImportKey .
La chiave specifica l'algoritmo di crittografia utilizzato.
[in] hHash
Handle per un oggetto hash. Se i dati devono essere hash e crittografati contemporaneamente, è possibile passare un handle a un oggetto hash nel parametro hHash . Il valore hash viene aggiornato con il testo non crittografato passato. Questa opzione è utile quando si genera testo firmato e crittografato.
Prima di chiamare CryptEncrypt, l'applicazione deve ottenere un handle per l'oggetto hash chiamando la funzione CryptCreateHash . Al termine della crittografia, il valore hash può essere ottenuto usando la funzione CryptGetHashParam oppure l'hash può essere firmato usando la funzione CryptSignHash .
Se non deve essere eseguito alcun hash, questo parametro deve essere NULL.
[in] Final
Valore booleano che specifica se si tratta dell'ultima sezione di una serie da crittografare. Final è impostato su TRUE per l'ultimo blocco o solo su FALSE se sono presenti più blocchi da crittografare. Per altre informazioni, vedere la sezione Osservazioni.
[in] dwFlags
Il valore dwFlags seguente è definito ma riservato per uso futuro.
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. |
[in, out] pbData
Puntatore a un buffer contenente il testo non crittografato da crittografare. Il testo non crittografato in questo buffer viene sovrascritto con il testo crittografato creato da questa funzione.
Il parametro pdwDataLen punta a una variabile che contiene la lunghezza, in byte, del testo non crittografato. Il parametro dwBufLen contiene le dimensioni totali, in byte, di questo buffer.
Se questo parametro contiene NULL, questa funzione calcolerà le dimensioni necessarie per il testo crittografato e lo inserisce nel valore a cui punta il parametro pdwDataLen .
[in, out] pdwDataLen
Puntatore a un valore DWORD che , nella voce, contiene la lunghezza, in byte, del testo non crittografato nel buffer pbData . All'uscita, questo DWORD contiene la lunghezza, in byte, del testo crittografato scritto nel buffer pbData .
Se il buffer allocato per pbData non è sufficientemente grande da contenere i dati crittografati, GetLastError restituisce ERROR_MORE_DATA e archivia le dimensioni del buffer necessarie, in byte, nel valore DWORD a cui punta pdwDataLen.
Se pbData è NULL, non viene restituito alcun errore e la funzione archivia le dimensioni dei dati crittografati, in byte, nel valore DWORD a cui punta pdwDataLen. Ciò consente a un'applicazione di determinare le dimensioni corrette del buffer.
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 crittografare e che il parametro Final sia TRUE.
[in] dwBufLen
Specifica le dimensioni totali, in byte, del buffer pbData di input.
Si noti che, a seconda dell'algoritmo usato, il testo crittografato può essere maggiore del testo non crittografato originale. In questo caso, il buffer pbData deve essere sufficientemente grande per contenere il testo crittografato e qualsiasi spaziatura interna.
Di regola, se viene usata una crittografia di flusso , il testo crittografato ha le stesse dimensioni del testo non crittografato. Se viene usata una crittografia a blocchi , il testo crittografato è superiore a una lunghezza del blocco maggiore del testo non crittografato.
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 crittografare 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. |
|
Il parametro dwFlags è diverso da zero. |
|
Il parametro hHash contiene un handle non valido. |
|
È stato effettuato un tentativo di aggiungere dati a un oggetto hash già contrassegnato come "completato". |
|
Il parametro hKey non contiene un handle valido per una chiave. |
|
Le dimensioni del buffer di output sono troppo piccole per contenere il testo crittografato generato. |
|
Impossibile trovare il contesto CSP specificato al momento della creazione della chiave. |
|
L'applicazione ha tentato di crittografare gli stessi dati due volte. |
|
La funzione non è riuscita in modo imprevisto. |
|
Il provider di servizi di configurazione ha esaurito la memoria durante l'operazione. |
Commenti
Se una grande quantità di dati deve essere crittografata, può essere eseguita in sezioni chiamando ripetutamente CryptEncrypt . Il parametro Final deve essere impostato su TRUE nell'ultima chiamata a CryptEncrypt, in modo che il motore di crittografia possa completare correttamente il processo di crittografia. 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. Se la lunghezza dei dati è uguale alla dimensione del blocco della crittografia, ai dati viene aggiunto un blocco aggiuntivo di spaziatura interna. 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 CryptEncrypt successiva reimposta il registro dei commenti e suggerimenti della crittografia sul valore KP_IV della chiave.
- Se la crittografia è una crittografia di flusso, la crittografia successiva di CryptEncrypt 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 CryptEncrypt . 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)
// Encrypt the block with the duplicate key.
CryptEncrypt(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 il riempimento PKCS #1. In caso di decrittografia, questa spaziatura interna viene verificata. La lunghezza dei dati di testo non crittografato che può essere crittografata con una chiamata a CryptEncrypt con una chiave RSA è la lunghezza del modulo di chiave meno undici byte. L'undici byte è il valore minimo scelto per pkCS #1 riempimento. Il testo di crittografia viene restituito in formato little-endian .
Esempio
Per esempi che usano questa funzione, vedere Esempio di programma C: Crittografia di un file e programma C di esempio: decrittografia di un file.
Requisiti
Requisito | Valore |
---|---|
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