2013-04-13 280 views
2

我想在C#中實現以下內容:私鑰加密公鑰加密

我想要一個內部存放公鑰加密例程的Generator。它可以提供一個字節數組(通常由下面描述的客戶端)並用其私鑰對其進行加密。

客戶端擁有與發生器共享的公鑰。它從發生器獲取結果並使用公鑰對其解密。它將最初提供給發生器的字節數組與比較結果以查看它們是否對齊。這個想法是,如果它們匹配,就能夠在某種程度上確認生成加密字節的人擁有私鑰。它也能夠驗證特定的加密值是否與它提供的數據相對應。

我看到的大多數內置C#公鑰加密庫都希望將私鑰與解密關聯起來(如RSACryptoServiceProvider)。我明白了爲什麼,因爲很多場景都涉及保護進程的解密端而不是加密。是否有任何C#庫可以直接保護加密過程?我已經嘗試過整天早上看充氣城堡,但我很難讓它適用於基本場景。該文件留下了一些東西...

再次,我的主要目標是確保無論產生的加密擁有私鑰。客戶也必須確保發電機的結果與其提供的信息相符。如果有我失蹤,可能更好地符合可用的庫替代辦法,我所有的耳朵:)

+0

所以你想要發生器產生一個簽名? – Filip

+1

這已經「選擇了明文攻擊」寫在它上面。公鑰密碼系統依賴於私鑰的擁有者,該私鑰是生成用該密鑰簽名的消息的實體。如果您希望生成器能夠證明它擁有與給定公鑰相關聯的私鑰,那麼讓生成器生成一個由可以散列的隨機位組成的文檔,然後發佈散列,signed-with-private密鑰哈希和文檔。任何擁有公鑰的人都可以驗證散列,簽名散列和文檔匹配。 –

+1

如果你絕對必須讓客戶端 - 記住*應該由生成者假設爲攻擊者* - 提供文檔然後至少讓生成器*將隨機位附加到文檔*,然後*散列新文檔*,然後*加密散列*。同樣,生成器可以發佈修改過的文檔,散列和簽名散列,並且客戶端可以驗證它們全都匹配。但只有在絕對必要時才這樣做。您永遠不想爲攻擊者*加密文檔*。 –

回答

4

你寫:

同樣,我的主要目標是確保,無論生產 加密擁有私鑰。

正如CodesInChaos所提到的,您可以正確使用簽名來實現此目的。通常使用簽名來驗證某些數據是由持有某個私鑰的某個人生成的,但在這裏您可以使用它來驗證密鑰持有者本人。如果您要求他簽署您製作的東西,您可以使用簽名檢查來檢查他是否擁有與您的公鑰對應的私鑰。

簽名實際上是通過對某些數據進行單向散列,然後使用私鑰對該散列進行加密來實現的。然後可以使用公鑰來驗證簽名,方法是解密哈希並將其與重新計算的哈希值進行比較。只有擁有私鑰的人才能製作散列的加密版本。首先你打算做什麼。