【问题标题】:How come the same GPG key can have two different ASCII-armor?为什么同一个 GPG 密钥可以有两个不同的 ASCII 装甲?
【发布时间】:2020-11-24 21:25:53
【问题描述】:

我正在尝试使用openpgpjsopenpgp server 设置基于网络的gpg 密钥生成器/管理器。 我能够毫无问题地生成密钥对,但是当我想将装甲公钥发送到 pks 时,我收到一个错误:“错误解码密钥块”。

经过几次尝试(使用 url 编码,没有 url 编码,通过 Ajax 请求或直接在 pks 表单上复制/粘贴...),我决定尝试将其导入 GnuPG:它成功了!

然后我尝试从 GnuPG 导出密钥并以 pks 的形式复制结果,它也有效。 所以我尝试比较导入的文件和导出的文件,期望某些 CR+LF 会有所不同。我很惊讶整个 ASCII 铠装钥匙都不同。

所以我有两个问题:

  • 同一个钥匙怎么可能有两个不同的 ASCII 装甲?
  • 如何让我的 Javascript 发出一个可以被 pks 接受的装甲密钥?

【问题讨论】:

  • 您是否尝试了解应用程序是否引用了不同版本的开放 PGP 协议?
  • @owlstead 你是对的!看来我正试图在只接受“旧格式”的服务器上导入“新格式”密钥(参见第 4 章的 RFC 2440)。现在我需要转换我的密钥或“老式”生成它......有什么提示吗?
  • 一点时间,你能回答你自己的问题吗?然后其他人也可以获利。
  • 我会在周末尝试这样做,感谢您的帮助

标签: javascript web-services security pki gnupg


【解决方案1】:

正如@owlstead 所说,这两个应用程序使用不同版本的开放 PGP 协议。 Openpgpjs 使用新格式提供 ASCII 铠装密钥,而 pks 只接受旧格式。

您需要解码密钥的第一个字节才能注意到它: 取key的前2个字母,用radix-64 table得到二进制值,然后检查前8位(一个字节)。

第一位永远是1,第二位也应该是1(表示它是一个新包),那么下面是ASCII盔甲内容对应的二进制值:

  • 0 -- 保留 -- 包标签不能有这个值
  • 1 -- 公钥加密会话密钥包
  • 2 -- 签名包
  • 3 -- 对称密钥加密会话密钥包
  • 4 -- 一次性签名包
  • 5 -- 密钥包
  • 6 -- 公钥包
  • 7 -- 秘密子密钥包
  • 8 -- 压缩数据包
  • 9 -- 对称加密数据包
  • 10 -- 标记包
  • 11 -- 文字数据包
  • 12 -- 信任包
  • 13 -- 用户ID包
  • 14 -- 公共子密钥包

在旧格式中,二进制值编码为 4 位(位 5 到 2),而在新格式中,二进制值编码为 6 位(从 5 到 0)。

更多详情请见RFC 2440,第 4 章。

【讨论】:

    【解决方案2】:

    某些 PGP 数据包可以交换,例如,如果您有多个非主 UID 或多个子密钥。接下来,有一种新的数据包格式,它也会产生不同的 ASCII 装甲。最后但并非最不重要的一点是签名包包含哈希​​值的左两个字节,不再检查。如果你改变它们,你几乎看不到它的变化,但最后的CRC24和会改变。

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      相关资源
      最近更新 更多