Compartilhar via


Chaves DSS

Gerando e recuperando chaves DSS

As chaves DSS podem ser geradas por uma chamada para a funçãoCryptGenKey. A chamada para CryptGenKey requer que AT_SIGNATURE ou CALG_DSS_SIGN sejam passados no argumento Argel. Essa chamada gerará os valores P (módulo principal), Q (prime), G (gerador), X (expoente secreto) e Y (chave pública) do zero e os manterá em um blob de chave para o armazenamento local.

Para gerar um par de chaves de assinatura DSS

  1. Chame a função CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
  2. Chame CryptGenKey para gerar as chaves. AT_SIGNATURE ou CALG_DSS_SIGN devem ser passados para o argumento Argel e os 16 bits superiores do argumento dwFlags devem ser definidos como o tamanho da chave desejado. Se os 16 bits superiores forem zero, o tamanho da chave padrão de 1.024 bits será usado. Um identificador deHCRYPTKEYé retornado no argumento hKey.

Para recuperar um ponteiro para as chaves de assinatura geradas anteriormente

  1. Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
  2. Chame a funçãoCryptGetUserKey com o argumento dwKeySpec definido como AT_SIGNATURE ou CALG_DSS_SIGN.

Recuperar os valores P, Q e G

  1. Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
  2. Chame CryptGetUserKey com o argumento dwKeySpec definido como AT_SIGNATURE ou CALG_DSS_SIGN.
  3. Chame CryptGetKeyParam com o argumento hKey definido como o ponteiro recuperado na etapa anterior. O argumento dwParam deve ser definido como o sinalizador desejado; KP_P, KP_Q ou KP_G. O valor é retornado no argumento pbData e o comprimento dos dados é retornado no argumento pdwDataLen. O valor é retornado sem informações de cabeçalho e em formato de little-endian.

Gerando assinaturas DSS

Os dados a serem assinados devem primeiro ser hash usando o algoritmoSHA. Depois que esses dados são hashed, uma assinatura de DSS é gerada chamando a função CryptSignHash.

Para gerar uma assinatura DSS

  1. Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
  2. Chame CryptCreateHash com o argumento Argel definido como CALG_SHA para obter um identificador para um objeto hash SHA.
  3. Chame CryptHashData com o argumento hHash definido como o identificador recuperado na etapa anterior. Isso cria um hash dos dados e retorna um identificador para o hash no argumento phHash da chamada de função CryptCreateHash.
  4. Chame CryptSignHash com o argumento hHash definido como o identificador recuperado na etapa anterior. AT_SIGNATURE ou CALG_DSS_SIGN podem ser passados no parâmetro dwKeySpec. A assinatura é retornada para o endereço fornecido no argumento pbSignature e o comprimento da assinatura é retornado para o endereço fornecido no argumento pdwSigLen. Um ponteiro de NULL pode ser passado no argumento pbSignature e, nesse caso, a assinatura não é gerada, mas o comprimento da assinatura é retornado para o endereço fornecido no parâmetro pdwSigLen.

Verificando uma assinatura DSS

Para verificar uma assinatura DSS, a chave pública DSS do signatário deve ser importada, o dados assinados deve ser hash e, em seguida, a assinatura pode ser verificada.

Para verificar uma assinatura DSS

  1. Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.

  2. Chame CryptImportKey para importar a chave pública DSS do signatário.

  3. Chame CryptCreateHash com o argumento Argel definido como CALG_SHA para obter um identificador para um objeto hash SHA.

  4. Chame CryptHashData com o argumento hHash definido como o identificador recuperado na etapa anterior e com pbData apontando para os dados assinados. Isso cria um hash dos dados e retorna um identificador para o hash no argumento phHash da chamada de função CryptCreateHash.

  5. Chame CryptVerifySignature com as seguintes configurações:

    hHash é definido como o identificador para o hash executado na etapa anterior.

    pbSignature aponta para a assinatura a ser verificada.

    dwSigLen é definido como o comprimento da assinatura.

    hPubKey é definido como o identificador da chave pública importada na etapa 2.

    dwFlags está definido como zero.

Exportando chaves DSS

Quando você envia dados assinados para alguém em que a assinatura precisará ser verificada pelo destinatário, a chave pública do signatário deve ser fornecida ao destinatário e geralmente é enviada junto com os dados assinados. Portanto, é necessário poder exportar as chaves dedeDSS em um formatoblob de chave de.

Exportar a chave pública do DSS

  1. Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
  2. Chame CryptGetUserKey com o argumento dwKeySpec definido como AT_SIGNATURE ou CALG_DSS_SIGN.
  3. Chame CryptExportKey com hKey definido como o identificador recuperado na etapa anterior, dwBlobType definido como PUBLICKEYBLOB e dwFlags definido como zero. Oblob de chave públicaDSS é retornado em pbData e o comprimento dode BLOB de chaveé retornado em pdwDataLen. Um ponteiro NULL pode ser passado em pbData e, nesse caso, apenas o comprimento do BLOB de chave DSS será retornado. O BLOB retornado ao fazer a chamada para CryptExportKey está no formato descrito em blobs de chave do provedor DSS.

Exportar a chave privada DSS

  • Siga o mesmo procedimento para exportar uma chave pública DSS, exceto que ao fazer a chamada para CryptExportKey, dwBlobType está definido como PRIVATEKEYBLOB. O BLOB retornado ao fazer a chamada para CryptExportKey está no formato descrito em blobs de chave do provedor DSS.