【发布时间】: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