Share via


blobs de clave privada de Diffie-Hellman versión 3

Cuando se exporta un blob de clave privada de Diffie-Hellman versión 3, tiene un formato como se indica a continuación:

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

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 de la clave BLOB.

Campo Descripción
blobheader Una estructura BLOBHEADER .
dhprivkeyver3 Estructura DHPRIVKEY_VER3 . El miembro mágico debe establecerse en 0x34484400 para las claves privadas. Observe que el valor hexadecimal es simplemente una codificación ASCII de "DH4".
P El valor P se encuentra directamente después de la estructura DHPRIVKEY_VER3 y siempre debe ser la longitud en bytes del campo bitlenP DHPRIVKEY_VER3 (longitud de bits de P) dividida por 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 DHPRIVKEY_VER3 campo bitlenQ dividido por ocho (formato little-endian). Si el valor de bitlenQ es 0, el valor no está presente en el BLOB.
G El valor G se encuentra directamente después del valor Q y siempre debe ser la longitud en bytes del campo DHPRIVKEY_VER3bitlenP (longitud de bits de P) dividido entre ocho. Si la longitud de los datos es uno o más bytes más cortos que P divididos por 8, los datos deben rellenarse con los bytes necesarios (de cero valor) para que los datos sean 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 campobitlenJ DHPRIVKEY_VER3 dividido entre ocho (formato little-endian ). Si el valor de bitlenJ es 0, el valor no está presente en el 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 de DHPRIVKEY_VER3 (longitud de bits de P) dividida por 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 por 8, los datos deben rellenarse con los bytes necesarios (de valor cero) para que los datos sean 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 desea cifrar la clave. La clave se cifra si el parámetro hExpKey contiene un identificador válido para una clave de sesión. Todo, pero la parte BLOBHEADER del BLOB está cifrada. Tenga en cuenta que el algoritmo de cifrado y los parámetros de 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.

Nota

Es peligroso exportar claves privadas sin cifrado porque, a continuación, son vulnerables a la interceptación y el uso de entidades no autorizadas.