c# - does - System.Security.Cryptography.CryptographicException: el conjunto de claves no existe
keyset does not exist c# (5)
Creo que al usar Cifrar y Descifrar, se espera una clave pública para cifrar y una clave privada para descifrar. Por lo tanto, está fallando porque está intentando descifrar sin la clave privada y eso causa la excepción.
Realmente debería usar el método SignData para crear la firma y VerifyData para la verificación.
Cuando hago el certificado x509 para cifrar y descifrar el mensaje, obtuve información de error y no pude solucionar este problema. ¿Podría alguien alguna vez pasar para resolver este error? Gracias.
Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.
Detalles de la excepción:
System.Security.Cryptography.CryptographicException: el conjunto de claves no existe。
Error de fuente:
Línea 53: usando (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider) cerDecrypt.PublicKey.Key) Línea 54:
{Línea 55: plainHashBytes = rsaProviderDecrypt.Decrypt (encryptedHashBytes, false); Línea 56:
rsaProviderDecrypt.Clear (); Línea 57:
rsaProviderDecrypt.Dispose ();Archivo de origen: E: / PayUSite / PayMvcApp / Controllers / HashMessageController.cs Línea: 55
Traza de la pila:
[CryptographicException: keyset no existe. ]
System.Security.Cryptography.CryptographicException.ThrowCryptographicException (Int32 hr) +41
System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey (SafeKeyHandle pKeyContext, Byte [] pbEncryptedKey, Int32 cbEncryptedKey, FOAEP booleano, ObjectHandleOnStack ohRetDecryptedKey) +0
System.Security.Cryptography.RSACryptoServiceProvider.Decrypt (Byte [] rgb, FOAEP booleano) +579
código fuente:
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);
Esta pregunta es antigua, pero para alguien que busque la solución mientras continúa utilizando Encrypt
and Decrypt
aquí es cómo logro resolver este error:
La base es que mi certificado se instaló de manera incorrecta haciendo doble clic en el archivo .pfx
y seleccionando la tienda.
La forma incorrecta de instalar el certificado
1. Haga doble clic en el certificado:
2. El asistente se abre, haga clic en el siguiente botón:
3. El asistente muestra la ubicación de los certificados, haga clic en el siguiente botón:
4. Ingrese la contraseña y luego haga clic en siguiente:
5. Seleccione la tienda y luego haga clic en siguiente:
6. El asistente muestra la información del certificado, haga clic en el botón Finalizar
7. Se muestra el diálogo de éxito:
Así que en este punto tuve el error "Keyset no existe" .
Para resolver eso procedí de esta manera (la forma correcta)
1. Ejecute Microsoft Management Console (mmc.exe):
2. Una instancia de MMC en blanco mostró:
3. Haga clic en Archivo-> Agregar / quitar complemento ...
4. Seleccione el complemento de certificado y haga clic en el botón Agregar :
5. Seleccione la cuenta de la computadora y haga clic en el botón Siguiente :
6. Seleccione la computadora local y haga clic en el botón Finalizar :
7. El complemento de certificado ahora está agregado, haga clic en el botón Aceptar :
8. Seleccione la tienda personal, luego haga clic derecho y seleccione Importar :
9. Busque el certificado y haga clic en siguiente:
10. Ingrese la contraseña, luego haga clic en el botón Siguiente :
11. Selecciona automáticamente el almacén de certificados:
12. La información del certificado muestra:
13. El mensaje de diálogo de éxito muestra:
14. Actualice el MMConsole para mostrar el certificado:
15. Haga clic derecho en el certificado, luego haga clic en Administrar claves privadas ... :
16. Agregar la identidad del grupo o el usuario de IIS en mi caso, agregué IIS_IUSRS:
17. El usuario ha sido añadido, haga clic en el botón Aceptar :
Y ya está terminado el conjunto de teclas ya existe !!
La aplicación podría estar intentando escribir en la siguiente ruta de carpeta: C: / Documents and Settings / Todos los usuarios / Datos de aplicación / Microsoft / Crypto / RSA / MachineKeys
Si su aplicación utiliza la suplantación o el usuario IUSR_MACHINENAME, configure los valores de la carpeta MachineKeys y déle al usuario Lectura y ejecución, Lista de contenidos de la carpeta, Lectura, Escritura. Si eso no funciona, intente dar a los usuarios Todos los mismos permisos.
Me encontré con este error cuando no estaba cargando el PrivateKey de mi certificado en el SigningKey de mi signXmlElement cuando intentaba firmar una respuesta SAML.
signedElement.SigningKey = myCertificate.PrivateKey;
Recibí el mismo error que OP: "System.Security.Cryptography.CryptographicException: el conjunto de claves no existe"
La resolución (para mí) fue: Visual Studio debe ser (ejecutarse como administrador)
Como se me explicó (YMMV), VS debe ejecutarse como administrador para poder extraer los certificados de la clave privada del almacén de claves, a fin de negociar auth / handshake con keyvault.