Share via


blobs de clave pública de Diffie-Hellman versión 3

Diffie-Hellman versión 3 Los blobs de clave pública (tipo PUBLICKEYBLOB) se usan para exportar e importar información sobre una clave pública DH. Tienen el formato siguiente:

BLOBHEADER blobheader; 
                 // As explained under "Data Structures"
DHPUBKEY_VER3 dhpubkeyver3;
BYTE p[dhpubkeyver3.bitlenP/8]; 
                 // Where P is the prime modulus
BYTE q[dhpubkeyver3.bitlenQ/8]; 
                 // Where Q is a large factor of P-1
BYTE g[dhpubkeyver3.bitlenP/8]; 
                 // Where G is the generator parameter
BYTE j[dhpubkeyver3.bitlenJ/8]; 
                 // Where J is (P-1)/Q
BYTE y[dhpubkeyver3.bitlenP/8]; 
                 // Where Y is (G^X) mod P

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.

Además, este formato BLOB se usa con la función CryptSetKeyParam cuando el valor dwParam KP_PUB_PARAMS se usa para establecer parámetros clave en una clave DH. Esto se hace cuando se ha usado la marca CRYPT_PREGEN para generar la clave. Cuando se usa en esta situación, se omite el valor y y, por lo tanto, no se debe incluir en el BLOB.

En la tabla siguiente se describe cada componente de la clave BLOB.

Campo Descripción
blobheader Una estructura BLOBHEADER . El miembro bType debe tener un valor de PUBLICKEYBLOB.
dhpubkeyver3 Estructura DHPUBKEY_VER3 . El miembro magic debe establecerse en 0x33484400 para las claves públicas. Observe que el valor hexadecimal es simplemente una codificación ASCII de "DH3".
P El valor P se encuentra directamente después de la estructura DHPUBKEY_VER3 y siempre debe ser la longitud, en bytes, del DHPUBKEY_VER3 campo bitlenP (longitud de bits de P) dividido 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 campo DHPUBKEY_VER3bitlenQ 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 bitlenPde DHPUBKEY_VER3 (longitud de bits de P) dividido por 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 campo bitlenJde DHPUBKEY_VER3 dividido por ocho (formato little-endian). Si el valor de bitlenQ 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 DHPUBKEY_VER3bitlenP (longitud de bits de P) 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 por 8, los datos deben rellenarse con los bytes necesarios (de valor cero) para que los datos sean la longitud deseada (formato little-endian ). Cuando esta estructura se usa con CryptSetKeyParam con el valor dwParam KP_PUB_PARAMS, este valor no se incluye en el BLOB.

 

Nota

Los blobs de clave pública no están cifrados, pero contienen claves públicas en formato de texto no cifrado.