Compartilhar via


BLOBs de chave privada da versão 3 do DSS

Quando uma chave DSSprivate da versão 3 é exportada, ela está em um formato da seguinte maneira:

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

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 . O membro bType deve ter um valor de PUBLICKEYBLOB.
Dssprivkeyver3 Uma estrutura DSSPRIVKEY_VER3 . O membro mágico deve ser definido como "DSS4" (0x34535344) para chaves privadas. Observe que o valor hexadecimal é apenas uma codificação ASCII de "DSS4".
P O valor P está localizado diretamente após a estrutura DSSPRIVKEY_VER3 e deve ser sempre o comprimento, em bytes, do campo DSSPRIVKEY_VER3 bitlenP (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 DSSPRIVKEY_VER3 bitlenQ dividido por oito (formato little-endian ).
G O valor G está localizado diretamente após o valor Q e deve ser sempre o comprimento, em bytes, do campo DSSPRIVKEY_VER3 bitlenP (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 acolchoados 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 DSSPRIVKEY_VER3 bitlenJ 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 ser sempre o comprimento, em bytes, do campo DSSPRIVKEY_VER3 bitlenP (comprimento de bit de P) dividido por oito. Se o comprimento dos dados que resultam do cálculo de (G^X) mod P for um ou mais bytes menor que P dividido por 8, os dados deverão ser acolchoados 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, exceto 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.

Importante

É perigoso exportar chaves privadas sem criptografia porque elas são então vulneráveis à interceptação e ao uso por entidades não autorizadas.