PGP 私钥块是否也“包含”公钥?

Del*_*ani 15 pgp gnupg

我注意到,如果我将我的 ASCII 装甲 PGP 私钥导入一个空的 GnuPG 密钥环(通过~/.gnupg事先删除),则该密钥环包含公钥和私钥。此外,ASCII-armored 私钥块大约是我对应的公钥的两倍,这让我相信私钥块包含私钥和公钥,而公钥块只包含后者。

自从我创建了我的密钥以来,到目前为止,我已经使用一个包含导出的私钥块的文件和另一个包含导出的公钥块的文件备份了我的密钥。我的公钥块备份是多余的,因此我只保留私钥文件是否安全?

我使用这个命令来创建私钥文件:

gpg --export-secret-keys -a > private
Run Code Online (Sandbox Code Playgroud)

和这个创建公钥文件的命令:

gpg --export -a > public
Run Code Online (Sandbox Code Playgroud)

use*_*686 17

是的,OpenPGP“秘密密钥”和“秘密子密钥”数据包包含公共和私有参数。您可以通过使用pgpdump检查导出的密钥来验证这一点:

$ gpg --export-secret-key grawity | 转储
旧:密钥包(标签 5)(1854 字节)
    版本 4 - 新
    公钥创建时间 - 欧洲东部时间 2009 年 10 月 31 日星期六 14:54:03
    发布算法 - RSA 加密或签名(发布 1)
    RSA n(4096 位) - ...
    RSA e(17 位) - ...
    符号算法 - CAST5(符号 3)
    迭代和加盐的字符串到键(s2k 3):
        哈希算法 - SHA1(hash 2)
        盐 - 12 24 0f e1 5b 7e e2 46 
        计数 - 65536(编码计数 96)
    IV - 91 a3 44 71 47 87 a4 ba 
    加密的 RSA d
    加密的 RSA p
    加密的 RSA q
    加密的 RSA u
    加密的 SHA1 哈希

这适用于大多数非对称密钥系统,而不仅仅是 OpenPGP。

  • @vy32:那些不是 OpenPGP 密钥,所以它无关紧要。但是,对于那些人来说,这_仍然是正确的_。(注意 `openssl genrsa` 如何仅输出“私有”块,因此可以从中派生出公共块。)您可以自己检查它们:`openssl genrsa 512 | openssl asn1parse -i`。或者检查 **[RFC 3447 附录 A](https://tools.ietf.org/html/rfc3447#appendix-A)**,它清楚地显示了 RSAPrivateKey 结构中的模数和公共指数。 (4认同)