CryptoAPI de Windows: CryptSignHash avec CALG_SHA_256 et la clé privée à partir de MON fichier de clés

Je suis en train de générer des signatures numériques sur Windows (XP SP3, mais actuellement à l'essai avec Windows 7) avec CryptoAPI qui sera compatible avec les commandes:

openssl dgst -sha256 -sign <parameters> (for signing)
openssl dgst -sha256 -verify <parameters> (for validation)

Je veux utiliser une clé privée à partir de la fenêtre "MON" magasin de clés de signature.

J'ai réussi à signer des fichiers en utilisant le SHA1 digérer par l'algorithme à l'aide de la suite de fonctions CryptoAPI (en omettant les paramètres par souci de concision):

CertOpenStore
CertFindCertificateInStore
CryptAcquireCertificatePrivateKey
CryptCreateHash (with CALG_SHA1)
CryptHashData
CryptSignHash

Générés signature est compatible avec "openssl dgst-sha1 -vérifier" (une fois que l'ordre des octets est inversée).

Mon problème: quand j'essaie d'utiliser CALG_SHA_256 avec CryptCreateHash, il échoue avec l'erreur 80090008 (NTE_BAD_ALGID). Par googler autour de, j'ai trouvé que j'avais besoin d'utiliser un fournisseur spécifique (PROV_RSA_AES) au lieu de celui par défaut. Depuis que j'aurais un fournisseur de poignée, j'aurais aussi besoin de remplacer CryptAcquireCertificatePrivateKey par CryptGetUserKey. J'ai donc modifié mon programme ressemble à:

CryptAcquireContext (with PROV_RSA_AES)
CertOpenStore
CertFindCertificateInStore
CryptGetUserKey
CryptCreateHash (with CALG_SHA256)
CryptHashData
CryptSignHash

Malheureusement, cela n'a pas fonctionné comme prévu: CryptGetUserKey a échoué avec l'erreur 8009000D (NTE_NO_KEY). Si je supprime le CryptGetUserKey appel, le programme s'exécute jusqu'à ce que CryptSignHash, qui échoue avec l'erreur 80090016 (NTE_BAD_KEYSET). Je sais que le jeu de clés en, existe et fonctionne très bien, depuis que j'ai été capable de l'utiliser pour signer le SHA1 digérer.

J'ai essayé d'acquérir le contexte nouveau avec des informations sur le contexte du certificat que j'ai eu de CertFindCertificateInStore: le meilleur que j'ai pu faire a été un succès CryptGetUserKey appel, mais CryptSignHash serait échoue toujours avec la même erreur.

La clé privée, je suis en train d'utiliser est de 2048 bits, mais je ne vous attendez pas à être un problème puisqu'il fonctionne avec le SHA1 digérer. Je suis à une perte, de sorte que toute suggestion est la bienvenue!

comment vous avez inversé l'ordre des octets. c'était de 128 bits de renversement

OriginalL'auteur Dominique Eav | 2010-11-16