Partilhar via


Teclas 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 ser passada no argumento Algid. Essa chamada gerará os valores P (módulo primo), Q (primo), G (gerador), X (expoente secreto) e Y (chave pública) do zero e os persistirá em um BLOB de chave para o armazenamento local.

Para gerar um par de chaves de assinatura DSS

  1. Chame a funçãoCryptAcquireContext para obter um identificador para o Microsoft DSS Cryptographic Provider.
  2. Chame CryptGenKey para gerar as chaves. O AT_SIGNATURE ou CALG_DSS_SIGN deve ser passado para o argumento Algid e os 16 bits superiores do argumento dwFlags devem ser definidos para o tamanho de chave desejado. Se os 16 bits superiores forem zero, o tamanho de chave padrão de 1.024 bits será usado. Um identificador deHCRYPTKEYé retornado no argumento hKey.

Para recuperar um ponteiro para chaves de assinatura geradas anteriormente

  1. Chame CryptAcquireContext para obter um identificador para o Microsoft DSS Cryptographic Provider.
  2. Chame a funçãoCryptGetUserKey com o argumento dwKeySpec definido como AT_SIGNATURE ou CALG_DSS_SIGN.

Para recuperar os valores P, Q e G

  1. Chame CryptAcquireContext para obter um identificador para o Microsoft DSS Cryptographic Provider.
  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 em hash usando o algoritmo SHA. Depois que esses dados são colocados em hash, uma assinatura deDSSé gerada chamando a funçãoCryptSignHash.

Para gerar uma assinatura DSS

  1. Chame CryptAcquireContext para obter um identificador para o Microsoft DSS Cryptographic Provider.
  2. Chame CryptCreateHash com o argumento Algid definido como CALG_SHA para obter um identificador para um objeto hash SHA.
  3. Chame CryptHashData com o argumento hHash definido para 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çãoCryptCreateHash.
  4. Chame CryptSignHash com o argumento hHash definido para o identificador recuperado na etapa anterior. Tanto AT_SIGNATURE quanto CALG_DSS_SIGN podem ser passados no parâmetro dwKeySpec. A assinatura é devolvida ao endereço fornecido no argumento pbSignature e o comprimento da assinatura é devolvido ao 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, os dados assinados devem ser colocados em hash e, em seguida, a assinatura pode ser verificada.

Para verificar uma assinatura DSS

  1. Chame CryptAcquireContext para obter um identificador para o Microsoft DSS Cryptographic Provider.

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

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

  4. Chame CryptHashData com o argumento hHash definido para 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çãoCryptCreateHash.

  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 para 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 onde 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 ser capaz de exportar as chaves deDSSem um formato BLOBde chave.

Para exportar a chave pública DSS

  1. Chame CryptAcquireContext para obter um identificador para o Microsoft DSS Cryptographic Provider.
  2. Chame CryptGetUserKey com o argumento dwKeySpec definido como AT_SIGNATURE ou CALG_DSS_SIGN.
  3. Chame CryptExportKey com hKey definido para 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 doBLOB de chaveé retornado em pdwDataLen. Um ponteiro NULL pode ser passado em pbDatae, neste caso, apenas o comprimento do BLOB da chave DSS será retornado. O BLOB retornado ao fazer a chamada para CryptExportKey está no formato descrito em BLOBs de chave de provedor DSS.

Para 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 é definido como PRIVATEKEYBLOB. O BLOB retornado ao fazer a chamada para CryptExportKey está no formato descrito em BLOBs de chave de provedor DSS.