Partager via


Clés DSS

Génération et récupération de clés DSS

Les clés DSS peuvent être générées par un appel à la fonction CryptGenKey . L’appel à CryptGenKey nécessite que AT_SIGNATURE ou CALG_DSS_SIGN être transmis dans l’argument Algid . Cet appel génère les valeurs P (modulus premiers), Q (prime), G (générateur), X (exposant secret) et Y (clé publique) à partir de zéro et les conserve dans un objet BLOB de clé vers le stockage local.

Pour générer une paire de clés de signature DSS

  1. Appelez la fonction CryptAcquireContext pour obtenir un handle au fournisseur de chiffrement Microsoft DSS.
  2. Appelez CryptGenKey pour générer les clés. AT_SIGNATURE ou CALG_DSS_SIGN doivent être transmis pour l’argument Algid et les 16 bits supérieurs de l’argument dwFlags doivent être définis sur la taille de clé souhaitée. Si les 16 bits supérieurs sont nuls, la taille de clé par défaut de 1 024 bits est utilisée. Un handle HCRYPTKEY est retourné dans l’argument hKey .

Pour récupérer un pointeur vers des clés de signature générées précédemment

  1. Appelez CryptAcquireContext pour obtenir un handle au fournisseur de chiffrement Microsoft DSS.
  2. Appelez la fonction CryptGetUserKey avec l’argument dwKeySpec défini sur AT_SIGNATURE ou CALG_DSS_SIGN.

Pour récupérer les valeurs P, Q et G

  1. Appelez CryptAcquireContext pour obtenir un handle au fournisseur de chiffrement Microsoft DSS.
  2. Appelez CryptGetUserKey avec l’argument dwKeySpec défini sur AT_SIGNATURE ou CALG_DSS_SIGN.
  3. Appelez CryptGetKeyParam avec l’argument hKey défini sur le pointeur récupéré à l’étape précédente. L’argument dwParam doit être défini sur l’indicateur souhaité ; KP_P, KP_Q ou KP_G. La valeur est retournée dans l’argument pbData et la longueur des données est retournée dans l’argument pdwDataLen . La valeur est retournée sans informations d’en-tête et au format little-endian .

Génération de signatures DSS

Les données à signer doivent d’abord être hachées à l’aide de l’algorithme SHA . Une fois ces données hachées, une signature DSS est générée en appelant la fonction CryptSignHash .

Pour générer une signature DSS

  1. Appelez CryptAcquireContext pour obtenir un handle au fournisseur de chiffrement Microsoft DSS.
  2. Appelez CryptCreateHash avec l’argument Algid défini sur CALG_SHA pour obtenir un handle sur un objet de hachage SHA.
  3. Appelez CryptHashData avec l’argument hHash défini sur le handle récupéré à l’étape précédente. Cela crée un hachage des données et retourne un handle au hachage dans l’argument phHash de l’appel de fonction CryptCreateHash .
  4. Appelez CryptSignHash avec l’argument hHash défini sur le handle récupéré à l’étape précédente. AT_SIGNATURE ou CALG_DSS_SIGN peuvent être passés dans le paramètre dwKeySpec . La signature est retournée à l’adresse fournie dans l’argument pbSignature , et la longueur de la signature est retournée à l’adresse fournie dans l’argument pdwSigLen . Un pointeur NULL peut être passé dans l’argument pbSignature et, dans ce cas, la signature n’est pas générée, mais la longueur de la signature est retournée à l’adresse fournie dans le paramètre pdwSigLen .

Vérification d’une signature DSS

Pour vérifier une signature DSS, la clé publique DSS du signataire doit être importée, les données signées doivent être hachées, puis la signature peut être vérifiée.

Pour vérifier une signature DSS

  1. Appelez CryptAcquireContext pour obtenir un handle au fournisseur de chiffrement Microsoft DSS.

  2. Appelez CryptImportKey pour importer la clé publique DSS du signataire.

  3. Appelez CryptCreateHash avec l’argument Algid défini sur CALG_SHA pour obtenir un handle sur un objet de hachage SHA.

  4. Appelez CryptHashData avec l’argument hHash défini sur le handle récupéré à l’étape précédente et avec pbData pointant vers les données signées. Cela crée un hachage des données et retourne un handle au hachage dans l’argument phHash de l’appel de fonction CryptCreateHash .

  5. Appelez CryptVerifySignature avec les paramètres suivants :

    hHash est défini sur le handle sur le hachage effectué à l’étape précédente.

    pbSignature pointe vers la signature à vérifier.

    dwSigLen est défini sur la longueur de la signature.

    hPubKey est défini sur le handle de la clé publique importée à l’étape 2.

    dwFlags est défini sur zéro.

Exportation de clés DSS

Lorsque vous envoyez des données signées à une personne où la signature doit être vérifiée par le destinataire, la clé publique du signataire doit être fournie au destinataire et est généralement envoyée avec les données signées. Par conséquent, il est nécessaire de pouvoir exporter les clés DSS dans un format BLOB de clé .

Pour exporter la clé publique DSS

  1. Appelez CryptAcquireContext pour obtenir un handle au fournisseur de chiffrement Microsoft DSS.
  2. Appelez CryptGetUserKey avec l’argument dwKeySpec défini sur AT_SIGNATURE ou CALG_DSS_SIGN.
  3. Appelez CryptExportKey avec hKey défini sur le handle récupéré à l’étape précédente, dwBlobType défini sur PUBLICKEYBLOB et dwFlags défini sur zéro. Le blob de clé publique DSS est retourné dans pbData et la longueur de la clé BLOB est retournée dans pdwDataLen. Un pointeur NULL peut être passé dans pbData et, dans ce cas, la longueur de l’objet blob de clé DSS est retournée. L’objet BLOB retourné lors de l’appel à CryptExportKey est au format décrit dans les objets blob de clé de fournisseur DSS.

Pour exporter la clé privée DSS

  • Suivez la même procédure que pour exporter une clé publique DSS, sauf que lors de l’appel à CryptExportKey, dwBlobType est défini sur PRIVATEKEYBLOB. L’objet BLOB retourné lors de l’appel à CryptExportKey est au format décrit dans les objets blob de clé de fournisseur DSS.