使用公钥进行解密

本文关键字:解密 公钥 | 更新日期: 2023-09-27 18:26:35

我想用我的私人RSA密钥加密一些数据,然后在客户端机器上用公钥解密。据我所知,这是使用RSA的一种正常方式。然而,就我所见,在.NET框架的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这样的图书馆吗?

我也发现了这个问题,但没有明确的解决方案,根据作者的说法,他的最终解决方案是使用本文中的代码。然而,如果可能的话,我更喜欢使用.NET Framework的代码,我不明白为什么我的解密失败。

此外,我不认为我的数据太长,这个答案有任何相关性。

也许我可以使用SignHash()/VerifyHash(

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

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

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

每个基元中的主要数学运算是幂运算,如在第5.1节的加密和解密原语中。RSASP1和RSAVP1与RSADP和RSAEP相同,不同之处在于它们的输入和输出自变量;他们是杰出的用于不同目的。

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

最终结果很简单:您必须为PKCS#1v1.5兼容的签名使用RSACryptoServiceProvider类,或者使用Bouncy Castle C#库才能使用较新的RSA PSS签名方案。如果您想为预先计算的哈希创建签名,请使用SignHash,尽管正如您所提到的,该函数目前仅限于SHA-1或MD5。

使用公钥进行解密