Objets BLOB de clé privée DSS version 3
Lorsqu’une clé privée DSS version 3 est exportée, elle est au format suivant :
BLOBHEADER blobheader;
DSSPRIVKEY_VER3 dssprivkeyver3;
BYTE p[dssprivkeyver3.bitlenP/8];
// Where P is the prime modulus
BYTE q[dssprivkeyver3.bitlenQ/8];
// Where Q is a large factor of P-1
BYTE g[dssprivkeyver3.bitlenP/8];
// Where G is the generator parameter
BYTE j[dssprivkeyver3.bitlenJ/8];
// Where J is (P-1)/Q
BYTE y[dssprivkeyver3.bitlenP/8];
// Where Y is (G^X) mod P
BYTE x[dssprivkeyver3.bitlenX/8];
// Where X is the private exponent
Ce format d’objet 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 de clé.
Champ | Description |
---|---|
Blobheader | Une structure de BLOBHEADER. Le membre bType doit avoir la valeur PUBLICKEYBLOB. |
Dssprivkeyver3 | Structure DSSPRIVKEY_VER3. Le membre magic doit être défini sur « DSS4 » (0x34535344) pour les clés privées. Notez que la valeur hexadécimale n’est qu’un encodage ASCII de « DSS4 ». |
P | La valeur P se trouve directement après la structure DSSPRIVKEY_VER3 et doit toujours être la longueur en octets du champ DSSPRIVKEY_VER3 bitlenP (longueur en bits de P) divisée 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 DSSPRIVKEY_VER3 bitlenQ divisé par huit (format little-endian). |
G | La valeur G se trouve directement après la valeur Q et doit toujours être la longueur en octets du champ DSSPRIVKEY_VER3 bitlenP (longueur en bits de P) divisée par huit. Si la longueur des données est d’un ou plusieurs octets plus courts que P divisé par 8, les données doivent être complétées par les octets nécessaires (de valeur nulle) pour rendre les données à la longueur souhaitée (format little-endian). |
J | La valeur J se trouve directement après la valeur G et doit toujours être la longueur en octets du champ DSSPRIVKEY_VER3 bitlenJ divisé par huit (format little-endian). Si la valeur de bitlenJ est de 0, la valeur est alors absente de l’objet BLOB. |
Y | 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 DSSPRIVKEY_VER3 bitlenP (longueur en 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 plus courts que P divisé par 8, les données doivent être complétées par les octets nécessaires (de valeur nulle) pour rendre les données à la longueur souhaitée (format little-endian). |
X | La valeur X est un grand nombre entier aléatoire, de sorte 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 à une clé de session. Tout sauf la partie BLOBHEADER de l’objet BLOB est chiffrée. 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.
Important
Il est dangereux d’exporter des clés privées sans chiffrement, car elles sont vulnérables à l’interception et à l’utilisation par des entités non autorisées.