web-dev-qa-db-fra.com

System.Security.Cryptography.CryptographicException: le jeu de clés n'existe pas

Lorsque je crée un certificat x509 dans un message crypté et décrypté, j'ai reçu des informations d'erreur et je ne pouvais pas résoudre ce problème. Quelqu'un pourrait-il jamais arriver à résoudre ce bug? Merci.

Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Consultez la trace de la pile pour plus d’informations sur l’erreur et son origine dans le code. 

Détails de l'exception:

System.Security.Cryptography.CryptographicException: le jeu de clés n'existe pas

Erreur de source: 

Ligne 53: utilisation de (RSACryptoServiceProvider RsaProviderDecrypt = (RSACryptoServiceProvider) cerDecrypt.PublicKey.Key) Ligne 54:
{Ligne 55: plainHashBytes = rsaProviderDecrypt.Decrypt (encryptedHashBytes, false); Ligne 56:
rsaProviderDecrypt.Clear (); Ligne 57:
rsaProviderDecrypt.Dispose ();

Fichier source: E:\PayUSite\PayMvcApp\Controllers\HashMessageController.cs Ligne: 55

Trace de la pile: 

[CryptographicException: le jeu de clés n'existe pas. ]
System.Security.Cryptography.CryptographicException.ThrowCryptographicException (Int32 Hr) +41
System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey (SafeKeyHandle PKeyContext, Byte [] pbEncryptedKey, Int32 cbEncryptedKey, Boolean FOAEP, ObjectHandleOnStack ohRetDecryptedKey) +0
System.Security.Cryptography.RSACryptoServiceProvider.Decrypt (Byte [] Rgb, Boolean fOAEP) +579

code source:

string docFile = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash = HashAlgorithm.Create("SHA1");
byte[] hashedBytes;
using (FileStream fs = new FileStream(docFile, FileMode.Open))
{
    //compute message hash value
    hashedBytes = hash.ComputeHash(fs);
    hash.Dispose();
    fs.Close();
}

string hashedString = Convert.ToBase64String(hashedBytes);

//encrypt message digest
string priKeyFile = Server.MapPath("~/certificate/WosMiddle.pfx");
X509Certificate2 certEncrypt = new X509Certificate2(priKeyFile, "123456");
byte[] encryptedHashBytes;
using (RSACryptoServiceProvider rsaProviderEncrypt = (RSACryptoServiceProvider)certEncrypt.PrivateKey)
{
    encryptedHashBytes = rsaProviderEncrypt.Encrypt(hashedBytes, false);
    rsaProviderEncrypt.Dispose();
}

//decrypt message digest
string pubKeyFile = Server.MapPath("~/certificate/WosMiddle-pubkey.cer");
X509Certificate2 cerDecrypt = new X509Certificate2(pubKeyFile);
byte[] plainHashBytes;
using (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider)cerDecrypt.PublicKey.Key)
{
    //***will throw error message here...***
    plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes, false);
    rsaProviderDecrypt.Dispose();
}

//verify message whether was modified
string docFile2 = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash2 = HashAlgorithm.Create("SHA1");
byte[] hashedBytes2;
using (FileStream fs2 = new FileStream(docFile2, FileMode.Open))
{
    //compute message hash value
    hashedBytes2 = hash.ComputeHash(fs2);
    fs2.Close();
}

//compare hash value
bool isEqual = plainHashBytes.SequenceEqual(hashedBytes2);
27
Bes Ley

Cette question est ancienne mais pour quelqu'un qui cherche la solution tout en continuant d'utiliser Encrypt et Decrypt, voici comment je parviens à résoudre cette erreur:

La base est mon certificat ont été installés de manière incorrecte en double-cliquant sur le fichier .pfx et en sélectionnant le magasin.

La mauvaise façon d'installer le certificat

1. Double-cliquez sur le certificat:

certificate file

2. L'assistant s'ouvre, cliquez sur le bouton suivant:

wizard 0

3. L'assistant affiche l'emplacement des certificats, cliquez sur le bouton suivant:

wizard 1

4. Entrez le mot de passe puis cliquez sur suivant:

wizard 2

5. Sélectionnez le magasin puis cliquez sur suivant:

wizard 3

6. L'assistant affiche les informations du certificat, cliquez sur le bouton Terminer

wizard 4

7. Succes s'affiche:

wizard 5

Donc, à ce stade, j'avais l'erreur "Le jeu de clés n'existe pas" .


Pour résoudre cela j'ai procédé de cette façon (la bonne façon)

1. Exécuter Microsoft Management Console (mmc.exe):

execute mmc

2. Une instance vierge MMC indiquait:

mmc showed

3. Cliquez sur Fichier-> Ajouter/Supprimer un composant logiciel enfichable ...

add snap-in

4. Sélectionnez le composant logiciel enfichable certificat et cliquez dans Ajouter bouton:

add certificate snap-in

5. Sélectionnez Compte d'ordinateur puis cliquez dans le bouton Suivant :

select computer account

6. Sélectionnez Ordinateur local puis cliquez sur le bouton Terminer :

selecct local computer

7. Le composant logiciel enfichable de certificat est maintenant ajouté, cliquez sur le boutonOK:

certificate snap-in shows

8. Sélectionnez le magasin personnel, puis cliquez avec le bouton droit de la souris et sélectionnez Importer :

select personal store and import

9. Parcourez le certificat et cliquez sur Suivant:

browse certificate

10. Entrez le mot de passe, puis cliquez sur le bouton Suivant :

enter image description here

11. Sélectionner automatiquement le magasin de certificats:

automatically select the store

12. Les informations du certificat indiquent:

certificate information

13. Le message de dialogue de réussite indique:

enter image description here

14. Actualisez MMConsole pour afficher le certificat:

refresh mmc

15. Faites un clic droit sur le certificat, puis cliquez sur Gérer les clés privées ... :

manage private keys

16. Ajoutez l'identité du pool ou l'utilisateur IIS dans mon cas, j'ai ajouté IIS_IUSRS:

add iis_iusrs

17. L'utilisateur a été ajouté, cliquez sur le boutonOK:

user added

Et c'est fini, le clavier existe existe maintenant !!

87
sabotero

L'application tente peut-être d'écrire dans le chemin de dossier suivant: C:\Documents and Settings\Tous les utilisateurs\Application Data\Microsoft\Crypto\RSA\MachineKeys

Si votre application utilise l'emprunt d'identité ou l'utilisateur IUSR_MACHINENAME, configurez le dossier MachineKeys et donnez à l'utilisateur Lecture et exécution, Liste du contenu du dossier, Lecture, Écriture. Si cela ne fonctionne pas, essayez de donner à l'utilisateur Tout le monde les mêmes autorisations.

4
eMi

Je crois qu'en utilisant Encrypt and Decrypt, il faut une clé publique pour chiffrer et une clé privée pour déchiffrer. Donc, cela échoue parce que vous essayez de déchiffrer sans la clé privée et que cela cause l'exception. 

Vous devriez vraiment utiliser SignData méthode pour créer la signature et VerifyData pour la vérification.

3
tyranid

J'ai rencontré le même problème. Le message n'est pas idéal et dans mon cas, mon utilisateur n'était pas autorisé à accéder à la clé privée. Vous pouvez résoudre ce problème en procédant comme suit:

  1. Ouvrir mmc
  2. Ajouter un composant logiciel enfichable de certificat
  3. sélectionnez le certificat que vous souhaitez utiliser
  4. faites un clic droit dessus et sélectionnez "Toutes les tâches"/"Gérer les clés privées ..."
  5. Ajoutez votre utilisateur à la liste des utilisateurs autorisés et autorisez le "Contrôle total" 
1
Johnny Graber

J'ai rencontré cette erreur alors que je ne chargeais pas mon PrivateKey à partir de mon certificat dans SigningKey de ma signatureXmlElement lorsque je tentais de signer une réponse SAML.

signedElement.SigningKey = myCertificate.PrivateKey;
0
Mough