我正在尝试使用openpgpjsopenpgp server建立一个gpg密钥生成器/管理器网站。
我能够毫不费力地生成密钥对,但是当我想将装甲的公共(public)密钥发送到pk时,会出现错误:“对密钥块进行解码时出错”。

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

然后,我尝试从GnuPG导出密钥,并将结果以pks的形式复制,它也起作用。
因此,我尝试比较导入的文件和导出的文件,期望某些CR + LF会有所不同。令我惊讶的是,整个ASCII装甲的密钥都不相同。

所以我有两个问题:

  • 同一键如何具有两个不同的ASCII装甲?
  • 我如何让我的Javascript发行可被pk接受的装甲 key ?
  • 最佳答案

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

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

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

  • 0-保留-数据包标签不得具有此值
  • 1-公钥加密的 session 密钥包
  • 2-签名数据包
  • 3-对称密钥加密的 session 密钥包
  • 4-单次通过签名包
  • 5-密钥包
  • 6-公钥包
  • 7- secret 子密钥包
  • 8-压缩数据包
  • 9-对称加密的数据包
  • 10-标记数据包
  • 11-文字数据包
  • 12-信任数据包
  • 13-用户ID数据包
  • 14-公共(public)子密钥包

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

    可以在RFC 2440第4章中找到更多详细信息。

    07-23 16:40