javascript - 为什么同一个 GPG key 可以有两个不同的 ASCII 装甲?

标签 javascript web-services security pki gnupg

我正在尝试使用 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/

相关文章:

javascript - 测试异步/等待方法。 Jest 在单元测试中未捕获异常

java - 将给定方法公开为 Web 服务的最简单方法 - 结果必须可在 Java 5 下的 Web 容器中运行

MySql - 删除多个表中的相同字段

c# - ASP.NET 表单例份验证漏洞

javascript - HTML5 表单必需属性。设置自定义验证消息?

JavaScript 在展开和折叠时在 Accordion 上切换图标

javascript - 从函数打开 Jquery fancybox

java - 如何在 jax-ws 中调用以持有者作为参数的 Web 服务

java - 清理 java 服务器的 json 输入

javascript - 保护 Websocket 的安全