Funzione CryptExportKey (wincrypt.h)
Un handle alla chiave da esportare viene passato alla funzione e la funzione restituisce un BLOB di chiavi. Questo BLOB di chiavi può essere inviato su un trasporto non sicuro o archiviato in un percorso di archiviazione non sicuro. Questa funzione può esportare una chiave di sessione Schannel , una chiave di sessione regolare, una chiave pubblica o una coppia di chiavi pubblica/privata. Il BLOB della chiave da esportare non è inutile finché il destinatario non usa la funzione CryptImportKey su di esso per importare la chiave o la coppia di chiavi nel CSP di un destinatario.
Sintassi
BOOL CryptExportKey(
[in] HCRYPTKEY hKey,
[in] HCRYPTKEY hExpKey,
[in] DWORD dwBlobType,
[in] DWORD dwFlags,
[out] BYTE *pbData,
[in, out] DWORD *pdwDataLen
);
Parametri
[in] hKey
Handle alla chiave da esportare.
[in] hExpKey
Handle a una chiave crittografica dell'utente di destinazione. I dati chiave all'interno del BLOB della chiave esportata vengono crittografati usando questa chiave. Ciò garantisce che solo l'utente di destinazione sia in grado di usare il BLOB della chiave. Sia hExpKey che hKey devono venire dallo stesso CSP.
La maggior parte delle volte è la chiave pubblica di scambio delle chiavi dell'utente di destinazione. Tuttavia, alcuni protocolli in alcuni provider di servizi di configurazione richiedono che una chiave di sessione appartenente all'utente di destinazione venga usata per questo scopo.
Se il tipo BLOB di chiave specificato da dwBlobType è PUBLICKEYBLOB, questo parametro è inutilizzato e deve essere impostato su zero.
Se il tipo BLOB di chiave specificato da dwBlobType è PRIVATEKEYBLOB, questo è in genere un handle per una chiave di sessione da usare per crittografare il BLOB della chiave. Alcuni provider di servizi di rete consentono a questo parametro di essere zero, nel qual caso l'applicazione deve crittografare manualmente il BLOB della chiave privata in modo da proteggerlo.
Per determinare il modo in cui i provider di servizi di crittografia Microsoft rispondono a questo parametro, vedere le sezioni BLOB delle chiavi private dei provider di servizi di crittografia Microsoft.
[in] dwBlobType
Specifica il tipo di BLOB della chiave da esportare in pbData. Questa deve essere una delle costanti seguenti, come illustrato in Archiviazione chiavi crittografiche e Exchange.
Valore | Significato |
---|---|
|
Usato per archiviare le chiavi di sessione in un CSP Schannel o in qualsiasi altro formato specifico del fornitore. I BLOB OPACOKEYBLOB non sono trasferibili e devono essere usati all'interno del provider di servizi di certificazione che ha generato il BLOB. |
|
Usato per trasportare coppie di chiavi pubbliche/private. |
|
Usato per trasportare chiavi pubbliche. |
|
Usato per trasportare le chiavi di sessione. |
|
Un oggetto PLAINTEXTKEYBLOB usato per esportare qualsiasi chiave supportata dal CSP in uso. |
|
Usato per esportare e importare una chiave simmetrica con un'altra chiave simmetrica. La chiave di wrapping effettiva è nel formato specificato nello standard IETF RFC 3217 . |
[in] dwFlags
Specifica opzioni aggiuntive per la funzione. Questo parametro può essere zero o una combinazione di uno o più dei valori seguenti.
Valore | Significato |
---|---|
|
Questo flag causa l'esportazione della funzione versione 3 di un tipo BLOB. |
|
Questo flag elimina la chiave originale in OPAQUEKEYBLOB. Questo flag è disponibile solo nei provider di servizi di configurazione Schannel. |
|
Questo flag causa la creazione della formattazione PKCS #1 versione 2 con la crittografia RSA e la decrittografia durante l'esportazione di SIMPLEBLOBs. |
|
I primi otto byte del riempimento del blocco di crittografia RSA devono essere impostati su 0x03 anziché su dati casuali. Ciò impedisce attacchi di rollback della versione e viene descritto nella specifica SSL3. Questo flag è disponibile solo per i provider di servizi di rete Schannel. |
|
Questo flag non viene usato. |
[out] pbData
Puntatore a un buffer che riceve i dati BLOB delle chiavi . Il formato di questo BLOB varia a seconda del tipo BLOB richiesto nel parametro dwBlobType . Per il formato per PRIVATEKEYBLOBs, PUBLICKEYBLOBs e SIMPLEBLOBs, vedere BLOBS chiave provider di base.
Se questo parametro è NULL, la dimensione del buffer necessaria viene inserita nel valore a cui punta il parametro pdwDataLen . Per altre informazioni, vedere Recupero dei dati di lunghezza sconosciuta.
[in, out] pdwDataLen
Puntatore a un valore DWORD che, nella voce, contiene le dimensioni, in byte, del buffer a cui punta il parametro pbData . Quando la funzione restituisce, questo valore contiene il numero di byte archiviati nel buffer.
Valore restituito
Se la funzione ha esito positivo, la funzione restituisce non zero (TRUE).
Se la funzione ha esito negativo, restituisce zero (FALSE). Per informazioni sull'errore estese, chiamare GetLastError.
I codici di errore preceduti da "NTE" vengono generati dal particolare CSP usato. La tabella seguente mostra alcuni dei possibili codici di errore.
Codice restituito | Descrizione |
---|---|
|
Uno dei parametri specifica un handle non valido. |
|
Uno dei parametri contiene un valore non valido. Questo è più spesso un puntatore che non è valido. |
|
Se il buffer specificato dal parametro pbData non è sufficiente per contenere i dati restituiti, la funzione imposta il codice ERROR_MORE_DATA e archivia le dimensioni del buffer necessarie, in byte, nella variabile a cui punta pdwDataLen. |
|
L'algoritmo che funziona con la chiave pubblica da esportare non è supportato da questo CSP o un tentativo di esportazione di una chiave di sessione crittografata con un elemento diverso da una delle chiavi pubbliche. |
|
Il parametro dwFlags è diverso da zero. |
|
Una o entrambe le chiavi specificate da hKey e hExpKey non sono valide. |
|
Non si dispone dell'autorizzazione per esportare la chiave. Ovvero, quando è stata creata la chiave hKey , il flag di CRYPT_EXPORTABLE non è stato specificato. |
|
Il tipo BLOB della chiave specificato da dwBlobType è PUBLICKEYBLOB , ma hExpKey non contiene un handle di chiave pubblica. |
|
Il parametro dwBlobType specifica un tipo BLOB sconosciuto. |
|
Impossibile trovare il contesto CSP specificato quando è stata creata la chiave hKey . |
|
Una chiave di sessione viene esportata e il parametro hExpKey non specifica una chiave pubblica. |
Commenti
Per una delle permutazioni delle chiavi DES che usano un file PLAINTEXTKEYBLOB, è possibile esportare solo le dimensioni complete della chiave, incluso il bit di parità. Sono supportate le dimensioni delle chiavi seguenti.
Algoritmo | Dimensioni della chiave supportate |
---|---|
CALG_DES | 64 bit |
CALG_3DES_112 | 128 bit |
CALG_3DES | 192 bit |
Esempio
Nell'esempio seguente viene illustrato come esportare una chiave crittografica o una coppia di chiavi in modo più sicuro. In questo esempio si presuppone che sia stato acquisito un contesto crittografico e che una chiave pubblica sia disponibile per l'esportazione. Per un esempio che include il contesto completo per l'uso di questa funzione, vedere Esempio di programma C: firma di un hash e verifica della firma hash. Per un altro esempio che usa questa funzione, vedere Esempio di programma C: Esportazione di una chiave di sessione.
#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
BOOL GetExportedKey(
HCRYPTKEY hKey,
DWORD dwBlobType,
LPBYTE *ppbKeyBlob,
LPDWORD pdwBlobLen)
{
DWORD dwBlobLength;
*ppbKeyBlob = NULL;
*pdwBlobLen = 0;
// Export the public key. Here the public key is exported to a
// PUBLICKEYBLOB. This BLOB can be written to a file and
// sent to another user.
if(CryptExportKey(
hKey,
NULL,
dwBlobType,
0,
NULL,
&dwBlobLength))
{
printf("Size of the BLOB for the public key determined. \n");
}
else
{
printf("Error computing BLOB length.\n");
return FALSE;
}
// Allocate memory for the pbKeyBlob.
if(*ppbKeyBlob = (LPBYTE)malloc(dwBlobLength))
{
printf("Memory has been allocated for the BLOB. \n");
}
else
{
printf("Out of memory. \n");
return FALSE;
}
// Do the actual exporting into the key BLOB.
if(CryptExportKey(
hKey,
NULL,
dwBlobType,
0,
*ppbKeyBlob,
&dwBlobLength))
{
printf("Contents have been written to the BLOB. \n");
*pdwBlobLen = dwBlobLength;
}
else
{
printf("Error exporting key.\n");
free(*ppbKeyBlob);
*ppbKeyBlob = NULL;
return FALSE;
}
return TRUE;
}
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 |