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);
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.
1. Double-cliquez sur le certificat:
2. L'assistant s'ouvre, cliquez sur le bouton suivant:
3. L'assistant affiche l'emplacement des certificats, cliquez sur le bouton suivant:
4. Entrez le mot de passe puis cliquez sur suivant:
5. Sélectionnez le magasin puis cliquez sur suivant:
6. L'assistant affiche les informations du certificat, cliquez sur le bouton Terminer
7. Succes s'affiche:
1. Exécuter Microsoft Management Console (mmc.exe):
2. Une instance vierge MMC indiquait:
3. Cliquez sur Fichier-> Ajouter/Supprimer un composant logiciel enfichable ...
4. Sélectionnez le composant logiciel enfichable certificat et cliquez dans Ajouter bouton:
5. Sélectionnez Compte d'ordinateur puis cliquez dans le bouton Suivant :
6. Sélectionnez Ordinateur local puis cliquez sur le bouton Terminer :
7. Le composant logiciel enfichable de certificat est maintenant ajouté, cliquez sur le boutonOK:
8. Sélectionnez le magasin personnel, puis cliquez avec le bouton droit de la souris et sélectionnez Importer :
9. Parcourez le certificat et cliquez sur Suivant:
10. Entrez le mot de passe, puis cliquez sur le bouton Suivant :
11. Sélectionner automatiquement le magasin de certificats:
12. Les informations du certificat indiquent:
13. Le message de dialogue de réussite indique:
14. Actualisez MMConsole pour afficher le certificat:
15. Faites un clic droit sur le certificat, puis cliquez sur Gérer les clés privées ... :
16. Ajoutez l'identité du pool ou l'utilisateur IIS dans mon cas, j'ai ajouté IIS_IUSRS:
17. L'utilisateur a été ajouté, cliquez sur le boutonOK:
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.
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.
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:
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;