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);
26
demandé sur Oblivious Sage 2012-08-24 12:49:24

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:

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électionner le magasin, puis cliquez sur suivant:

wizard 3

6. L'assistant de montrer le informations sur le certificat, cliquez sur Terminer bouton

wizard 4

7. le dialogue succès est affiché:

wizard 5

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):

execute mmc

2. Un vide MMC exemple ont montré:

mmc showed

3. cliquez sur Fichier - > Ajouter / Supprimer Snap-in...

add snap-in

4. sélectionnez certificat snap-in un clic dans Ajouter bouton:

add certificate snap-in

5. Sélectionner Ordinateur compte puis cliquez sur bouton:

select computer account

6. Sélectionner ordinateur Local puis cliquez sur Terminer bouton:

selecct local computer

7. Le composant logiciel enfichable certificats est maintenant ajouté, cliquez sur OK bouton:

certificate snap-in shows

8. Sélectionner le personnel magasin, puis faites un clic droit 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 bouton:

enter image description here

11. sélectionner Automatiquement le certificat store:

automatically select the store

12. Les informations de certificat indique:

certificate information

13. message de dialogue de succès montre:

enter image description here

14. rafraîchir le MMConsole pour montrer le certificat:

refresh mmc

15. clic Droit sur le certificat, puis cliquez sur Gestion Privée Touches...:

manage private keys

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

wizard 0

17. L'utilisateur a été ajouté, cliquez sur OK bouton:

user added

Et c'est fini le clavier ne s' existe maintenant!!

80
répondu sabotero 2014-01-15 22:07:20

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.

4
répondu eMi 2012-08-24 09:44:55

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.

3
répondu tyranid 2012-08-24 10:28:30

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;
0
répondu Mough 2016-09-16 19:27:17

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.

-1
répondu bryan.hunwardsen 2018-03-26 20:45:37