【问题标题】:CryptographicException: Unknown Error '80007005'. when calling RSACryptoServiceProvider.Decrypt() in .Net Compact FrameworkCryptographicException:未知错误“80007005”。在 .Net Compact Framework 中调用 RSACryptoServiceProvider.Decrypt() 时
【发布时间】:2010-06-02 00:40:04
【问题描述】:

我正在尝试使用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);

有人知道解决方法吗?

谢谢!

【问题讨论】:

    标签: c# .net compact-framework rsa


    【解决方案1】:

    修复了代码!我想我毕竟不需要指定一个容器......

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

    【讨论】:

      【解决方案2】:
      rsap1 = rsa1.ExportParameters(false);
      

      通过将 false 传递给此方法,您选择不导出私钥。没有私钥就很难解密数据。尝试将 true 传递给导出方法。

      【讨论】:

      • 将密钥与数据一起导出会使 RSA 无用。此外,加密器甚至可能不拥有私钥。
      【解决方案3】:

      使用 RSA 时,您需要了解密钥管理的基础知识。您没有指定在加密期间使用什么密钥容器。您希望使用什么密钥?默认用户密钥?机器钥匙?你了解什么是默认用户密钥和机器密钥吗?更不用说为什么你用RSA加密任何东西这个显而易见的问题了? RSA 加密用于加密会话密钥,并且有专门的密钥交换协议来处理这种开箱即用的问题(面向流,如 TLS 或面向文档,如 S/MIME)。您应该使用其中一种开箱即用的协议,而不是使用您自己的加密方案。您搞砸密钥管理,这是有保证的。

      当您尝试解密时,解密者是否拥有与加密期间使用的公钥对应的私钥?

      见:

      请注意,这些只是 MSDN 中的简单代码示例,如果没有对密码学特别是密钥管理有非常深入的了解,任何人都不应使用这些示例。

      我建议您考虑使用像 SslStream 这样的高级类来加密数据交换。对于文档存储加密方案,您最好使用操作系统工具或依赖ProtectedData 类。同样,除非您真的知道自己在做什么(在这种情况下,您不会在这里提问),否则不要自行加密。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-09
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 2012-01-09
        相关资源
        最近更新 更多