我正在尝试使用 openpgpjs 设置基于网络的 gpg key 生成器/管理器和一个 openpgp server . 我能够毫无问题地生成 key 对,但是当我想将装甲公钥发送到 pks 时,我收到错误消息:“解码 key block 时出错”。
经过几次尝试(使用 url 编码、不使用 url 编码、通过 Ajax 请求或直接在 pks 的表单上复制/粘贴...),我决定尝试将其导入 GnuPG:它成功了!
然后我尝试从 GnuPG 导出 key 并将结果复制到 pks 的形式中,它也有效。 所以我试着比较导入的文件和导出的文件,希望某些 CR+LF 会有所不同。我很惊讶整个 ASCII 装甲 key 是不同的。
所以我有两个问题:
- 同一个 key 怎么可能有两个不同的 ASCII-armor?
- 我怎样才能让我的 Javascript 发布一个将被 pks 接受的装甲 key ?
最佳答案
如@owlstead 所述,这两个应用程序使用不同版本的开放式 PGP 协议(protocol)。 Openpgpjs 使用新格式提供 ASCII 装甲 key ,而 pks 只接受旧格式。
您需要解码 key 的第一个字节才能注意到它: 取 key 的前 2 个字母并使用 radix-64 table获取二进制值,然后检查前 8 位(一个字节)。
第一位永远是1,第二位也应该是1(表示是新包),那么下面就是ASCII装甲内容对应的二进制值:
- 0 -- 保留 - 包标签不能有这个值
- 1 -- 公钥加密 session key 包
- 2 -- 签名包
- 3 -- 对称 key 加密 session key 包
- 4 -- One-Pass签名包
- 5 -- key 包
- 6 -- 公钥包
- 7 -- secret 子 key 包
- 8 -- 压缩数据包
- 9 -- 对称加密数据包
- 10 -- 标记包
- 11 -- 文字数据包
- 12 -- 信任包
- 13 -- 用户ID包
- 14 -- 公共(public)子 key 数据包
在旧格式中,二进制值编码为 4 位(位 5 到 2),在新格式中,二进制值编码为 6 位(从 5 到 0)。
更多详细信息可以在RFC 2440中找到, 第 4 章。
关于javascript - 为什么同一个 GPG key 可以有两个不同的 ASCII 装甲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23679225/