我正在开发一个C#应用程序,它使用Bouncy Castle(BC)库实现的PGP加密/解密消息。我知道PKI,但是PGP中的秘密钥匙让我失望了。我查看了BC示例/源代码和PGP RFC,但却提出了更多问题。
是Secretkey ==会话密钥吗?
是Secretkey ==对称密钥吗?
是Secretkey ==私钥(pub / priv密钥对)?至少以下似乎表明密钥是私钥。
internal static PgpPrivateKey FindSecretKey(PgpSecretKeyRingBundle pgpSec, long keyID, char[] pass)
RFC表示,密钥包含有关公钥的信息,或者可能是公钥本身(至少是我的阅读)。
另外,在某处我读到的Secretkey基本上是一个密码加密的私钥。
何时/为什么我需要PGP协议中的密钥?签名或加密?
由于
答案 0 :(得分:4)
引用RFC 4880, OpenPGP, 5.5.1.3. Secret-Key Packet:
Secret-Key数据包包含在a中找到的所有信息 Public-Key数据包,包括公钥材料,也是 包括所有公钥字段后的秘密密钥材料。
和11.2. Transferable Secret Keys:
[...]可转让的格式 除了之外,密钥与可转移的公钥相同 使用秘密密钥和秘密子密钥分组代替公共 密钥和公共子密钥包。实施应该包括自我 任何用户ID和子密钥上的签名,[...]
换句话说,密钥包含公钥/私钥对(例如,RSA),但也应包含用户ID和自签名。 12.1. Key Structures提供了有关如何构造导出键的更多详细信息。用于理解OpenPGP数据包组成的有用工具是gpg --list-packets [file]
或pgpdump [file]
,它们会转储其输入的数据包结构。
答案 1 :(得分:0)
在这种情况下,密钥是私钥。私钥可用于签名或解密。使用另一方的公钥执行加密和验证。现在,秘密密钥主要被认为是一个对称密钥,但它也可能意味着私密,特别是在旧协议中。
密码学中存在很多这种混淆,最好的办法是查看上下文。例如,如果存在公钥,则密钥不能是对称的。