2010-06-25 132 views
2

首先,那不是打字錯誤,我想解密使用公衆鍵。這樣做的目的是挑戰第三方,以確保他們確實擁有與公鑰對應的私鑰。基本上,我會發送一些隨機數據,他們會用他們的私鑰對它進行加密,然後使用公鑰對其進行解密,並將解密後的值與我發送的隨機數據進行比較。我相信這是一個非常標準的公鑰加密程序,但由於某些原因,使用公鑰解密似乎是禁忌。使用RSA公開密鑰解密數據

我只是在.NET 2.0中使用RSACryptoServiceProvider。但是,當我撥打Decrypt時,它會顯示CryptographicException,並顯示消息Bad Key。關鍵是不壞(我可以Encrypt沒有問題),但它似乎不會讓我只用公鑰解密。是什麼賦予了?這一定是可以做到的。

回答

7

我認爲公認的術語是簽署。他們用用私鑰,而你用用公鑰驗證。我承認我並不理解低級數學,但我的理解是簽名實際上只是用私鑰進行加密。使用RSACryptoServiceProvider的方法簽名並驗證。實際上,SignHash實際上是說,「用私鑰對它進行加密」。

+0

*「但我的理解是簽名實際上只是使用私鑰進行加密」* - 嗯,是,不是。理論上是。然而,在實踐中,您首先對輸入進行散列,使用私鑰對* hash *進行加密,然後將其附加到消息中,因爲RSA在計算上非常昂貴。事實上,實際上,在加密時,您甚至不用公鑰對輸入進行加密:您需要對大型隨機數進行加密,並將該數字用作快速對稱加密算法(如AES)的密鑰。 – 2010-06-25 22:25:43

+1

@BlueRaja,我實際上意識到這一點(散列和RSA僅用於交換隨機會話密鑰)。這就是爲什麼我引用'SignHash'的一部分。我的觀點是「簽署x」==「用私鑰加密x」。無論x是散列還是真實消息,這都適用。 – 2010-06-25 22:36:38

+1

簽名和加密的主要區別在於,當你*加密*時,你用隨機數據填充(以防止明文猜測攻擊);當*符號*時,您將填充具有預定義結構的數據(以防止選擇餘數的攻擊)。在驗證簽名時,驗證填充數據是否正確也很重要。 – caf 2010-06-26 13:43:42

0

這些.Net類應該是加密API的包裝。

加密API中有兩種類型的密鑰。 Crypto API是PKCS#11的包裝。當您使用Microsoft加密服務提供程序生成密鑰對時,您將獲得AT_EXCHANGE和AT_SIGNATURE密鑰。每個鍵是基於PKCS#11標準中定義的一些屬性生成..

AT_EXCHANGE鍵屬性:

渦卷/解開=真

符號/驗證=真

加密/解密=假

AT_SIGNATURE鍵屬性:

包裝/拆開包裝=假

簽名/驗證=真

加密/解密=假

因此,基本上,當你exchaning數據,你基本上是執行包裝/解包功能。這就是微軟稱之爲AT_EXCHANGE的原因。這主要用於交換祕密/對稱密鑰,不用於交換海量數據。

所以你需要回去找出你選擇哪個密碼,然後標記/包裹你的dat。

+0

我不太確定我遵循...我是不做簽名我只是想驗證簽名。即便如此,我真正想做的只是解密一些數據。從我正在收集的信息中可以看出,這聽起來不像是使用.NET API的可能性。 – Dennis 2010-06-30 17:00:38

+0

我不理解你的評論。你在說>>我只是想驗證簽名<<但是你也在說,>>我真正想要解密一些數據<<你只想解密數據或者你想驗證簽名或者你想同時做這兩件事?如果它是第三選擇,那麼看看Hybrid模型[http://en.wikipedia.org/wiki/Hybrid_cryptosystem]。 – Raj 2010-07-01 09:25:17

+0

我有一堆字節,我試圖使用RSACryptoServiceProvider進行RSA解密,我擁有的是公鑰。術語「簽署」和「哈希」只是混淆了我的目標。 – Dennis 2010-07-02 13:26:38

0

根據Raj,您提供的鑰匙可能未標記爲交換。

詢問提供公鑰的人是如何產生的。如果使用makecert。exe,他們需要指定「-sky Exchange」。沒有這個,你只能使用密鑰進行簽名和身份驗證,而不能使用加密/解密,這是你在這裏實現的用例。