BLOBs de chave privada do Diffie-Hellman versão 3
Quando um BLOB de chave privada Diffie-Hellman versão 3 é exportado, ele está em um formato da seguinte maneira:
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
Esse formato BLOB é exportado quando o sinalizador CRYPT_BLOB_VER3 é usado com CryptExportKey. Como a versão está no BLOB, não é necessário especificar um sinalizador ao usar esse BLOB com CryptImportKey.
A tabela a seguir descreve cada componente do BLOB de chave.
Campo | Descrição |
---|---|
blobheader | Uma estrutura BLOBHEADER . |
dhprivkeyver3 | Uma estrutura DHPRIVKEY_VER3 . O membro mágico deve ser definido como 0x34484400 para chaves privadas. Observe que o valor hexadecimal é apenas uma codificação ASCII de "DH4". |
P | O valor P está localizado diretamente após a estrutura DHPRIVKEY_VER3 e deve sempre ser o comprimento em bytes do campo bitlenPDHPRIVKEY_VER3 (comprimento de bit de P) dividido por oito (formato little-endian). |
Q | O valor Q está localizado diretamente após o valor P e deve ser sempre o comprimento em bytes do campo bitlenQDHPRIVKEY_VER3 dividido por oito (formato little-endian). Se o valor bitlenQ for 0, o valor estará ausente do BLOB. |
G | O valor G está localizado diretamente após o valor Q e deve ser sempre o comprimento em bytes do campo bitlenPDHPRIVKEY_VER3 (comprimento de bit de P) dividido por oito. Se o comprimento dos dados for um ou mais bytes menor que P dividido por 8, os dados deverão ser preenchidos com os bytes necessários (de valor zero) para tornar os dados o comprimento desejado (formato little-endian ). |
J | O valor J está localizado diretamente após o valor G e deve ser sempre o comprimento em bytes do campo bitlenJDHPRIVKEY_VER3 dividido por oito (formato little-endian). Se o valor bitlenJ for 0, o valor estará ausente do BLOB. |
S | O valor Y, (G^X) mod P, está localizado diretamente após o valor J e deve sempre ser o comprimento em bytes do campo bitlenPDHPRIVKEY_VER3 (comprimento de bit de P) dividido por oito. Se o comprimento dos dados resultantes do cálculo de (G^X) mod P for um ou mais bytes menor que P dividido por 8, os dados deverão ser preenchidos com os bytes necessários (de valor zero) para tornar os dados o comprimento desejado (formato little-endian ). |
X | O valor X é um inteiro grande aleatório de modo que a parte pública do par de chaves DH, Y, seja igual a: Y = (G^X) mod P |
Ao chamar CryptExportKey, o desenvolvedor pode escolher se deseja criptografar a chave. A chave será criptografada se o parâmetro hExpKey contiver um identificador válido para uma chave de sessão. Tudo menos a parte BLOBHEADER do BLOB é criptografado. Observe que o algoritmo de criptografia e os parâmetros de chave de criptografia não são armazenados junto com o BLOB de chave privada. O aplicativo deve gerenciar e armazenar essas informações. Se zero for passado para hExpKey, a chave privada será exportada sem criptografia.
Observação
É perigoso exportar chaves privadas sem criptografia porque elas são então vulneráveis à interceptação e ao uso por entidades não autorizadas.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de