Funzione CryptEncrypt (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 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 la 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 contemporaneamente con hash e crittografati, è 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, è possibile ottenere il valore hash usando la funzione CryptGetHashParam oppure l'hash può essere firmato usando la funzione CryptSignHash.
Se non è necessario eseguire alcun hash, questo parametro deve essere NULL.
[in] Final
Valore booleano che specifica se si tratta dell'ultima sezione di una serie crittografata. finale è impostato su TRUE per l'ultimo blocco o solo e su false se sono presenti più blocchi da crittografare. Per altre informazioni, vedere Osservazioni.
[in] dwFlags
Il dwFlags seguente valore è definito ma riservato per un 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 contenente 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 , in ingresso, 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
Se
Quando si usa un di crittografia a blocchi
[in] dwBufLen
Specifica le dimensioni totali, in byte, dell'input pbData buffer.
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
Come regola, se si usa un di crittografia del flusso, il testo crittografato corrisponde alla stessa dimensione del testo non crittografato. Se viene usata una 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 crittografata, può essere eseguita in sezioni chiamando CryptEncrypt ripetutamente. Il parametro Final deve essere impostato su TRUE sull'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 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. Se la lunghezza dei dati è uguale alla dimensione del blocco della crittografia, viene aggiunto un blocco aggiuntivo di riempimento ai dati. 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 CryptEncrypt reimposta il registro dei commenti e suggerimenti della crittografia sul valore KP_IV della chiave.
- Se la crittografia è una crittografia di flusso , il successivo CryptEncrypt reimposta la crittografia sullo 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 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
// 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
Esempi
Per esempi che usano questa funzione, vedere Programma C di esempio: Crittografia di un di file e 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 |