2015-01-12 182 views
0

我正在使用Bouncy Castle(BC)庫實現的PGP來加密/解密消息的C#應用​​程序。我知道PKI,但PGP中的祕密鑰匙讓我有點失望。我查看了BC的示例/源代碼和PGP RFC,但提出了更多問題。什麼是PGP密鑰?

是Secretkey ==會話密鑰?

是密鑰==對稱密鑰?

是Secretkey ==私鑰(pub/priv密鑰對)?至少以下內容似乎表明祕密密鑰是私鑰。

internal static PgpPrivateKey FindSecretKey(PgpSecretKeyRingBundle pgpSec, long keyID, char[] pass) 

的RFC說,祕密密鑰包含,除其他外,有關的公鑰信息,或者可以是公共密鑰本身(至少這是我的閱讀)。

此外,我讀SecretKey的地方基本上是一個密碼加密的私人鑰匙。

何時/爲什麼我需要PGP協議中的密鑰?簽名或加密?

謝謝

回答

2

報價RFC 4880, OpenPGP, 5.5.1.3. Secret-Key Packet

一個祕密密鑰包包含了所有在 公鑰包中發現的信息,包括公鑰材料,也 包括祕密密鑰材料後,所有的公共關鍵字段。

11.2. Transferable Secret Keys

[...]可轉讓 密鑰的格式相同,不同之處在於 祕密密鑰和密碼,子包的轉讓公鑰代替的公鑰 密鑰和公鑰子包。實現應該包含任何用戶ID和子自我 簽名,[...]

與其他詞,密鑰包含公鑰/私鑰對(例如,RSA),但也必須包含用戶ID和自簽名。 12.1. Key Structures給出了關於如何構造導出密鑰的更多細節。理解OpenPGP數據包組成的有用工具是gpg --list-packets [file]pgpdump [file],它轉儲其輸入的數據包結構。

+0

我想以此作爲答案,但不知道如何。 – hexterminator

+0

投票三角形旁邊的左側有一個小小的灰色複選標記,您可以點擊選擇答案。 [常見問題]中也有說明。 –

0

在這種情況下,祕密密鑰是私鑰。私鑰可用於簽名或解密。使用另一方的公鑰執行加密和驗證。現在大多數人認爲密鑰是對稱密鑰,但它也可能意味着私密密鑰,特別是在較舊的協議中。

密碼學中存在很多這種混淆,最好的辦法就是看上下文。例如,如果有公鑰,則密鑰不能是對稱的。

+0

我剛剛通過彈性城堡源代碼更多一點。密鑰具有公鑰和私鑰對。公鑰密碼術通常是這樣的,您可以使用密碼從私鑰生成公鑰。關於Bouncy Caste(BC),Secretkey被傳遞進行簽名(使用從secretkey提取的私鑰對摘要進行加密)和Secretkey!=對稱密鑰。對稱(加密密鑰)密鑰在運行時生成。感謝您指點我正確的方向。 – hexterminator

+0

你是對的。請注意,從私鑰導出公鑰不是理論上的要求。例如,創建一個帶有大型公共指數的RSA公共密鑰是非常可能的(但不是很明智)。儘管RSA公開指數通常與私鑰一起保存,即使在PKCS#1/PKCS#8(等)容器格式中也是如此。我可能會刪除這個答案,贊成Jens的回答,他至少花時間去查閱RFC :) –