2013-08-05 105 views
3

我想用我的私人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加载密钥。

我错过了什么?我没有看到任何可以更改的填充设置。

当然,我不能把我的私有密钥到客户机...

我应该尝试像充气城堡另一个库?根据作者的说法,他的最终解决方案是使用this article中的代码。但是没有明确的解决方案,根据作者,他的最终解决方案是使用代码this article。但是,如果可能,我宁愿使用.NET Framework的代码,但我不明白为什么解密失败。

此外,我不认为我的数据太长,this answer是任何相关性。

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

+2

“我想用我的私人RSA密钥加密一些数据,然后用公钥在客户端机器上解密它。”我想你已经倒退了。您只能使用私钥解密,但您可以使用公钥进行加密。 –

+1

@Steven V:当你签署一个用于认证某些数据源的哈希(添加数字签名)时,是不是使用私钥加密的加密哈希的签名?这就是我想要做的。 – NoOne

+0

http://en.wikipedia.org/wiki/Public-key_cryptography“每个用户都有一对密钥 - 一个公共加密密钥和一个私人解密密钥。” – Orch

回答

1

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

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

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

The main mathematical operation in each primitive is exponentiation, as in the encryption and decryption primitives of Section 5.1. RSASP1 and RSAVP1 are the same as RSADP and RSAEP except for the names of their input and output arguments; they are distinguished as they are intended for different purposes.

所以即使标准非常明确地使用不同的功能,即使它们执行基本相同的数学运算。

最终结果很简单:你必须使用RSACryptoServiceProvider类PKCS#1 V1.5兼容签名,或充气城堡C#库使用较新的RSA PSS签名方案。如果要为预先计算的散列创建签名,请使用SignHash,但正如您所提到的,此功能目前仅限于SHA-1或MD5。