Funzione CryptDeriveKey (wincrypt.h)
Questa funzione è uguale a CryptGenKey, ad eccezione del fatto che le chiavi di sessione generate derivano da dati di base anziché essere casuali. CryptDeriveKey può essere usato solo per generare chiavi di sessione. Non può generare coppie di chiavi pubbliche/private.
Un handle per la chiave di sessione viene restituito nel parametro phKey
Sintassi
BOOL CryptDeriveKey(
[in] HCRYPTPROV hProv,
[in] ALG_ID Algid,
[in] HCRYPTHASH hBaseData,
[in] DWORD dwFlags,
[in, out] HCRYPTKEY *phKey
);
Parametri
[in] hProv
Handle di HCRYPTPROV
[in] Algid
Struttura
Per altre informazioni sui valori di ALG_ID da usare con il provider di crittografia di base Microsoft, vedere algoritmi del provider di base. Per altre informazioni sui valori di ALG_ID da usare con il provider di crittografia avanzata Microsoft o il provider di crittografia avanzata Microsoft, vedere Enhanced Provider Algorithms.
[in] hBaseData
Handle per un oggetto hash che è stato fornito ai dati di base esatti.
Per ottenere questo handle, un'applicazione deve prima creare un oggetto hash con CryptCreateHash e quindi aggiungere i dati di base all'oggetto hash con CryptHashData. Questo processo è descritto in dettaglio in hash e firme digitali.
[in] dwFlags
Specifica il tipo di chiave generata.
Le dimensioni di una chiave di sessione possono essere impostate quando viene generata la chiave. La dimensione della chiave, che rappresenta la lunghezza del modulo di chiave in bit, viene impostata con i 16 bit superiori di questo parametro. Pertanto, se deve essere generata una chiave di sessione a 128 bit RC4, il valore 0x00800000 viene combinato con qualsiasi altro dwFlags valore predefinito con un'operazione diOR bit per bit. A causa della modifica delle restrizioni del controllo di esportazione, il provider di servizi di configurazione predefinito e la lunghezza predefinita della chiave possono cambiare tra le versioni del sistema operativo. È importante che sia la crittografia che la decrittografia usino lo stesso provider di servizi di configurazione e che la lunghezza della chiave venga impostata in modo esplicito usando il parametro dwFlags per garantire l'interoperabilità su piattaforme del sistema operativo diverse.
I 16 bit inferiori di questo parametro possono essere zero oppure è possibile specificare uno o più dei flag seguenti usando l'operatore ORor bit per bit per combinarli.
Valore | Significato |
---|---|
|
In genere, quando viene creata una chiave di sessione da un valore hash, sono presenti diversi bit rimanenti. Ad esempio, se il valore hash è a 128 bit e la chiave di sessione è a 40 bit, verranno lasciati 88 bit.
Se questo flag è impostato, alla chiave viene assegnato un valore salt in base ai bit del valore hash inutilizzato. È possibile recuperare questo valore salt Se questo flag non è impostato, alla chiave viene assegnato un valore salt pari a zero. Quando le chiavi con valori salt diversi da zero vengono esportate (usando CryptExportKey), è necessario ottenere e conservare anche il valore salt con la chiave BLOB. |
|
Se questo flag è impostato, la chiave di sessione può essere trasferita dal provider di servizi di configurazione in un BLOB di chiavi tramite la funzione CryptExportKey Se questo flag non è impostato, la chiave della sessione non è esportabile. Ciò significa che la chiave è disponibile solo all'interno della sessione corrente e solo l'applicazione che l'ha creata è in grado di usarla. Questo flag non si applica a coppie di chiavi pubbliche/private. |
|
Questo flag specifica che non viene allocato alcun valore salt per una chiave simmetrica a 40 bit. Per altre informazioni, vedere funzionalità valore salt. |
|
Alcuni CSP usano chiavi di sessione derivate da più valori hash. In questo caso, CryptDeriveKey deve essere chiamato più volte.
Se questo flag è impostato, non viene generata una nuova chiave di sessione. Viene invece modificata la chiave specificata da phKey. Il comportamento preciso di questo flag dipende dal tipo di chiave da generare e dal particolare CSP in uso. I provider di servizi di crittografia Microsoft ignorano questo flag. |
|
Questo flag viene usato solo con provider di Schannel |
[in, out] phKey
Puntatore a una variabile HCRYPTKEY per ricevere l'indirizzo dell'handle della chiave appena generata. Al termine dell'uso della chiave, rilasciare l'handle chiamando la funzione CryptDestroyKey
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 da "NTE" vengono generati dal provider di servizi di configurazione specifico usato. Nella tabella seguente sono elencati alcuni possibili codici di errore.
Codice restituito | Descrizione |
---|---|
|
Uno dei parametri specifica un handle non valido. |
|
Uno dei parametri contiene un valore non valido. Si tratta più spesso di un puntatore non valido. |
|
Il parametro |
|
Il parametro dwFlags contiene un valore non valido. |
|
Il parametro hBaseData |
|
È stato effettuato un tentativo di aggiungere dati a un oggetto hash già contrassegnato come "completato". |
|
Il parametro hProv non contiene un handle di contesto valido. |
|
La funzione non è riuscita in modo imprevisto. |
|
Il provider non è riuscito a eseguire l'azione perché il contesto è stato acquisito come invisibile all'utente. |
Osservazioni
Quando vengono generate chiavi per crittografia a blocchi simmetrica, la chiave per impostazione predefinita viene configurata in modalità di concatenamento a blocchi di crittografia (CBC) con un vettore di inizializzazione pari a zero. Questa modalità di crittografia fornisce un metodo predefinito valido per la crittografia bulk dei dati. Per modificare questi parametri, usare la funzione
La funzione CryptDeriveKey
Per scegliere una lunghezza della chiave appropriata, sono consigliati i metodi seguenti.
- Per enumerare gli algoritmi supportati dal provider di servizi di configurazione e per ottenere la lunghezza massima e minima della chiave per ogni algoritmo, chiamare CryptGetProvParam con PP_ENUMALGS_EX.
- Usare le lunghezze minime e massime per scegliere una lunghezza della chiave appropriata. Non è sempre consigliabile scegliere la lunghezza massima perché ciò può causare problemi di prestazioni.
- Dopo aver scelto la lunghezza della chiave desiderata, usare i 16 bit superiori del parametro dwFlags per specificare la lunghezza della chiave.
- Formare un buffer a 64 byte ripetendo la costante 0x36 64 volte. Lasciare k essere la lunghezza del valore hash rappresentato dal parametro di input hBaseData. Impostare il primo k byte del buffer sul risultato di un'operazione di XOR del primo k byte del buffer con il valore hash rappresentato dal parametro di input hBaseData.
- Formare un buffer a 64 byte ripetendo la costante 0x5C 64 volte. Impostare il primo k byte del buffer sul risultato di un'operazione di XOR del primo k byte del buffer con il valore hash rappresentato dal parametro di input hBaseData.
- Eseguire l'hash del risultato del passaggio 1 usando lo stesso algoritmo hash usato per calcolare il valore hash rappresentato dal parametro hBaseData.
- Eseguire l'hash del risultato del passaggio 2 usando lo stesso algoritmo hash usato per calcolare il valore hash rappresentato dal parametro hBaseData.
- Concatenare il risultato del passaggio 3 con il risultato del passaggio 4.
- Usare il primo n byte del risultato del passaggio 5 come chiave derivata.
Nella tabella seguente sono elencate le lunghezze minime, predefinite e massime della chiave per la chiave di sessione in base all'algoritmo e al provider.
Provider | Algoritmi | Lunghezza minima chiave | Lunghezza della chiave predefinita | Lunghezza massima della chiave |
---|---|---|---|---|
MS Base | RC4 e RC2 | 40 | 40 | 56 |
MS Base | DES | 56 | 56 | 56 |
MS Enhanced | RC4 e RC2 | 40 | 128 | 128 |
MS Enhanced | DES | 56 | 56 | 56 |
MS Enhanced | 3DES 112 | 112 | 112 | 112 |
MS Enhanced | 3DES | 168 | 168 | 168 |
MS Strong | RC4 e RC2 | 40 | 128 | 128 |
MS Strong | DES | 56 | 56 | 56 |
MS Strong | 3DES 112 | 112 | 112 | 112 |
MS Strong | 3DES | 168 | 168 | 168 |
DSS/DH Base | RC4 e RC2 | 40 | 40 | 56 |
DSS/DH Base | Cylink MEK | 40 | 40 | 40 |
DSS/DH Base | DES | 56 | 56 | 56 |
DSS/DH Enh | RC4 e RC2 | 40 | 128 | 128 |
DSS/DH Enh | Cylink MEK | 40 | 40 | 40 |
DSS/DH Enh | DES | 56 | 56 | 56 |
DSS/DH Enh | 3DES 112 | 112 | 112 | 112 |
DSS/DH Enh | 3DES | 168 | 168 | 168 |
Esempi
Per un esempio che usa questa funzione, vedere Programma C di esempio: Derivazione di una chiave di sessione da una password.
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 |