CryptographicException:未知错误'80007005'。当在.Net精简版框架中调用RSACryptoServiceProvider.Decrypt()
问题描述:
我试图使用RSACryptoServiceProvider
加密/解密。加密工作正常,但Decrypt
方法抛出一个异常与消息:CryptographicException:未知错误'80007005'。当在.Net精简版框架中调用RSACryptoServiceProvider.Decrypt()
未知错误'80007005'。
这是代码:
Byte[] plainData = encoding.GetBytes(plainText);
Byte[] encryptedData;
RSAParameters rsap1;
Byte[] decryptedData;
using (RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider())
{
encryptedData = rsa1.Encrypt(plainData, false);
rsap1 = rsa1.ExportParameters(false);
}
using (RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider())
{
rsa2.ImportParameters(rsap1);
decryptedData = rsa2.Decrypt(encryptedData, false);
}
decryptedText = encoding.GetString(decryptedData, 0, decryptedData.Length);
是任何人都知道的一种解决方法?
谢谢!
答
rsap1 = rsa1.ExportParameters(false);
通过将false传递给此方法,您选择不导出私钥。没有私钥就难以解密数据。尝试将true传递给导出方法。
答
使用RSA时,您需要了解密钥管理的基本知识。您没有指定在加密过程中使用什么密钥容器。你期望用什么键?默认的用户密钥?机器的钥匙?你知道默认的用户密钥和机器密钥是什么?更何况明显的问题为什么你加密什么与RSA?使用RSA加密完全用于加密会话密钥,并且有专门的密钥交换协议来处理这种开箱即用的(面向TLS的流或面向像S/MIME的文档)。您应该使用其中一种开箱即用的协议,而不是推出自己的加密方案。你将拧紧密钥管理,这是有保证的。
当您尝试解密时,解密者是否拥有与加密过程中使用的公钥相对应的私钥?
参见:
注意,这些都是在MSDN只是简单的代码示例和不应该被任何人没有非常深刻的理解使用密码学,特别是密钥管理。
我建议您考虑使用高级别类如SslStream来加密数据交换。对于文档存储加密方案,您最好使用操作系统工具或依靠ProtectedData类。再说一次,除非你真的知道你在做什么(在这种情况下,你不会在这里问问题),否则不要推出自己的加密。
答
修正了代码!我想我不需要指定容器......
Byte[] plainData = encoding.GetBytes(plainText);
Byte[] encryptedData;
Byte[] decryptedData;
using (RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider())
{
RSAParameters rsap1 = rsa1.ExportParameters(false);
using (RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider())
{
rsa2.ImportParameters(rsap1);
encryptedData = rsa2.Encrypt(plainData, false);
}
decryptedData = rsa1.Decrypt(encryptedData, false);
}
decryptedText = encoding.GetString(decryptedData, 0, decryptedData.Length);
导出密钥与数据呈现RSA无用。此外,加密者甚至可能不拥有私钥。 – 2010-06-02 01:08:43
尝试阅读他的代码。 – 2010-06-02 01:12:38