Partager via


objets blob de clés privées Diffie-Hellman version 3

Lorsqu’un objet BLOB de clé privée Diffie-Hellman version 3 est exporté, il est au format suivant :

BLOBHEADER        blobheader;
DHPRIVKEY_VER3   dhprivkeyver3;
BYTE p[dhprivkeyver3.bitlenP/8]; 
            // Where P is the prime modulus
BYTE q[dhprivkeyver3.bitlenQ/8]; 
            // Where Q is a large factor of P-1
BYTE g[dhprivkeyver3.bitlenP/8]; 
            // Where G is the generator parameter
BYTE j[dhprivkeyver3.bitlenJ/8]; 
            // Where J is (P-1)/Q
BYTE y[dhprivkeyver3.bitlenP/8]; 
            // Where Y is (G^X) mod P
BYTE x[dhprivkeyver3.bitlenX/8]; 
            // Where X is the private exponent

Ce format BLOB est exporté lorsque l’indicateur CRYPT_BLOB_VER3 est utilisé avec CryptExportKey. Étant donné que la version se trouve dans l’objet BLOB, il n’est pas nécessaire de spécifier un indicateur lors de l’utilisation de cet objet BLOB avec CryptImportKey.

Le tableau suivant décrit chaque composant de l’objet BLOB clé.

Champ Description
blobheader Structure BLOBHEADER .
dhprivkeyver3 Structure DHPRIVKEY_VER3 . Le membre magic doit être défini sur 0x34484400 pour les clés privées. Notez que la valeur hexadécimale est simplement un encodage ASCII de « DH4 ».
P La valeur P se trouve directement après la structure DHPRIVKEY_VER3, et doit toujours être la longueur en octets du champ bitlenPDHPRIVKEY_VER3 (longueur du bit de P) divisé par huit (format little endian).
Q La valeur Q se trouve directement après la valeur P et doit toujours être la longueur en octets du champ bitlenQDHPRIVKEY_VER3 divisé par huit (format little endian). Si la valeur bitlenQ est 0, la valeur est absente de l’objet BLOB.
G La valeur G se trouve directement après la valeur Q et doit toujours être la longueur en octets du champ bitlenPDHPRIVKEY_VER3 (longueur du bit de P) divisé par huit. Si la longueur des données est d’un ou plusieurs octets inférieurs à P divisés par 8, les données doivent être complétées avec les octets nécessaires (de zéro valeur) pour faire des données la longueur souhaitée (format petit endian ).
J La valeur J se trouve directement après la valeur G et doit toujours être la longueur en octets du champ bitlenJDHPRIVKEY_VER3 divisé par huit (format little endian). Si la valeur bitlenJ est 0, la valeur est absente de l’objet BLOB.
O La valeur Y, (G^X) mod P, se trouve directement après la valeur J et doit toujours être la longueur en octets du champ bitlenPDHPRIVKEY_VER3 (longueur de bits de P) divisée par huit. Si la longueur des données résultant du calcul du mod P (G^X) est d’un ou plusieurs octets inférieurs à P divisés par 8, les données doivent être complétées avec les octets nécessaires (de zéro valeur) pour que les données soient de la longueur souhaitée (format petit endian ).
X La valeur X est un grand entier aléatoire tel que la partie publique de la paire de clés DH, Y, est égale à : Y = (G^X) mod P

 

Lors de l’appel de CryptExportKey, le développeur peut choisir de chiffrer la clé. La clé est chiffrée si le paramètre hExpKey contient un handle valide pour une clé de session. Tout, sauf la partie BLOBHEADER de l’objet BLOB, est chiffré. Notez que l’algorithme de chiffrement et les paramètres de clé de chiffrement ne sont pas stockés avec l’objet BLOB de clé privée. L’application doit gérer et stocker ces informations. Si zéro est passé pour hExpKey, la clé privée est exportée sans chiffrement.

Notes

Il est dangereux d’exporter des clés privées sans chiffrement, car elles sont alors vulnérables à l’interception et à l’utilisation par des entités non autorisées.