公钥加密基础:安全共享的工作原理
学习公钥加密的基础知识以及它如何实现陌生人之间的安全文件共享。RSA、Diffie-Hellman详解。
公钥加密——也称非对称加密——使用两个数学上相关联的密钥:一个可以随意分发的公钥,以及一个严格保管的私钥。用我的公钥加密的内容,只有我的私钥能读取。这解决了密码学中最古老的难题:两个从未谋面的陌生人如何通过公开渠道共享秘密。1976 年由 Diffie 和 Hellman 发明,1977 年由 RSA 付诸实践,如今它是 TLS 1.3、Signal、SSH、Ed25519 代码签名以及每一种用户身份验证文件传输服务的基础。下面解释它的实际工作原理。
数学陷门函数
所有公钥加密都依赖"陷门"函数——正向计算容易,但在没有额外信息的情况下逆向几乎不可能。两大主流体系:
- 整数分解(RSA):将两个大素数相乘非常容易;将乘积分解回两个素数则是指数级困难的。2048 位 RSA 密钥使用两个约 1024 位的素数。目前最佳的攻击方法——一般数域筛——需要约 2^112 次运算,超出了所有实际攻击能力。
- 椭圆曲线上的离散对数(ECDH、ECDSA、Ed25519):在曲线上做点乘法很快,逆向推出乘数则极难。Curve25519 等 256 位曲线提供的安全性相当于 3072 位 RSA 密钥。
量子计算机通过 Shor 算法可以轻松破解这两类问题,这正是 NIST 于 2024 年在 FIPS 203–205 中标准化后量子替代方案(ML-KEM 和 ML-DSA)的原因。
RSA 的实现原理
Ron Rivest、Adi Shamir 和 Leonard Adleman 于 1977 年发表了 RSA,其方案设计优雅:
- 选取两个大素数
p和q。 - 计算
n = p × q(模数)和φ(n) = (p-1)(q-1)。 - 选取与
φ(n)互质的e,通常为 65537。 - 计算
d,使得e × d ≡ 1 (mod φ(n))。 - 公钥为
(n, e),私钥为(n, d)。
加密:密文 = 明文^e mod n。解密:明文 = 密文^d mod n。数学上的正确性来自欧拉定理。
现实中的 RSA 使用 OAEP 填充(RFC 8017)来防御选择密文攻击。教科书式的 RSA 是灾难性的不安全。RSA-2048 是新系统的当前最低标准;长期使用的密钥应选 RSA-3072 或 4096。
Diffie-Hellman:无需发送密钥共享秘密
RSA 允许你向已知收件方加密数据。Diffie-Hellman 做的是另一件事:让双方在公开渠道上推导出共享秘密,而无需任何一方发送该秘密本身。
经典版本(基于大素数模运算的 DH):
- 双方约定大素数
p和生成元g。 - Alice 选取秘密
a,发送A = g^a mod p。 - Bob 选取秘密
b,发送B = g^b mod p。 - Alice 计算
B^a mod p = g^(ab) mod p。 - Bob 计算
A^b mod p = g^(ab) mod p。
两人均得到 g^ab mod p,而从未发送过 a 或 b。窃听者看到 g、p、A、B,但要从 A 和 B 计算 g^ab 需要解决离散对数问题。
现代 DH 使用椭圆曲线(ECDH),X25519 是标准选择:32 字节密钥,32 字节共享秘密,并针对时序攻击进行了实现加固。
椭圆曲线为何胜出
RSA 感觉有些过时,因为它确实已经很老了。椭圆曲线密码学(ECC)出于三个实际原因取代了它:
- 密钥更短:256 位 EC 密钥提供与 3072 位 RSA 密钥相当的安全性,即 32 字节对比 384 字节。
- 运算更快:Curve25519 上的 ECDH 在现代 CPU 上约需 70 微秒,而 RSA-3072 密钥生成需要数秒。
- 对弱随机数更具抵抗力:Ed25519 是确定性的——签名不需要每次独立的随机数,避免了 2010 年索尼 PS3 ECDSA 事件(常数随机数导致主密钥泄露)那样的灾难。
NIST 曲线(P-256、P-384、P-521)得到广泛支持,但一些密码学家因其含义不明的常数而历来持保留态度。Daniel Bernstein 设计的 Curve25519 和 Ed25519 是现代默认选择,被 TLS 1.3、WireGuard、Signal 和 SSH 采用。
签名:证明是谁发送了什么
公钥加密能做到对称加密做不到的事:证明作者身份。签名将加密的角色颠倒过来——你用私钥"加密"(签名),任何持有你公钥的人都能"解密"(验证)。验证通过,说明你持有该私钥。
真实的签名使用哈希函数处理任意大小的消息:
- 计算
h = SHA-256(消息)。 - 用私钥对
h签名(RSA-PSS、ECDSA 或 Ed25519)。 - 验证方对收到的消息进行哈希,与签名一起用公钥验证。
应用场景:TLS 证书(CA 对站点公钥签名)、代码签名(Apple 公证、Microsoft Authenticode)、Git 提交签名、软件包管理器(apt、Homebrew、npm)。
文件传输中公钥加密的应用
对于基于匿名链接的传输(SwissTransfer、HexaTransfer),公钥加密通常不直接出现——URL 片段中的随机对称密钥处理了所有事务。但对于账号型服务,公钥至关重要:
- TLS 1.3 服务器认证:每个 HTTPS 连接都从服务器证书开始,通过 CA 链验证,然后临时 ECDHE 密钥交换派生会话密钥。
- 账号间加密:Tresorit、Proton Drive 和 Mega 在注册时为每个用户生成密钥对,账号间共享的文件使用收件方的公钥包裹。
- 客户端和更新的签名验证:桌面应用通过 Ed25519 或 RSA 签名验证更新,防止供应链攻击。
- 无密码认证:WebAuthn 和 Passkey 使用存储在安全硬件(Touch ID、Windows Hello、YubiKey)中的 EC 密钥。
密钥分发:尚存的难题
公钥加密解决了一个密钥分发问题,却带来了另一个:你如何确定一个公钥确实属于它声称的持有者?三种模型:
- PKI(公钥基础设施):证书颁发机构对公钥签名。TLS 采用此方式,根证书内置于 Chrome、Firefox、Safari 中。
- 信任网络:PGP 的方式——用户互相为对方的密钥签名。灵活但扩展性问题限制了其普及。
- 首次使用信任(TOFU):SSH 的方式——第一次接受密钥,若密钥发生变化则发出警告。简单但容易受到初始截获攻击。
- 密钥透明度:基于 Merkle 树日志,所有公钥均可公开审计。WhatsApp、iMessage 联系人密钥验证和现代 Passkey 系统均采用此方式。
对于向陌生收件方发送文件的场景,URL 片段分享完全绕过了这一问题——发送方通过链接直接将密钥给到收件方,可信度取决于分享链接所用渠道的安全性。
量子计算带来的变化
运行 Shor 算法的大型量子计算机可以同时破解 RSA 和椭圆曲线密码学。目前估计距离这一时间节点还有 10–20 年,但对于需要长期保密的数据,威胁是即刻存在的:"现在收集,以后解密"——攻击者今天记录加密流量,等到 2040 年再解密。
NIST 2024 年后量子标准:
- FIPS 203(ML-KEM)——替代 Diffie-Hellman/ECDH 用于密钥交换,基于格问题。
- FIPS 204(ML-DSA)——替代 RSA/ECDSA 用于签名。
- FIPS 205(SLH-DSA)——备用的基于哈希的签名方案。
Cloudflare 和 Google 现已在 TLS 1.3 密钥交换中支持 ML-KEM,文件传输服务将在未来几年跟进。对称加密(AES-256-GCM)基本不受影响——Grover 算法只将其有效强度减半。
综合运用
当前敏感传输的合理方案:TLS 1.3 配合 X25519 密钥交换保护连接,AES-256-GCM 处理批量加密,对于账号型服务使用 Curve25519 ECDH 包裹每个文件的密钥。基于链接的服务省去了账号层,以简单性换取便利。在正确实现的前提下,两种模型都能提供充分的安全保障。
在 hexatransfer.com 上试试 — 免费、无需注册、最多 10 GB。