Blobs de clave privada de DSS versión 3
Cuando se exporta una clave privada de DSS de la versión 3, tiene un formato como se indica a continuación:
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
Este formato BLOB se exporta cuando se usa la marca CRYPT_BLOB_VER3 con CryptExportKey. Dado que la versión está en el BLOB, no es necesario especificar una marca al usar este BLOB con CryptImportKey.
En la tabla siguiente se describe cada componente del BLOB de claves.
Campo | Descripción |
---|---|
Blobheader | Una estructura BLOBHEADER. El miembro bType debe tener un valor de PUBLICKEYBLOB. |
Dssprivkeyver3 | Estructura DSSPRIVKEY_VER3 . El miembro magic debe establecerse en "DSS4" (0x34535344) para las claves privadas. Observe que el valor hexadecimal es simplemente una codificación ASCII de "DSS4". |
P | El valor P se encuentra directamente después de la estructura DSSPRIVKEY_VER3 y siempre debe ser la longitud en bytes del campo bitlenP (longitud de bits de P) de DSSPRIVKEY_VER3 dividido entre ocho (formato little-endian). |
Q | El valor Q se encuentra directamente después del valor P y siempre debe ser la longitud en bytes del campo bitlenQ de DSSPRIVKEY_VER3 dividido entre ocho (formato little-endian). |
G | El valor G se encuentra directamente después del valor Q y siempre debe ser la longitud en bytes del campo bitlenP (longitud de bits de P) de DSSPRIVKEY_VER3 dividido entre ocho. Si la longitud de los datos es uno o más bytes más cortos que P divididos entre 8, los datos deben rellenarse con los bytes necesarios (de valor cero) para que los datos tengan la longitud deseada (formato little-endian). |
J | El valor J se encuentra directamente después del valor G y siempre debe ser la longitud en bytes del campo bitlenJ de DSSPRIVKEY_VER3 dividido entre ocho (formato little-endian). Si el valor bitlenJ es 0, el valor está ausente del BLOB. |
Y | El valor Y, (G^X) mod P, se encuentra directamente después del valor J y siempre debe ser la longitud en bytes del campo bitlenP (longitud de bits de P) de DSSPRIVKEY_VER3 dividido entre ocho. Si la longitud de los datos resultantes del cálculo de (G^X) mod P es uno o más bytes más cortos que P divididos entre 8, los datos deben rellenarse con los bytes necesarios (de valor cero) para que los datos tengan la longitud deseada (formato little-endian). |
X | El valor X es un entero grande aleatorio de modo que la parte pública del par de claves DH, Y, es igual a: Y = (G^X) mod P |
Al llamar a CryptExportKey, el desarrollador puede elegir si se va a cifrar la clave. La clave se cifra si el parámetro hExpKey contiene un identificador válido para una clave de sesión. Todo, excepto la parte BLOBHEADER del BLOB se cifra. Tenga en cuenta que los parámetros de algoritmo de cifrado y clave de cifrado no se almacenan junto con el BLOB de clave privada. La aplicación debe administrar y almacenar esta información. Si se pasa cero para hExpKey, la clave privada se exportará sin cifrado.
Importante
Es peligroso exportar claves privadas sin cifrado porque, a continuación, son vulnerables a la interceptación y el uso de entidades no autorizadas.