只有你和你写给的人读得到

Cryptico 是一款匿名通讯工具,支持网页、Android 与 iPhone:没有手机号,没有邮箱,没有真实姓名。每一条消息都经过端到端加密,而即便我们想解开,服务器的代码也做不到。

无需注册,无需手机号,浏览器里直接打开。

宽浏览器窗口中的网页客户端:左侧是聊天列表,右侧是一个已打开的群组对话。

账户是一串词,不是一个人

注册时你什么都不用交。Cryptico 会生成一个随机身份和一组十二个词的恢复短语,这组短语就是账户本身——你所有的密钥都由它推导而来。没有号码要验证,没有地址要确认,也没有任何资料能把这一切指回你。用户名是可选的:想被人找到就取一个,不想就不取。

01

四件我们真站得住脚的事

  • 01

    服务器读不到你的消息

    这是构建方式决定的,不是一条政策。服务器程序根本没有编译进消息正文的定义,因此它内部不存在任何能解开消息的代码路径。我们流水线里有一项检查:一旦这条不再成立,构建就会失败。

    check-proto-content-boundary.mjs
  • 02

    永远没有现实世界的身份标识

    没有手机号,没有邮箱,没有真实姓名——应用里没有,数据库里没有,协议里也没有。有一项自动检查会驳回任何添加它们的改动。名片草稿里曾经混进过一个手机号字段;它被删掉了,那个位置也被永久废弃。

    check-forbidden-columns.mjs
  • 03

    Signal Protocol,配以抗量子密钥协商

    握手用 PQXDH,消息用 Double Ratchet,群组用 Sender Keys。每一次会话都在经典算法之上再加一次抗量子的 Kyber-1024 交换——不是可选项,而是每一次握手都做——所以今天被记录下来的流量,不会因为将来出现量子计算机而变得可读。握手之后的部分仍是常规密码学,所以我们说的是抗量子的密钥协商,而不是声称全程如此。

    libsignal · PQXDH · Kyber-1024
  • 04

    连我们自己的服务器也听不到的通话

    一对一通话在设备之间直接进行,没有任何服务器碰到媒体流。群组通话会经过我们的媒体服务器,但每一帧在抵达之前就已加密,而那台服务器永远拿不到密钥。一项构建检查会把通话媒体密钥彻底挡在服务器代码之外。

    check-call-media-key-boundary.mjs
02

你能用它做些什么

这是一款通讯工具,不是一个演示。这份清单上的每一项都已在产品里,并且出现在每一个用得上它的平台上。

  • 聊天就该有的样子

    文字消息支持提及、回复、编辑、为所有人删除、表情回应、转发、多选和个人收藏。送达与已读回执、正在输入提示、草稿、单个聊天内搜索以及全局搜索。纯文字不够用时,还有投票、清单、地图位置和名片。

  • 最多 128 人的群组

    创建群组,添加和移除成员,用带有效期和使用次数上限的链接邀请,提及某一个人或所有人。服务器负责把消息分发出去,却始终不知道群组的名称、简介,也不知道你以谁命名了它。

  • 文件、照片与语音

    八种附件,每个最大 100 MiB——照片、视频、语音消息、视频留言、文件、GIF、贴纸、音频——并支持相册与剧透遮罩。每个文件都在你的设备上用一把一次性密钥锁好,打开前还会校验是否被篡改。

  • 通讯工具内的小程序

    有目录、一键安装和沙箱运行环境,另有开发者控制台和匿名举报按钮。校验和与清单对不上的小程序,根本不会启动。

  • 真正拦得住的拉黑

    在私聊中,被拉黑的人发来的消息永远到不了你这里,而他们也不会知道消息没送到。一次拉黑持续 180 天,对方每尝试发一次消息就顺延一次。

  • 一个账户最多十台设备

    用恢复短语关联新设备,查看完整列表,随时解除任何一台的关联——即便你手上已经没有可用会话,也能解除其中一台。联系人、文件夹、聊天列表、黑名单和设置都会加密同步过去。你的消息存档大部分不会;这一条写在「我们不承诺什么」里。

03

一对一通话与群组通话

语音与视频、前后置摄像头切换、最多同时 8 个视频画面、举手、共享屏幕,每个画面上都有麦克风与摄像头指示。媒体流默认走中继,所以对方看不到你的地址。

四人参与的群组通话,其中一人举起了手。手机上的群组通话。
04

文件夹、置顶与安静的聊天

基于规则的文件夹、置顶聊天、免打扰聊天、共享媒体视图,还有一条如实告诉你连接状况的横幅。免打扰的聊天里,提及仍然会通知你——这一点是刻意为之。

文件夹编辑器,以及决定哪些聊天归入其中的筛选规则。手机上的聊天列表,以及新建群组的页面。
05

它到底是怎么运作的

给愿意亲自核对而不是选择相信的人看的简版说明。

隐私设置:已读回执、PIN 码和自动锁定计时。手机上的隐私设置:生物识别解锁、自动锁定,以及用于核验联系人的安全码。
握手
PQXDH:Curve25519 加上一枚 Kyber-1024 预密钥,每一次会话都用,因此从第一条消息起密钥协商就是抗量子的。
消息
Double Ratchet:每发一条消息,密钥就向前推进一步,所以事后拿到的密钥打不开此前的内容。
群组
Sender Keys,最多 128 名成员。服务器知道成员名单,因为它必须据此分发消息;但它不知道群组的名称。
群组通话
画面在抵达我们的媒体服务器之前就已加密。密钥由发起通话的那台设备生成,经由通讯工具本身分发,并在有人加入或离开时轮换。
文件与照片
AES-256-GCM,每个文件一把新密钥,随加密信封一同送达,解密前还要通过一次 SHA-256 校验。存储端只持有它读不懂的字节。
在你的设备上
本地消息数据库静态加密——Android 与 iPhone 上用 SQLCipher,浏览器里用 AES-256-GCM。
你的恢复短语
十二个词。账户的每一把密钥都由它推导:先 BIP39,再用 Argon2id,每猜一次都要 64 MiB 内存和三轮运算,暴力破解因此不划算。服务器不保留任何能反推它的东西。
核验对方身份
每个会话有一个 60 位数字的安全码,通话中还会显示一个 6 位数字的验证码,由你们其中一人念出来。通话验证码只由这一次连接算出,所以每次都不一样。
应用锁
一个 4 位 PIN 码,外面裹着 Argon2id 与 AES-256-GCM,最多 5 次尝试,设备支持时可用生物识别,闲置后自动锁定。PIN 码打开的是设备;账户属于那组短语。
设置与联系人
以密文同步,密钥由你的恢复短语推导——连每条记录的名称都是带密钥的哈希,而不是明文。服务器存的是看不懂的数据块,不是字段。
使用的库
Android 与 iPhone 使用 Signal 的官方库。Signal 根本没有为浏览器发布任何构建版本,所以我们自己从 Signal 的源码编译网页端引擎,锁定到确切版本——只改了一行让它能在这里编译通过,密码学部分一处未动。
06

我们不承诺什么

每一款通讯工具的首页都会告诉你它保护了什么。这一页还会告诉你它没能保护什么,因为我们修不好的那部分,恰恰是你最需要知道的。

  • 我们能看到谁在和谁说话

    端到端加密隐藏的是你说了什么,而不是你说过话这个事实。为了把消息送到,服务器必须知道谁在接收、什么时候接收。它还会保存群组成员名单,因为没有它就无法分发。我们没法诚实地宣称自己不知道谁在和谁说话。我们能宣称的是:我们从不接触内容,而且服务器代码连解析都做不到。

  • 推送通知会把时间信息泄露给 Google 和 Apple

    Android 的通知经由 Firebase Cloud Messaging,iPhone 的经由 Apple 的服务。推送本身不带文本、也不带发送者——但转发方能看到哪台设备在什么时刻被唤醒,仅凭时间关联就足以还原出谁在和谁说话。只要唤醒通道还掌握在别人的服务手里,账户的匿名性就覆盖不到「通信发生过、发生在何时」这件事。

  • 你的历史记录几乎跟不过来

    在新设备上登录,会恢复你的身份、资料、联系人、文件夹、聊天列表、黑名单和部分设置——但不包括消息存档。与你聊天的人会重新发来浅浅的一层,最多回溯 30 天,仅此而已。服务器端不存在你的历史备份,这是设计使然。

  • 丢了短语,谁也帮不了你

    客服无法让你重新进入账户,因为我们这边根本没有可以凭借的东西——没有号码,没有地址,没有密码提示。十二个词就是账户的全部。这是这一页上其余内容的代价,我们宁愿你在注册前就知道,而不是之后。

  • 我们保留日志,只是里面没有你

    我们保留运维服务日志,其中没有消息内容、没有密文正文、没有密钥,也没有恢复短语。说「完全不记录任何日志」是假话;说「日志里没有内容」是真的,我们承诺的正是后者。

07

在哪里可以用

手机上打开的一个群组对话。手机上的群组通话。手机上的邀请页面,显示一个二维码和一个可以转交的邀请码。
08

大家真正会问的问题

要多少钱?

不要钱。没有付费档位,没有广告,也没有增值推销——限制只有技术上的,比如每个文件 100 MiB、单个文件存储 30 天。如果哪天真的出现付费档位,我们会在它出现之前说明,而不是之后。

代码是公开的吗?

还没有。等开发稳定下来就会公开。在那一天到来之前,我们不会自称 open source——你无从核实这个说法,我们也不打算请你凭信任接受它。仓库公开之时,地址就会写在这里。

如果我弄丢了恢复短语会怎样?

账户就没了。没有重置链接,客服也没有办法让你重新进入——一条由我们掌控的恢复通道,同样会成为别人进来的通道。

谁可以给我发消息?

对方需要你的用户名、你给出的邀请链接,或者你的二维码。如果你压根不想被人找到,就别取用户名。你可以拉黑任何人,被拉黑的人就再也联系不到你。

我能确认自己在和正确的人说话吗?

可以,有两种方式。每个会话都有一个 60 位数字的安全码,双方可以核对一次;通话时两边屏幕会显示同一个 6 位数字的验证码——一人念出来,另一人核对。通话验证码每次通话都是新的。

我可以在多台设备上使用吗?

可以,最多十台。每一台都用恢复短语关联,也都能从列表里解除关联。联系人、文件夹、聊天列表和设置会加密同步过去;你的消息存档大部分不会。

你们会给我画像或者卖数据吗?

没有广告,也不出售数据。这个页面完全没有统计分析,也没有任何第三方脚本——没有一个请求会发往别人的服务器。

做好了就告诉我

等到真有值得安装的东西那天,我们只发一封信。没有周报,没有连环邮件,也不经过第三方邮件服务——地址留在我们自己的数据库里,不会去往别处。

我们不会发确认信,所以填错了就只会是一片安静。提交前请检查一遍地址。