GPG:[E]子密钥的公钥与主密钥的公钥相同吗?

GPG:[E]子密钥的公钥与主密钥的公钥相同吗?

我将 [E] 子项从 ~/.gnupg 导入到不同的文件夹,并使用选项导出子项的公钥--homedir

我可以看到子密钥的公钥比主密钥的公共密钥有更少的行,使用 diff 结果发现它们有一些相同的起始行,但底部有不同的行,所以最后它仍然是不同的公钥。

我的问题:它们的公钥不同吗? (我这里还需要双重确认)。如果它们不同,那么使用子密钥的加密/解密是独立的,与主密钥和其他子密钥没有关系?

答案1

在非对称加密中,您总是要处理密钥对。对于每个秘密密钥,都有一个相应的公钥。因此,回答您的第一个问题:是的,主密钥对的公钥与其从属密钥对的公钥不同。

我尝试重现您的实验,并创建了一个带有主键 (ID 0xA6271DD4) 和从属键 (ID 0x5336E1DC) 的 GnuPG 测试键。然后,我将从属密钥导出到一个文件并检查它包含哪些数据包。

$ gpg --export-secret-subkey 5336E1DC! > subkey.gpg
$ gpg --list-packets subkey.gpg | grep "\(packet\|keyid\)"
:secret key packet:
    keyid: 877AA505A6271DD4
:user ID packet: "testtest <test@test>"
:signature packet: algo 1, keyid 877AA505A6271DD4
:secret sub key packet:
    keyid: B0389BEB5336E1DC
:signature packet: algo 1, keyid 877AA505A6271DD4
$

请注意,用户 ID 和秘密从属密钥均由主密钥签名。乍一看,主密钥和从属密钥似乎都已导出。显示有关第一个秘密数据包的更多信息。

$ gpg --list-packets subkey.gpg | head 
# off=0 ctb=95 tag=5 hlen=3 plen=277
:secret key packet:
    version 4, algo 1, created 1546169910, expires 0
    pkey[0]: [2048 bits]
    pkey[1]: [17 bits]
    gnu-dummy S2K, algo: 0, simple checksum, hash: 0
    protect IV: 
    keyid: 877AA505A6271DD4
# off=280 ctb=b4 tag=13 hlen=2 plen=20
:user ID packet: "testtest <test@test>"
$ 

在 GnuPG 中导出密钥时,相应的公钥始终会随之导出。所以这个秘密密钥包包含一个 2048 位的公钥加上可能它的 17 位哈希值。但密钥本身丢失了,只导出了一个存根:gnu-dummy S2K, algo: 0, simple checksum, hash: 0。总结一下:导出秘密子密钥时,您始终会随之导出公共子密钥和公共主密钥(验证签名所必需的)。

您写道,您的公共子密钥的行数少于公共主密钥的行数。我无法重现这一点。使用 GnuPG,您可以导出不带任何子密钥的公钥,在上面的示例中通过命令gpg --export A6271DD4! > pubkey.gpg(请注意感叹号)。另一方面,它是无法仅导出公共子密钥。但如果将主钥匙与主钥匙加上子钥匙进行比较,后者的行数自然会更多。因此,为了更好地理解您的观察,最好知道您使用的确切命令。

相关内容