Système.Sécurité.Cryptographie.CryptographicException: keyset n'existe pas
quand je fais le certificat x509 à l'encypt et le message de decypt, j'ai eu quelques informations d'erreur et n'ai pas pu corriger ce problème. Quelqu'un pourrait-il jamais arrivé de résoudre ce bug? grâce.
Description: Une exception non gérée s'est produite pendant l'exécution de la demande web actuelle. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
Détails De L'Exception:
Système.Sécurité.Cryptographie.CryptographicException: keyset n'existe pas
Source De L'Erreur:
ligne 53: utilisation de (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider)cerDecrypt.PublicKey.La Clé), La Ligne 54:
Ligne 55: plainHashBytes = rsaProviderDecrypt.Décrypter(encryptedHashBytes, false); Ligne 56:
rsaProviderDecrypt.Clear(); Ligne 57:
rsaProviderDecrypt.Dispose();Fichier Source: E:PayUSitePayMvcAppControllersHashMessageController.ligne cs: 55
Trace De La Pile:
[CryptographicException: keyset n'existe pas. ]
Système.Sécurité.Cryptographie.CryptographicException.ThrowCryptographicException(Int32 rh) +41
Système.Sécurité.Cryptographie.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte [] pbEncryptedKey, Int32 cbEncryptedKey, booléen fOAEP, ObjectHandleOnStack ohRetDecryptedKey) +0
Système.Sécurité.Cryptographie.RSACryptoServiceProvider.Décrypter(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);
5 réponses
cette question Est ancienne mais pour quelqu'un qui cherche la solution tout en continuant à utiliser Encrypt
et Decrypt
voici comment j'ai réussi à résoudre cette erreur:
la base est mon certificat ont été installés de la mauvaise façon en double-cliquant sur le .pfx
fichier et sélectionner le magasin.
la mauvaise façon d'installer le certificat
1. double clic 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électionner le magasin, puis cliquez sur suivant:
6. L'assistant de montrer le informations sur le certificat, cliquez sur Terminer bouton
7. le dialogue succès est affiché:
donc à ce point j'ai eu l'erreur "le jeu de clés n'existe pas".
Pour résoudre ce que j'ai procédé de cette façon (le bon sens)
1. Exécuter Microsoft Management Console (mmc.exe):
2. Un vide MMC exemple ont montré:
3. cliquez sur Fichier - > Ajouter / Supprimer Snap-in...
4. sélectionnez certificat snap-in un clic dans Ajouter bouton:
5. Sélectionner Ordinateur compte puis cliquez sur bouton:
6. Sélectionner ordinateur Local puis cliquez sur Terminer bouton:
7. Le composant logiciel enfichable certificats est maintenant ajouté, cliquez sur OK bouton:
8. Sélectionner le personnel magasin, puis faites un clic droit et sélectionnez importer:
9. parcourez le certificat et cliquez sur Suivant:
10. Entrez le mot de passe, puis cliquez sur bouton:
11. sélectionner Automatiquement le certificat store:
12. Les informations de certificat indique:
13. message de dialogue de succès montre:
14. rafraîchir le MMConsole pour montrer le certificat:
15. clic Droit sur le certificat, puis cliquez sur Gestion Privée Touches...:
16. ajouter l'identité du pool ou l'utilisateur IIS dans mon cas j'ai ajouté IIS_IUSRS:
17. L'utilisateur a été ajouté, cliquez sur OK bouton:
Et c'est fini le clavier ne s' existe maintenant!!
l'application pourrait essayer d'écrire dans le chemin de dossier suivant: C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
si votre application utilise l'usurpation d'identité ou l'utilisation de l'utilisateur IUSR_MACHINENAME, alors configurez le dossier MachineKeys sercurities et donnez à l'utilisateur Read & Execute, la liste du contenu du dossier, Read, Write. Si cela ne fonctionne pas, essayez de donner à chaque utilisateur les mêmes permissions.
je crois que lorsqu'on utilise le chiffrement et le déchiffrement, on s'attend à ce qu'il y ait une clé publique pour le chiffrement et une clé privée pour le déchiffrement. Donc, il échoue parce que vous essayez de décrypter sans la clé privée et qui provoque l'exception.
vous devriez vraiment utiliser SignData méthode de création de signature et VerifyData pour la vérification.
j'ai rencontré cette erreur quand je ne chargeais pas dans le PrivateKey de mon certificat dans le SigningKey de mon signedXmlElement en essayant de signer une réponse SAML.
signedElement.SigningKey = myCertificate.PrivateKey;
j'ai reçu la même erreur que OP: "Système.Sécurité.Cryptographie.CryptographicException: keyset n'existe pas"
la résolution (pour moi) était: Visual Studio doit être (exécuter en tant qu'Admin)
comme cela m'a été expliqué(YMMV), VS doit être exécuté en tant qu'administrateur afin d'extraire la clé privée des certificats du magasin de clés, afin de négocier auth/handshake avec keyvault.