Compartir a través de


Blobs de clave privada Diffie-Hellman, versión 3

Cuando se exporta un BLOB de clave privada 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 del BLOB de claves.

Campo Descripción
blobheader Una estructura BLOBHEADER.
dhprivkeyver3 Una estructura DHPRIVKEY_VER3. El miembro magic 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 (longitud de bits de P) de DHPRIVKEY_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 DHPRIVKEY_VER3 dividido entre ocho (formato little-endian). Si el valor bitlenQ es 0, el valor está ausente del BLOB.
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 DHPRIVKEY_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 DHPRIVKEY_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 DHPRIVKEY_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.

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.