纸飞机从 2013 年起便使用自研的 MTProto 2.0 协议处理所有客户端与服务器之间的通信。这一协议并非基于现成的 TLS 握手流程,而是针对移动网络高延迟、连接频繁切换的场景重新设计。密钥协商阶段采用 Diffie-Hellman 密钥交换,每次会话都会独立生成一对临时密钥,前向安全性由此而来。
在数据传输阶段,消息体使用 AES-256 加密,并按 4KB 分片处理,单个分片损坏不会影响整条消息。服务器只存储加密后的分片,永远无法读取明文内容。如果你希望获得更高级别的保护,可以选择“秘密聊天”模式:消息在客户端生成密钥后,全程使用端到端加密,服务器既不存储也不转发,连元数据都会被最小化处理。
下面是一段简化的密钥交换伪代码,描述了客户端与服务端建立安全会话的核心步骤:
// MTProto 2.0 握手(简化示意)
client.generate_keypair() {
a = random(2048-bit)
A = g^a mod p // 公开参数
return (a, A)
}
server.receive(A) {
b = random(2048-bit)
B = g^b mod p
shared_key = A^b mod p // 双方获得相同密钥
return B
}
// 后续所有消息均使用 shared_key 派生
// 的 AES-256 密钥进行加密传输
我个人用纸飞机将近三年,最让我放心的不是花哨功能,而是消息真的不会丢。出差到网络条件差的地方,重新连上后未读消息会按时间顺序完整同步,不会出现“消息漏发”或“顺序错乱”的情况。这种稳定性是协议层在背后撑着的。