Opérations liées aux clés GNC

Répertoire des chapitres

  1. Présentation
  2. Créer une clé
  3. Afficher la clé dans le système
  4. Exporter la clé du Windows Store
  5. Importer la clé dans le Windows Store

<b> La capacité de l'auteur est limitée. Si vous trouvez des erreurs pendant le processus de lecture, veuillez également me contacter pour signaler les erreurs et éviter que les lecteurs apprennent plus tard les mauvaises connaissances. Merci! </ b>

Présentation

CNG est l'acronyme de Cryptography API: Next Generation (CNG). Il s'agit du terme général pour les API de nouvelle génération liées au chiffrement sur la plate-forme Windows. Il s'agit d'une alternative à l'API Crypto. Comparé à CryptoAPI, il a des fonctions plus puissantes.

Cet article donnera une méthode d'utilisation de CNG pour faire fonctionner la clé et les API associées sous forme d'exemples.

Veuillez noter que dans cet article, nous utilisons la clé RSA à titre d'exemple, les clés DSA et ECC sont également applicables.

Créer une clé

La version actuelle de CNG prend en charge les algorithmes RSA, DSA et ECC. Ici, nous créons une clé RSA avec une longueur de clé de 2048 bits. Notez que lorsque vous essayez de créer une clé DSA 2048, assurez-vous que votre système la prend en charge. Mon Win7 est Non pris en charge et Win10 est pris en charge (test pro).

Ici, nous utilisons les API suivantes dans l'ordre:
<code> NCryptOpenStorageProvider </ code> Cette méthode est utilisée pour charger et initialiser un fournisseur de stockage de clés CNG existant. Deux KSP sont intégrés dans le système Windows actuel: MS_KEY_STORAGE_PROVIDER, MS_SMART_CARD_KEY_STORAGE_PROVAGE.KE__ID .
<code> NCryptCreatePersistedKey </ code> Cette méthode est utilisée pour la clé d'un algorithme spécifique et la stocke dans le KSP spécifié. Notez que la clé créée par cette méthode sera stockée dans le système Windows sous forme de fichier.
<code> NCryptSetProperty </ code> Cette méthode est utilisée pour définir la propriété de la clé. Dans l'exemple, nous allons l'utiliser pour définir la longueur de la clé à 2048 bits.
<code> NCryptFinalizeKey </ code> Cette méthode est utilisée pour informer Windows que l'opération de création de la clé est terminée, appelez Après cette méthode, la clé que nous avons créée peut être utilisée pour des opérations telles que le chiffrement de signature, sinon elle ne le peut pas.
<Code> NCryptFreeObject </ code> Cette méthode est utilisée pour libérer le descripteur système que nous avons utilisé dans l'opération précédente.

int Create2048RSAKey() {
  int errCode = 0;

  NCRYPT_PROV_HANDLE prov = NULL;
  NCRYPT_KEY_HANDLE  key = NULL;
  DWORD keyLength = 2048;
  DWORD policy = NCRYPT_ALLOW_EXPORT_FLAG | NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG;

  if (errCode = NCryptOpenStorageProvider(&prov, MS_KEY_STORAGE_PROVIDER, 0)) goto done;
  if (errCode = NCryptCreatePersistedKey(prov, &key, NCRYPT_RSA_ALGORITHM, L"TestRSAKey", 0, NCRYPT_OVERWRITE_KEY_FLAG)) goto done;
  if (errCode = NCryptSetProperty(key, NCRYPT_LENGTH_PROPERTY, (PBYTE)(&keyLength), sizeof(keyLength), NCRYPT_PERSIST_FLAG)) goto done;
  if (errCode = NCryptSetProperty(key, NCRYPT_EXPORT_POLICY_PROPERTY, (PBYTE)(&policy), sizeof(policy), NCRYPT_PERSIST_FLAG)) goto done;
  if (errCode = NCryptFinalizeKey(key, 0)) goto done;

done:
  if (prov) NCryptFreeObject(prov);
  if (key) NCryptFreeObject(key);
  return errCode;
}

Après avoir exécuté cette méthode sur votre ordinateur Windows, la clé que nous venons de créer sera stockée dans votre système. Dans la
section suivante, nous utiliserons l'API CNG pour afficher les informations de la clé que nous avons créée.

Afficher la clé dans le système

L'API CNG que nous utiliserons ici est:
<code> NCryptEnumKeys </ code> Cette méthode est utilisée pour parcourir toutes les clés stockées dans le KSP actuel.
Ici, nous expliquons certains de ses paramètres:
<code> NCryptKeyName ** ppKeyName </ code> Ce paramètre est utilisé comme valeur de retour de la méthode, qui enregistre le nom de la clé actuelle, l'algorithme de la clé et d'autres informations importantes. Le nom est particulièrement important, par exemple, dans notre exemple, nous utiliserons le nom pour obtenir le handle de la clé, puis utiliser la clé pour le faire Plus d'opérations.
<Code> PVOID * ppEnumState </ code> Ce paramètre est également utilisé comme valeur de retour de la méthode. Mais sa valeur n'a aucun sens pour l'appelant. Il stocke les informations intermédiaires de la clé de parcours, qui est nous La prochaine fois que le paramètre d'entrée de la méthode NCryptEnumKeys sera appelé. Si ce paramètre est défini sur NULL, la traversée renverra toujours les informations de la première clé du KSP actuel.
<Code> valeur de retour </ code> Lorsque cette méthode renvoie une valeur de NTE_NO_MORE_ITEMS, elle représente Il a traversé toutes les clés du KSP actuel.
<Code> NCryptOpenKey </ code> Cette méthode est utilisée pour obtenir le gestionnaire de clés qui exécute le nom spécifié dans le KSP.
<Code> NCryptGetProperty </ code> Cette méthode est utilisée Utilisé pour obtenir les propriétés de Key.

int ListKeys() {
  int errCode = 0;
  NCRYPT_PROV_HANDLE prov        = NULL;
  NCRYPT_KEY_HANDLE  key         = NULL;
  NCryptKeyName*     pKeyName    = NULL;
  PVOID              pEnumState = NULL;
  
  if (errCode = NCryptOpenStorageProvider(&prov, MS_KEY_STORAGE_PROVIDER, 0)) goto done;
  do {
    errCode = NCryptEnumKeys(prov, 0, &pKeyName, &pEnumState, 0);
    if (errCode == NTE_NO_MORE_ITEMS) break; // all the keys are enumerated
    if (!pKeyName) break; // should not happen
    
    LPCWSTR name = pKeyName->pszName;
    LPCWSTR alg  = pKeyName->pszAlgid;
    
    // get key length property
    DWORD keyLength = 0,  outLen = 0;
    if (errCode = NCryptOpenKey(prov, &key, name, 0, 0)) goto done;
    if (errCode = NCryptGetProperty(key, NCRYPT_LENGTH_PROPERTY, (PBYTE) (&keyLength), sizeof(keyLength), &outLen, 0)) goto done;

    wprintf(L"KeyName: %s, KeyAlgorithm: %s, KeyLength: %d", name, alg, keyLength);
  } while (!errCode);
  
done:
  if (prov) NCryptFreeObject(prov);
  if (key) NCryptFreeObject(key);
  return errCode;
}

Si vous exécutez la fonction dans la première section sur votre ordinateur, puis exécutez la fonction ListKeys, votre ligne de commande contiendra certainement cette sortie:

<code> KeyName: TestRSAKey, KeyAlgorithm: RSA, KeyLength: 2048 </code>

Exporter la clé du Windows Store

Grâce à la description des deux sous-sections ci-dessus, nous avons réussi à créer la clé dans le système Windows et pouvons afficher les informations sur la clé pour obtenir le descripteur de clé. À l'aide du descripteur de clé, nous pouvons effectuer beaucoup de travail. Cependant, nous devons souvent placer la clé partout Dans le fichier et partagez-le avec vos pairs.

Dans cette section, nous allons essayer d'exporter la clé.

<code> NCryptExportKey </ code> Cette méthode est utilisée pour exporter la clé du système vers le blob de mémoire.
Elle a un paramètre très important:
<code> LPCWSTR pszBlobType </ code> est utilisé pour contrôler le format du blob de mémoire exporté. Dans l'exemple, nous utilisons NCRYPT_PKCS8_PRIVATE_KEY_BLOB. <B> Croyez-moi, ce format sera le plus pratique pour nous de poursuivre le traitement. D'autres formats, tels que BCRYPT_DSA_PUBLIC_BLOB, LEGACY_DSA_PRIVATE_BLOB, etc. ne sont pas toujours comme vous le pensez. Fonctionne comme ça. Leur format n'est pas toujours le même que lorsque CryptExportKey est exporté. Lorsque la longueur de la clé atteint 2048 ou plus, il est difficile de trouver les documents correspondants pour décrire son format à ce moment. Et PKCS8 fonctionne très bien. </ B>

int ExportKey() {
  int errCode = 0;

  NCRYPT_PROV_HANDLE prov = NULL;
  NCRYPT_KEY_HANDLE  key = NULL;
  BYTE blob[0x1000] = {0};
  DWORD blobLen = 0x1000;

  if (errCode = NCryptOpenStorageProvider(&prov, MS_KEY_STORAGE_PROVIDER, 0)) goto done;
  if (errCode = NCryptOpenKey(prov, &key, L"TestRSAKey", 0, 0)) goto done;
  if (errCode = NCryptExportKey(key, NULL, NCRYPT_PKCS8_PRIVATE_KEY_BLOB, NULL, blob, blobLen, &blobLen, 0)) goto done;

done:
  if (prov) NCryptFreeObject(prov);
  if (key) NCryptFreeObject(key);
  return errCode;
}

Lorsque vous exécutez la fonction et un handle de clé, si vous obtenez le code d'erreur 0x80090029, veuillez confirmer que la valeur de l'attribut NCRYPT_EXPORT_POLICY_PROPERTY de votre clé contient NCRYPT_ALLOW_EXPORT_FLAG et NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG. (C'est pourquoi, dans le code de la première section, nous sommes effacés La raison pour laquelle la propriété Key créée a cette valeur.)

Si votre clé ne contient pas NCRYPT_ALLOW_EXPORT_FLAG et NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG, cela signifie que votre clé ne peut pas être exportée et vous ne pouvez utiliser la clé de la clé que pour effectuer d'autres tâches.

Si l'attribut de votre clé contient uniquement NCRYPT_ALLOW_EXPORT_FLAG, cela signifie que vous ne pouvez pas exporter votre certificat en texte brut. Pour le moment, vous devez définir le deuxième paramètre de NCryptExportKey sur une valeur non NULL. Personnellement, cela vous paraît très gênant, si vous Ayez le code correspondant, merci de le partager avec moi!

Un peu d'expérience personnelle, si votre clé est un PFX importé par les utilisateurs via CryptAPI ou manuellement, sur la plate-forme Win10, votre clé est susceptible d'avoir uniquement la marque NCRYPT_ALLOW_EXPORT_FLAG, et ne prend pas en charge l'exportation en texte brut. Si je me trompe, faites-le moi savoir!

Importer la clé dans le Windows Store

Dans de nombreux cas, nous n'utilisons pas toujours le système pour créer directement la clé, mais nous utilisons notre clé existante. Ensuite, lorsque vous souhaitez que votre clé fonctionne avec l'API CNG, l'importation de votre clé dans le système sera indispensable. Notez que l'exemple que nous donnons ici enregistrera la clé dans le système. Si vous voulez simplement obtenir la clé sans importer la clé dans le KSP, il vous suffit de définir le nom de la clé.

Ici, nous importons la clé de format PKCS8 dans le système. Si votre clé est dans un autre format, vous avez deux options: la convertir au format PKCS8 et utiliser la méthode suivante pour importer ou trouver d'autres méthodes disponibles.

Il y a deux points à mentionner ici:
<code> NCryptBufferDesc * pParameterList </ code> Ce paramètre peut être utilisé pour définir les informations de paramètre de la clé. Ici, nous utilisons ce paramètre pour spécifier le nom de la clé à importer dans le système. Si la clé est spécifiquement définie Nom, la clé sera une clé temporaire, elle ne sera pas stockée dans la fenêtre.
<Code> DWORD dwFlags </ code> Si vous devez définir la propriété Key après l'importation de la clé, vous devez inclure NCRYPT_DO_NOT_FINALIZE_FLAG dans ce paramètre Mark. Dans l'exemple, après avoir importé la clé, nous devons définir la propriété NCRYPT_EXPORT_POLICY_PROPERTY de la clé, nous avons donc utilisé la marque NCRYPT_DO_NOT_FINALIZE_FLAG. Si vous n'avez pas utilisé la NCRYPT_DO_NOT_FINALIZE_FLAG, n'appelez pas la méthode NCryptFinalizeKey autrement, rappelez-nous la méthode NCryptFinalizeKey

int ImportKey() {
  BYTE blob[] = { 0x30,0x82,0x04,0xbd,0x02,0x01,0x00,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x82,0x04,0xa7,0x30,0x82,0x04,0xa3,0x02,0x01,
0x00,0x02,0x82,0x01,0x01,0x00,0xad,0xaa,0x8c,0x75,0x51,0x15,0x23,0x55,0xc7,0xec,0x7f,0x0b,0x85,0xf9,0x4b,0x18,0x10,0x60,0xdb,0x3d,0xc2,0xd2,0xcf,0xa6,0x8d,0x09,
0x8a,0xc9,0x7a,0x0e,0x80,0xb8,0x60,0x5a,0x20,0xe7,0xcb,0x52,0x33,0xc0,0xa3,0xc8,0x33,0x05,0xb0,0x45,0x34,0x49,0x59,0x0d,0xff,0xed,0xe5,0xe9,0x42,0xc4,0x05,0x82,
0x1a,0x92,0x67,0x24,0xea,0xc6,0x2a,0x07,0x67,0x07,0x65,0xa9,0xb8,0xe8,0x25,0xa2,0x16,0xe5,0x47,0xf2,0x79,0x98,0xcd,0x7c,0xce,0xbc,0x28,0x95,0x5f,0x9a,0xcd,0x70,
0x30,0xbb,0x7c,0xc9,0xc1,0x55,0xac,0x06,0x42,0xa8,0x86,0x78,0x47,0x69,0xa0,0xfb,0x5e,0x10,0x01,0xe4,0x3a,0xbc,0x09,0xb3,0xfd,0x3f,0x3d,0x3c,0x47,0xe7,0xd2,0x8f,
0xaf,0x2f,0x04,0x38,0x74,0xdc,0x3b,0x74,0x31,0xfb,0x55,0x39,0x94,0xeb,0xe3,0x7c,0x17,0x8d,0x51,0x50,0xa2,0x25,0x87,0x4b,0xfb,0xd2,0x3c,0xb6,0x70,0x45,0xd1,0x55,
0xb0,0x8e,0x9d,0x24,0xcb,0xd7,0xa0,0xc2,0xdd,0xfa,0x7b,0xa4,0x3f,0xd3,0xbe,0x7e,0x09,0x87,0x46,0x37,0xda,0x29,0x7c,0x95,0x85,0x0d,0x6d,0xfc,0xbf,0xbf,0x41,0xbe,
0x79,0x2c,0x83,0x87,0x1b,0x6f,0x24,0x8a,0x60,0x85,0x36,0xf6,0xcb,0x63,0x0c,0x66,0x16,0x0b,0x97,0x4a,0xdc,0xdb,0x91,0x0d,0xf9,0x1d,0x7e,0xae,0xbc,0xd9,0x77,0x39,
0x38,0x3e,0x7b,0x04,0x92,0x71,0x94,0x18,0x66,0xc8,0x77,0x5e,0x5c,0x42,0x16,0xc7,0x18,0x61,0x5a,0xdd,0x4f,0xaf,0x77,0x9a,0x14,0xba,0x39,0x98,0x22,0x73,0x49,0xfa,
0x73,0x2b,0x6d,0x0c,0x3b,0x27,0x02,0x03,0x01,0x00,0x01,0x02,0x82,0x01,0x00,0x2b,0xd2,0xef,0xe2,0xe2,0xf5,0x2c,0x97,0x86,0xfd,0xdd,0x09,0x71,0x63,0x79,0x59,0xb7,
0x38,0x59,0xda,0xfa,0x00,0xec,0xb9,0xa0,0xb9,0x99,0xb6,0x42,0x00,0xca,0xe6,0xbc,0x19,0xc2,0x57,0xfb,0xec,0xe0,0x76,0x6a,0x5e,0x28,0xd1,0xf4,0xab,0x62,0x08,0x68,
0x5a,0xaa,0x0c,0xc4,0x89,0xda,0x79,0x50,0xd2,0x86,0x16,0x0f,0xc5,0x37,0x21,0x8e,0x95,0x93,0xa0,0x40,0x3d,0x56,0x15,0xee,0xf9,0x3a,0x41,0xdd,0xa8,0x08,0x9b,0x50,
0xaf,0x80,0x13,0xe7,0x41,0xda,0x80,0x5b,0xfb,0x45,0xb0,0xea,0x4a,0x97,0x69,0x21,0x21,0xeb,0x4c,0x4f,0xb2,0xa6,0x82,0xb7,0x46,0xf7,0x73,0x9e,0xa6,0x93,0x53,0xc4,
0x37,0x11,0x5f,0x15,0xfa,0xd2,0x42,0x63,0xd6,0x32,0x64,0xf0,0xf1,0xb6,0x3b,0x3a,0xb2,0xc8,0x25,0xc3,0x80,0xa1,0xa3,0xe7,0xb4,0x35,0xab,0x13,0xa9,0x3a,0x40,0xd1,
0x16,0xf6,0x63,0x62,0x62,0xeb,0x7c,0x58,0x4f,0x56,0x94,0xde,0x28,0x8a,0x48,0xc6,0xf0,0x3b,0x88,0x01,0xd3,0x8b,0xc6,0x0b,0x17,0x01,0x10,0x28,0x00,0x9c,0xd0,0x80,
0xc2,0xe8,0x00,0xdc,0x6b,0x37,0x39,0x1c,0xef,0x78,0x34,0x1d,0x49,0x12,0xd4,0x66,0x88,0x20,0x87,0xe2,0x1e,0x2b,0x05,0x26,0x8a,0xa7,0xd0,0x3d,0xe7,0xd0,0x47,0xed,
0xbe,0x1f,0xec,0xd6,0xa1,0xd3,0xe2,0x0e,0xb5,0xe5,0x3c,0xc2,0x83,0x69,0x77,0x36,0x9d,0x80,0x2b,0xe9,0xe1,0x14,0xe0,0xd5,0x27,0x62,0x35,0xc1,0x40,0xc6,0xf2,0x6e,
0xdb,0xc1,0x58,0xb8,0x9c,0xbc,0x83,0x36,0x81,0xfb,0x70,0xae,0x0c,0x5c,0xc1,0x02,0x81,0x81,0x00,0xd2,0x5f,0x19,0x94,0x11,0xb8,0xdc,0x77,0x2e,0x93,0x15,0x50,0x09,
0xa9,0x20,0xf0,0x1b,0xd1,0x3d,0x4a,0x1d,0x2c,0xb6,0x98,0xec,0x11,0xf1,0xe8,0xa0,0x85,0x4c,0xf8,0x14,0x27,0x80,0x26,0xff,0x78,0xa1,0x17,0x52,0xa3,0xbf,0xf6,0xc6,
0x86,0xab,0xca,0x5f,0x1e,0x5e,0x8f,0x78,0x5e,0x71,0x7d,0x2c,0x57,0xbe,0xda,0x80,0xa2,0x8b,0x6a,0x88,0xab,0xcd,0x78,0xc3,0x67,0xf6,0xb5,0x60,0x96,0x5c,0x24,0xac,
0x8c,0x4b,0x77,0x36,0xe2,0x97,0x16,0x87,0x6a,0x03,0xa7,0x36,0x4a,0xdf,0x5d,0xc3,0x6f,0x1f,0x60,0xfd,0x40,0x60,0x0e,0xca,0xb9,0x25,0x37,0xfa,0x50,0xc3,0x82,0x2f,
0x3a,0xeb,0x1b,0xd5,0xe0,0x6f,0x13,0x17,0x7d,0xa4,0xd2,0x97,0xe7,0xd7,0xbb,0x32,0x84,0x1e,0x77,0x02,0x81,0x81,0x00,0xd3,0x55,0x62,0x53,0x35,0x29,0xa5,0x68,0x65,
0x28,0x74,0x16,0x30,0x66,0x3e,0x95,0x8e,0xc6,0xb1,0xdd,0x37,0xae,0x69,0xe7,0xc8,0x62,0x81,0x11,0x57,0x57,0x92,0x2b,0xd8,0x21,0x98,0xf4,0x3f,0xe6,0x6e,0xd1,0x5d,
0xff,0x6f,0x90,0x6b,0x9e,0x68,0x47,0x50,0x6e,0xdf,0x5a,0x12,0x49,0x04,0xe9,0x42,0x7f,0xe1,0x3e,0x05,0x0a,0xa3,0xee,0xca,0xeb,0x40,0x4b,0x89,0x2a,0xa1,0x3c,0x2e,
0xa5,0xad,0xa8,0xc9,0x5e,0xa7,0x70,0x55,0x3f,0x04,0x1d,0x17,0xcb,0xca,0x21,0xf5,0xc3,0x68,0x68,0xb9,0x50,0x98,0xd3,0x3a,0x2c,0x29,0x21,0x3b,0x42,0x12,0x92,0x34,
0xda,0xc5,0xbb,0x0c,0xb2,0xb4,0x86,0x6a,0x4e,0x3f,0x43,0x99,0xc4,0xb7,0x85,0x97,0x36,0x75,0x61,0x28,0xd6,0x84,0xd1,0x02,0x81,0x80,0x36,0x9b,0xa1,0x14,0x22,0x95,
0x8e,0x05,0x11,0xfd,0xf4,0x26,0x56,0x9b,0xa4,0x85,0x2f,0x73,0x5d,0x29,0x83,0xf1,0x3b,0x64,0xee,0xc2,0xa9,0xbc,0xed,0x0e,0x2d,0x30,0xa8,0x6a,0xa8,0x85,0x77,0x03,
0x65,0x2d,0x9c,0xb2,0x0c,0xfe,0x8e,0x02,0x1f,0x4d,0xe4,0xeb,0x09,0x38,0xcc,0xd2,0x17,0x3b,0x9a,0xeb,0x1c,0x0b,0xb4,0x20,0x7d,0x78,0x26,0x0a,0x12,0xc8,0x2a,0x51,
0x2e,0x65,0x5e,0xb1,0x29,0x32,0x0b,0xe8,0x4f,0x1e,0x9f,0x0c,0xaa,0x93,0x9a,0x8b,0x16,0x6f,0xad,0x54,0x3a,0x2f,0x28,0xb0,0x0b,0xc1,0x2d,0x7c,0x2c,0x73,0x2a,0x84,
0x6c,0xf8,0xde,0xed,0x60,0x12,0xc7,0x17,0xd0,0x37,0xe5,0x88,0xe0,0xcc,0x5f,0xe8,0xa9,0x84,0x51,0x12,0x49,0x99,0xba,0x3f,0x39,0x79,0x02,0x81,0x80,0x74,0x65,0x92,
0xc2,0x41,0x85,0xae,0x94,0xd1,0x22,0x76,0xcd,0xc1,0xda,0x8e,0x9d,0xd1,0x05,0x9e,0xf1,0x38,0xb9,0xd7,0x9a,0xd1,0xc3,0x6f,0x53,0x1d,0xc8,0x1d,0xba,0x08,0x50,0x78,
0xee,0x0e,0x43,0xdc,0xc5,0x74,0x00,0x3c,0x72,0x4e,0xd3,0xf0,0x9b,0x56,0xb1,0xba,0x52,0xe1,0xbf,0x55,0xf5,0x23,0xab,0x4b,0x63,0xdd,0x62,0xfe,0xe7,0x86,0xdc,0x0b,
0x8d,0x8e,0xfe,0xeb,0xcf,0x39,0xe2,0x06,0xc3,0xf0,0x25,0x32,0x13,0xac,0xe0,0x08,0x63,0xfd,0xb7,0x40,0x9d,0x73,0xbf,0x2c,0xc2,0x81,0x4e,0xe2,0xdd,0x74,0x2c,0xde,
0x7a,0x6f,0x28,0xf5,0x11,0x92,0x0a,0xec,0xdd,0x19,0x21,0x54,0x4c,0xb4,0x40,0x64,0x97,0xd7,0x19,0x81,0xfb,0x12,0x4d,0xec,0x58,0x97,0x25,0x90,0x01,0x02,0x81,0x81,
0x00,0x9d,0xf3,0x78,0x3e,0x39,0xb6,0x45,0x97,0x2d,0xb2,0xf2,0xdb,0xe3,0xa8,0xe9,0x8e,0x58,0xd7,0x6b,0xfb,0x11,0x25,0x77,0x6b,0xd5,0xd6,0x61,0x39,0xbb,0x04,0x15,
0xc2,0x7d,0xf9,0xc7,0xf1,0x1a,0xce,0xe5,0x40,0x84,0x26,0x83,0x13,0xb4,0x41,0x49,0xa2,0x42,0x71,0x3c,0xed,0x72,0x17,0xa9,0x2a,0x85,0x25,0xea,0x5b,0xf3,0x6e,0xd6,
0x5b,0x49,0xc8,0xda,0xe4,0xaa,0xa4,0xa5,0x96,0x31,0xaa,0x7e,0x10,0xd7,0x8a,0xf8,0x16,0xe0,0xe0,0x21,0x64,0x22,0xfb,0x1c,0x74,0x27,0xbe,0xf7,0x0f,0x0c,0x94,0x4b,
0x47,0xf4,0xfe,0x58,0xe1,0x72,0xb1,0x08,0xac,0x93,0xb5,0x06,0x29,0x78,0xb8,0xb3,0xf8,0xd4,0x2f,0x4e,0x43,0x3a,0x0c,0x14,0x8b,0x00,0xd2,0xd5,0x21,0x93,0x8c,0x5d,
0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 
  };
  DWORD blobLen = 0x4c1;

  int errCode = 0;

  NCRYPT_PROV_HANDLE prov = NULL;
  NCRYPT_KEY_HANDLE  key = NULL;
  DWORD policy = NCRYPT_ALLOW_EXPORT_FLAG | NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG;

  LPCWSTR name = L"ImportedKey";
  BCryptBuffer cb[1];
  cb[0].BufferType = NCRYPTBUFFER_PKCS_KEY_NAME;
  cb[0].pvBuffer = (void*)name;
  cb[0].cbBuffer = lstrlenW(name) * 2 + 2;
  NCryptBufferDesc desc;
  desc.ulVersion = 0;
  desc.pBuffers = cb;
  desc.cBuffers = 1;
  if (errCode = NCryptOpenStorageProvider(&prov, MS_KEY_STORAGE_PROVIDER, 0)) goto done;
  if (errCode = NCryptImportKey(prov, NULL, NCRYPT_PKCS8_PRIVATE_KEY_BLOB, &desc, &key, blob, blobLen, NCRYPT_DO_NOT_FINALIZE_FLAG)) goto done;
  if (errCode = NCryptSetProperty(key, NCRYPT_EXPORT_POLICY_PROPERTY, (PBYTE)(&policy), sizeof(policy), NCRYPT_PERSIST_FLAG)) goto done;
  if (errCode = NCryptFinalizeKey(key, 0)) goto done;

done:
  if (prov) NCryptFreeObject(prov);
  if (key) NCryptFreeObject(key);
  return errCode;
}

Une fois l'importation terminée, vous pouvez utiliser ListKeys pour vérifier si votre importation a réussi.

FIN!

Publié 27 articles originaux · loué 31 · 40 000+ vues

Je suppose que tu aimes

Origine blog.csdn.net/zhaoruixiang1111/article/details/102805653
conseillé
Classement