【问题标题】:Decryption using the public key使用公钥解密
【发布时间】:2013-08-06 16:47:33
【问题描述】:

我想用我的 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() 将限制我可以使用的散列算法的种类,因此最好避免使用它。

【问题讨论】:

  • “我想用我的 RSA 私钥加密一些数据,然后在客户端机器上用公钥解密。”我想你已经把它弄反了。只能用私钥解密,但可以用公钥加密。
  • @Steven V :当您签署用于验证某些数据源的哈希(添加数字签名)时,签名不是使用私钥加密的加密哈希吗?这就是我想做的。
  • en.wikipedia.org/wiki/Public-key_cryptography "每个用户都有一对加密密钥——一个公共加密密钥和一个私有解密密钥。"
  • @Orch:是的,我知道。我只需要用我的私钥签署一个哈希(创建一个数字签名)并将我的公钥发布给公众(以便他们验证我发送的数据的来源)。
  • 您的 RSA 密钥大小相当小,请参阅 keylength.com 了解合适的大小。有了这样的密钥大小,SHA-1 可能不是您最大的问题。

标签: c# encryption rsa


【解决方案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。

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2016-12-31
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多