使用公钥解密

时间:2013-08-05 20:39:12

标签: c# encryption rsa

我希望使用私有RSA密钥加密某些数据,然后使用公钥在客户端计算机上解密。据我所知,这是使用RSA的常用方法。 但是,据我所知,在.NET Framework的RSACryptoServiceProvider中存在此问题。虽然当您向RSACryptoServiceProvider提供公钥和私钥时解密工作正常,但只有当您只提供公钥时才会解密。在这种情况下,我得到填充错误:

Error occurred while decoding OAEP padding.

at System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte[] pbEncryptedKey, Int32 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey)
at System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP)

注意:

  • 我将fOAEP设置为true加密/解密。
  • 我使用1024密钥大小,我要加密的数据不超过65个字节。
  • 我从XML加载密钥。
我失踪了吗?我没有看到任何可以更改的填充设置。

当然,我无法将私钥发送到客户端计算机......

我应该尝试像Bouncy Castle这样的另一个图书馆吗?

我也发现了this问题,但没有明确的解决方案,据作者说,他的最终解决方案是使用this article中的代码。但是,如果可能的话,我更愿意使用.NET Framework的代码,我不明白为什么我的解密失败。

另外,我认为我的数据不是很长,以至于this answer具有任何相关性。

也许我可以使用SignHash()/ VerifyHash(),但我认为那些在加密之前计算数据的哈希,而我已经计算了哈希值,我只需要加密它。使用SignHash()将限制我可以使用的各种散列算法,因此最好避免使用它。

1 个答案:

答案 0 :(得分:1)

签名生成包含3个不同的部分。首先计算散列,然后添加填充,最后RSA执行模幂运算(可能通过使用中国剩余定理来加速)。

签名生成的所有这三个部分都是签名算法的一部分。将签名生成视为三个不同的部分是错误的。将RSA签名生成视为使用RSA加密尤其错误。 RSA加密使用它自己的填充机制,这些机制与用于签名的不兼容。

这在PKCS#1 v2.2标准中得到了很好的解释。

  

每个原语的主要数学运算是取幂,   与第5.1节的加密和解密原语一样。 RSASP1   和RSAVP1与RSADP和RSAEP相同,但名称除外   他们的输入和输出参数;他们是有名的   用于不同目的。

因此即使标准非常明确地使用不同的函数,即使它们执行基本相同的数学运算。

最终结果就是这样:你必须使用RSACryptoServiceProvider类用于PKCS#1 v1.5兼容签名,或者使用Bouncy Castle C#库来使用更新的RSA PSS签名方案。如果要为预先计算的哈希创建签名,请使用SignHash,尽管 - 如您所述 - 此功能目前仅限于SHA-1或MD5。