Compartilhar via


Chaves DSS

Gerando e recuperando chaves DSS

Chaves DSS podem ser geradas por uma chamada para a função CryptGenKey . A chamada para CryptGenKey exige que AT_SIGNATURE ou CALG_DSS_SIGN sejam passados no argumento Argel . Essa chamada gerará os valores P (módulo prime), Q (prime), 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çã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 deve ser passado 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 HCRYPTKEY é retornado no argumento hKey .

Para recuperar um ponteiro para chaves de assinatura geradas anteriormente

  1. Chame CryptAcquireContext para obter um identificador para o Provedor Criptográfico do Microsoft DSS.
  2. Chame a função CryptGetUserKey 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 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 no formato little-endian .

Gerando assinaturas DSS

Os dados a serem assinados devem primeiro ser hash usando o algoritmo SHA . Depois que esses dados são hash, uma assinatura 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 da 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 ao endereço fornecido no argumento pbSignature e o comprimento da assinatura é retornado ao endereço fornecido no argumento pdwSigLen . Um ponteiro 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 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 da 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 é 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 ser capaz de exportar as chaves DSS em um formato BLOB de chave .

Para exportar a chave pública 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. O BLOB de chave pública DSS é retornado em pbData e o comprimento do 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.

Para exportar a chave privada DSS

  • Siga o mesmo procedimento que 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 do provedor DSS.