为什么同一个GPG键可以有两个不同的ASCII-armor?

时间:2014-05-15 13:09:55

标签: javascript web-services security pki gnupg

我尝试使用openpgpjsopenpgp server设置gpg密钥生成器/经理网络。 我能够毫无困难地生成密钥对,但是当我想将装甲公钥发送到pks时,我收到一个错误:"解码密钥块时出错#34;。

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

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

所以我有两个问题:

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

2 个答案:

答案 0 :(得分:2)

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

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

第一位总是一位,第二位也应该是一位(这意味着它是一个新包),然后以下是与ASCII装甲内容相对应的二进制值:

  • 0 - 保留 - 数据包标记不得具有此值
  • 1 - 公钥加密会话密钥包
  • 2 - 签名包
  • 3 - 对称密钥加密会话密钥包
  • 4 - 单通道签名包
  • 5 - 密钥密钥包
  • 6 - 公钥包
  • 7 - 秘密子密钥包
  • 8 - 压缩数据包
  • 9 - 对称加密数据包
  • 10 - Marker Packet
  • 11 - 文字数据包
  • 12 - 信任包
  • 13 - 用户ID数据包
  • 14 - 公共子密钥包

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

更多细节可以在RFC 2440第4章找到。

答案 1 :(得分:0)

某些PGP数据包可以交换,例如,如果您有一个以上的非主UID或一个以上的子密钥。接下来,有一种新的数据包格式,它也导致了不同的ASCII装甲。最后但并非最不重要的一点是,签名数据包包含哈希​​值的左两个字节,不再检查这些字节。如果您进行更改,则在查看时几乎不会检测到更改,但是最后的CRC24和将更改。