什么是 PGP 密钥?

What is a PGP Secret Key?

我正在开发一个 C# 应用程序,该应用程序 encrypts/decrypts 使用由 Bouncy Castle (BC) 库实现的 PGP 消息。我知道 PKI,但 PGP 中的秘密密钥让我有点失望。我查看了 BC examples/source 代码和 PGP RFC,但提出了更多问题。

Secretkey == Session key吗?

Secretkey == 对称密钥吗?

Secretkey == 私钥(pub/priv 密钥对)吗?至少以下似乎表明密钥是私钥。

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

RFC 表示密钥包含有关 public 密钥的信息,或者可能是 public 密钥本身(至少我是这么认为的)。

此外,我在某处读到 Secretkey 基本上是密码加密的私钥。

When/why 我需要 PGP 协议中的密钥吗?签名还是加密?

谢谢

在这种情况下,密钥是私钥。私钥可用于签名或解密。使用对方的public密钥进行加密验证。密钥现在大多被认为是对称密钥,但它也可以表示私有,尤其是在旧协议中。

密码学中有很多这种混淆,最好的办法是看上下文。例如,如果有一个 public 密钥,则该密钥不能是对称的。

引用 RFC 4880, OpenPGP, 5.5.1.3. Secret-Key Packet:

A Secret-Key packet contains all the information that is found in a Public-Key packet, including the public-key material, but also includes the secret-key material after all the public-key fields.

11.2. Transferable Secret Keys

[...] The format of a transferable secret key is the same as a transferable public key except that secret-key and secret-subkey packets are used instead of the public key and public-subkey packets. Implementations SHOULD include self- signatures on any user IDs and subkeys, [...]

换句话说,密钥包含 public/private 密钥对(例如,RSA),但还应包含用户 ID 和自签名。 12.1. Key Structures 提供了有关如何构造导出密钥的更多详细信息。 gpg --list-packets [file]pgpdump [file] 是了解 OpenPGP 数据包组成的有用工具,它们会转储其输入的数据包结构。