Partager via


Fonction CryptImportKey (wincrypt.h)

important cette API est déconseillée. Les logiciels nouveaux et existants doivent commencer à utiliser API de nouvelle génération de chiffrement. Microsoft peut supprimer cette API dans les versions ultérieures.
 
La fonction CryptImportKey transfère un de clé de chiffrement à partir d’un blob de clé de vers un fournisseur de services de chiffrement (CSP). Cette fonction peut être utilisée pour importer une clé de session Schannel, une clé de session régulière, clé publique ou paire de clés publique/privée. Pour toutes les clés publiques, la clé ou la paire de clés est chiffrée.

Syntaxe

BOOL CryptImportKey(
  [in]  HCRYPTPROV hProv,
  [in]  const BYTE *pbData,
  [in]  DWORD      dwDataLen,
  [in]  HCRYPTKEY  hPubKey,
  [in]  DWORD      dwFlags,
  [out] HCRYPTKEY  *phKey
);

Paramètres

[in] hProv

Handle d’un fournisseur de solutions cloud obtenu avec la fonction CryptAcquireContext.

[in] pbData

Tableau BYTE qui contient un en-tête PUBLICKEYSTRUC BLOB suivi de la clé chiffrée. Cette clé BLOB est créée par la fonction CryptExportKey, dans cette application ou par une autre application éventuellement exécutée sur un autre ordinateur.

[in] dwDataLen

Contient la longueur, en octets, de l’objet BLOB de clé.

[in] hPubKey

Handle vers la clé de chiffrement qui déchiffre la clé stockée dans pbData. Cette clé doit provenir du même fournisseur de solutions cloud auquel hProv fait référence. La signification de ce paramètre diffère selon le type CSP et le type de blob de clé importé :

  • Si l’objet BLOB de clé est chiffré avec la paire de clés exchange , par exemple, une SIMPLEBLOB, ce paramètre peut être le handle de la clé d’échange de clé.
  • Si la clé BLOB est chiffrée avec une clé de session, par exemple, un PRIVATEKEYBLOB chiffré, ce paramètre contient le handle de cette clé de session.
  • Si l’objet BLOB de clé n’est pas chiffré, par exemple, une PUBLICKEYBLOB, ce paramètre n’est pas utilisé et doit être égal à zéro.
  • Si la clé BLOB est chiffrée avec une clé de session dans une Schannel CSP, par exemple, un CHIFFRÉ OPAQUEKEYBLOB ou tout autre OPAQUEKEYBLOB spécifique au fournisseur, ce paramètre n’est pas utilisé et doit être défini sur zéro.
Remarque Certains fournisseurs de services cloud peuvent modifier ce paramètre à la suite de l’opération. Les applications qui utilisent par la suite cette clé à d’autres fins doivent appeler la fonction CryptDuplicateKey pour créer un handle de clé en double. Une fois l’application terminée à l’aide du handle, relâchez-la en appelant la fonction CryptDestroyKey.
 

[in] dwFlags

Actuellement utilisé uniquement lorsqu’une paire de clés publique/privée sous la forme d’un PRIVATEKEYBLOB est importée dans le fournisseur de solutions Cloud.

Ce paramètre peut être l’une des valeurs suivantes.

Valeur Signification
CRYPT_EXPORTABLE
La clé importée est finalement réexportée. Si cet indicateur n’est pas utilisé, les appels à CryptExportKey avec le handle de clé échouent.
CRYPT_OAEP
Cet indicateur entraîne la vérification de la mise en forme PKCS #1 version 2 avec le chiffrement RSA et le déchiffrement lors de l’importation SIMPLEBLOBs.
CRYPT_NO_SALT
Une valeur sans sel est allouée pour unde clé symétrique 40 bits. Pour plus d’informations, consultez fonctionnalité Salt Value.
CRYPT_USER_PROTECTED
Si cet indicateur est défini, le fournisseur de solutions Cloud avertit l’utilisateur via une boîte de dialogue ou une autre méthode lorsque certaines actions sont tentées à l’aide de cette clé. Le comportement précis est spécifié par le fournisseur de solutions Cloud ou le type CSP utilisé. Si le contexte du fournisseur a été acquis avec CRYPT_SILENT set, l’utilisation de cet indicateur provoque un échec et la dernière erreur est définie sur NTE_SILENT_CONTEXT.
CRYPT_IPSEC_HMAC_KEY
Permet l’importation d’une clé RC2 supérieure à 16 octets. Si cet indicateur n’est pas défini, les appels à la fonction CryptImportKey avec des clés RC2 supérieures à 16 octets échouent et un appel à GetLastError retourne NTE_BAD_DATA.

[out] phKey

Pointeur vers une valeur HCRYPTKEY qui reçoit le handle de la clé importée. Lorsque vous avez terminé d’utiliser la clé, relâchez le handle en appelant la fonction CryptDestroyKey.

Valeur de retour

Si la fonction réussit, la fonction retourne une valeur différente de zéro.

Si la fonction échoue, elle retourne zéro. Pour obtenir des informations d’erreur étendues, appelez GetLastError.

Les codes d’erreur précédés par « NTE » sont générés par le fournisseur de solutions Cloud en cours d’utilisation. Certains codes d’erreur possibles suivent.

Retourner le code Description
ERROR_BUSY
Certains fournisseurs de solutions cloud définissent cette erreur si une clé privée est importée dans un conteneur tandis qu’un autre thread ou processus utilise cette clé.
ERROR_INVALID_HANDLE
L’un des paramètres spécifie un handle qui n’est pas valide.
ERROR_INVALID_PARAMETER
L’un des paramètres contient une valeur qui n’est pas valide. Il s’agit le plus souvent d’un pointeur qui n’est pas valide.
NTE_BAD_ALGID
Le blob de clé simple à importer n’est pas chiffré avec l’algorithme d’échange de clés attendu.
NTE_BAD_DATA
L’algorithme qui fonctionne avec la clé publique à importer n’est pas pris en charge par ce fournisseur de solutions Cloud, ou une tentative a été effectuée pour importer une clé de session qui a été chiffrée avec quelque chose d’autre que l’une de vos clés publiques.
NTE_BAD_FLAGS
Le paramètre dwFlags spécifié n’est pas valide.
NTE_BAD_TYPE
Le type BLOB de clé n’est pas pris en charge par ce fournisseur de solutions Cloud et n’est peut-être pas valide.
NTE_BAD_UID
Le paramètre hProv ne contient pas de handle de contexte valide.
NTE_BAD_VER
Le numéro de version de la clé BLOB ne correspond pas à la version csp. Cela indique généralement que le fournisseur de solutions Cloud doit être mis à niveau.

Remarques

Lors de l’importation d’une clé Hash-Based code d’authentification de message (HMAC), l’appelant doit identifier la clé importée en tant que type PLAINTEXTKEYBLOB et définir l’identificateur d’algorithme approprié dans le champ aiKeyAlg de l’en-tête PUBLICKEYSTRUC BLOB.

La fonction CryptImportKey peut être utilisée pour importer une clé en texte clair pour les algorithmes symétriques ; Toutefois, nous vous recommandons d’utiliser la fonction CryptGenKey à la place pour faciliter l’utilisation. Lorsque vous importez une clé en texte clair, la structure de la clé BLOB transmise dans le paramètre pbData est une PLAINTEXTKEYBLOB.

Vous pouvez utiliser le type PLAINTEXTKEYBLOB avec n’importe quel algorithme ou type de combinaison de touches prise en charge par le fournisseur de solutions Cloud en cours d’utilisation.

Pour obtenir un exemple d’importation d’une clé en texte clair, consultez Exemple de programme C : importation d’une clé en texte brut.

L’exemple suivant montre comment définir les champs d’en-tête.

keyBlob.header.bType = PLAINTEXTKEYBLOB;
keyBlob.header.bVersion = CUR_BLOB_VERSION;
keyBlob.header.reserved = 0;
// CALG_AES_128 is used as an example. You would set this to the 
// algorithm id that corresponds to the one used by the key.
keyBlob.header.aiKeyAlg = CALG_AES_128;

La longueur de la clé est spécifiée dans keyBlob.keyLength, suivie des données de clé réelles.

Remarque Les algorithmes HMAC n’ont pas leurs propres identificateurs d’algorithme ; utilisez plutôt CALG_RC2. CRYPT_IPSEC_HMAC_KEY autorise l’importation de clés RC2 supérieures à 16 octets.
 
Pour l’une des permutations de clé (DES) standard de chiffrement de données qui utilisent PLAINTEXTKEYBLOB, seule la taille de clé complète, y compris le bit de parité, peut être importée.

Les tailles de clé suivantes sont prises en charge.

Algorithme Taille de clé prise en charge
CALG_DES 64 bits
CALG_3DES_112 128 bits
CALG_3DES 192 bits
 

Exemples

L’exemple suivant montre comment importer une clé à partir d’un objet BLOB de clés. Pour obtenir un exemple complet pour cette fonction, consultez Exemple de programme C : signature d’un hachage et vérification de la signature de hachage. Pour obtenir du code supplémentaire qui utilise cette fonction, consultez Exemple de programme C : déchiffrement d’un fichier.

#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>

BOOL ImportKey(HCRYPTPROV hProv, LPBYTE pbKeyBlob, DWORD dwBlobLen)
{
    HCRYPTKEY hPubKey;

    //---------------------------------------------------------------
    // This code assumes that a cryptographic provider (hProv) 
    // has been acquired and that a key BLOB (pbKeyBlob) that is 
    // dwBlobLen bytes long has been acquired. 

    //---------------------------------------------------------------
    // Get the public key of the user who created the digital 
    // signature and import it into the CSP by using CryptImportKey. 
    // The key to be imported is in the buffer pbKeyBlob that is  
    // dwBlobLen bytes long. This function returns a handle to the 
    // public key in hPubKey.

    if(CryptImportKey(
        hProv,
        pbKeyBlob,
        dwBlobLen,
        0,
        0,
        &hPubKey))
    {
        printf("The key has been imported.\n");
    }
    else
    {
        printf("Public key import failed.\n");
        return FALSE;
    }

    //---------------------------------------------------------------
    // Insert code that uses the imported public key here.
    //---------------------------------------------------------------

    //---------------------------------------------------------------
    // When you have finished using the key, you must release it.
    if(CryptDestroyKey(hPubKey))
    {
        printf("The public key has been released.");
    }
    else
    {
        printf("The public key has not been released.");
        return FALSE;
    }

    return TRUE;
}

Exigences

Exigence Valeur
client minimum pris en charge Windows XP [applications de bureau uniquement]
serveur minimum pris en charge Windows Server 2003 [applications de bureau uniquement]
plateforme cible Windows
d’en-tête wincrypt.h
bibliothèque Advapi32.lib
DLL Advapi32.dll

Voir aussi

CryptAcquireContext

CryptDestroyKey

CryptExportKey

de génération de clés et de fonctions Exchange