PGP Suite

生成密钥对、加密一条消息、解密一条消息、为一段文字签名让任何人都能证明它来自你、验证别人发来的签名、在信任一个密钥之前先检查它——人们实际打开 GnuPG 要做的五件事,不用命令行。全部操作都在本浏览器标签页内本地运行:你的私钥和口令从不上传、从不记录、从不离开你的设备,因为一个让你把私钥粘贴到服务器上的工具,已经输掉了它唯一重要的考试。关掉标签页,密钥随之消失——离开之前先保存你生成的东西。

生成密钥对

Curve25519 是现代默认选择:密钥小、运算快,也是当前 GnuPG 为新密钥所做的选择。只有当对方工具老到需要它时才选 RSA-4096。口令用于加密静止状态下的私钥——只要你打算把密钥存到任何地方,就设一个。

口令从不离开这个标签页。设了又忘记,私钥便无法恢复——我们不行,任何人都不行。

加密消息

粘贴收件人的公钥和消息。只有匹配的私钥能打开加密结果,所以密文可以经由你不信任的渠道发送。

解密消息

粘贴你的私钥、它的口令,以及加密消息。明文只出现在这里,别处不会出现——它不会被存储,关标签页之前先复制好。

签名与验证

明文签名让消息保持可读,同时让任何持有你公钥的人都能证明它出自你手且未被改动。在左侧用你的私钥签名;在右侧用签名者的公钥验证一条已签名消息。

检查密钥

在用别人给你的密钥加密之前,先看看它:它声称属于谁、用的什么算法、何时创建、是否过期,以及要在带外比对的指纹——通过电话、当面、任何不是递送密钥那个渠道的方式。

本工具由 OpenPGP.js 驱动,未经修改,依 GNU 宽通用公共许可证 v3.0 或更高版本(LGPL-3.0-or-later)使用。完整源代码见 OpenPGP.js 仓库。

为什么这件事在浏览器里做,以及它做不到什么

PGP 存活了三十年,是因为它的信任模型不需要服务器:密钥由其所有者生成,加密在发送者的机器上完成,解密在收件人的机器上完成。每一个打破这种形态的网页表单——上传你的私钥、我们来帮你解密——都重新引入了 PGP 本要移除的中间人,所以本套件反其道而行:OpenPGP.js 库作为代码下载一次,然后你的密钥、口令、明文和密文都由这段代码在你的标签页中处理,从不传输。这里同样没有账户、没有密钥托管。在上方生成的密钥,在你保存之前只存在于它出现于其中的文本框里;诚实的工作流是:下载两半,把私钥存放在加密的地方,把公钥发布到人们会找你的地方,并把任何声称“帮你在线保管密钥”的服务当作威胁而非补救。配套指南不用命令行的 PGP 加密完整走了一遍这套流程,包括在第一条消息之前如何核对指纹。

诚实的限制与功能同样重要。本页面只制作明文签名——它不为文件做分离签名,也不加密文件,因为文件工具同样绝不能上传其输入,那值得单独一页,而不是临时拼凑。它不管理密钥环、不从密钥服务器取钥、也不检查吊销:在这里检查的密钥就是粘贴进来的那个密钥,其指纹才是要在别处核对的部分。它也救不回丢失的口令——没有恢复机制,这是设计使然。在套件周围,相邻的工具负责相邻的工作:证书与密钥匹配器为 TLS 证书做同样的配对检查,密码生成器能生成你的私钥值得拥有的强而唯一的口令——两者和本页面一样,都不让任何东西离开你的浏览器。

常见问题

把私钥粘贴到这里真的安全吗?

在本页面,是的——理由是架构性的,不是口头承诺。本页面在解密或签名时不发出任何网络请求:OpenPGP.js 代码在你的浏览器标签页中运行,密钥在内存中使用,从不传输、存储或记录。你可以自己验证:加载页面、断网,一切照常工作。这与服务器端的“在线 PGP”表单是完全不同的物种——在那里,密钥真的会去到别人的机器上;凡是要紧的密钥,永远不要那样用。

Curve25519 还是 RSA-4096 — 应该生成哪种?

新用途一律选 Curve25519。它是当前 GnuPG 与 OpenPGP.js 的默认,密钥和签名都要小得多,生成是即时的,而不是几秒钟的素数搜寻,也没有 RSA 弱参数的坑。RSA-4096 在这里是为兼容而留的:非常老的邮件插件、遗留的 HSM 工作流和少数企业工具仍然读不了椭圆曲线密钥。如果你不确定自己需不需要 RSA,那就是不需要。

忘了私钥口令会怎么样?

密钥就此丢失。口令加密的是私钥材料本身,没有它,任何人都做不了这道数学题——本站做不到(它从未见过口令)、OpenPGP.js 做不到、GnuPG 也做不到。这种不可挽回正是安全机制在按设计工作。生成一对新密钥、发布新公钥;如果失去访问的代价很大,把口令存进密码管理器——用同类本地工具生成,而不是靠记忆复用。

验证说签名不匹配。这是什么意思?

这意味着你面前的消息与被签名的消息不是逐比特相同的那一条——或者签名块本身在传输中被损坏了。邮件客户端和聊天工具会重新折行、转换破折号、吞掉行尾空白,而明文签名覆盖的是确切的字节,所以传输损坏是最常见的原因;故意改动在验证者看来与此完全一样,这正是签名的意义所在。请对方以文件附件形式重发消息;若内容要紧,再通过带外渠道比对指纹。

能用我已有的密钥吗 — 来自 GnuPG、Mailvelope 或密钥服务器的?

可以。导出 ASCII 装甲块(公钥用 gpg --armor --export [email protected],私钥用 --export-secret-keys),粘贴到本页面的任何位置即可;检查器也能读取其他 OpenPGP 软件生成的密钥,因为格式是标准,而不是本站的发明。反之亦然:在这里生成的密钥能干净地导入 GnuPG 及每个兼容客户端,所以你在这里做的任何东西都不会把你锁死。