2013-08-05 170 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。