ChaCha20 是一种性能出色、轻量级且高度安全的 256 位 流密码,用于加密和解密数据。ChaCha20 通常与 Poly1305 消息认证码相结合以创建 ChaCha20-Poly1305 加密算法。
ChaCha20-Poly1305 和 AES-GCM 是与 TLS 1.3 一起使用的唯二 推荐的对称密钥加密算法。依然安全但有些老旧的 openvpn 协议使用 AES 来保护数据,而新的轻量级 wireguard 协议选择使用 ChaCha20-Poly1305 来加密协议。
ChaCha20 由美国德国数学家、密码学家和计算机科学家 Daniel J. Bernstein 于 2008 年开发,基于 Bernstein 于 2005 年开发的早期密码——Salsa20。Bernstein 还创建了 ChaCha20 经常与之相结合的 Poly1305 通用哈希算法,以及用于保护 WireGuard 密钥交换的 Curve25519 椭圆曲线。
于十年前的 2014 年,google 就在其 chrome 浏览器中 部署了对使用 ChaCha20-Poly1305 的 TLS 密码套件的支持,现在所有主要浏览器都支持它。
ChaCha20 是一种对称密钥算法
与 AES 一样,ChaCha20 使用相同的密钥用于加密和解密数据 (有时会在两个密钥之间有一个简单的转换,但它们总是派生自相同的密钥)。
这与非对称密钥算法形成对比,例如 RSA 加密算法,后者使用单独的公钥和私钥。也称为 公钥密码学,这些算法允许通过广泛提供公钥,以供他人加密数据的方式,实现在场景内安全地共享数据,但只能使用正确的私钥解密。
非对称密钥算法需要很高的计算能力,这使它们相对缓慢,因此最适合加密少量数据。例如,RSA 用于执行与 HTTPS 网站连接时发生的 TLS 密钥交换。
WireGuard 和现代 TLS 密码套件使用一种新的方法——椭圆曲线密码术 (ECC)来保护密钥交换的非对称密钥加密。虽然比 RSA 等传统算法更有效,但它的性能仍然相对缓慢。
但在另一方面,ChaCha20 等对称密钥算法比非对称密钥密码,仅需要更少的处理性能 (通常被认为快约 1000 倍)。这使它们非常适合加密大量数据。
因此当需要在场景内 (例如通过互联网) 传输大量数据时,会使用对称密钥算法加密数据本身,而使用非对称密钥算法保护密钥交换。
在 TLS (以及 OpenVPN) 的情况下,对称密钥算法通常是 AES,密钥交换使用 RSA 证书。而对于 WireGuard,ChaCha20 用于对称密钥加密,Curve25519 用于保护密钥交换。
ChaCha20 通常与 Poly1305 相结合
Poly1305 是一种通用哈希算法,ChaCha20 经常使用它来认证数据——即发送方和接收方之间共享密钥确保数据在传输过程中没有改变。
这就是为什么在一起使用时,ChaCha20-Poly130 称为 认证加密 (AEAD) 算法。尽管使用的计算方式不同,但概念与 AES 使用的 Galois/counter (GCM) 模式非常相似 (后者也是 AEAD 算法)。
ChaCha20 与 AES 比较
正如我们所见,ChaCha20 对于比较旧但部分场景使用更多的 AES (ChaCha20-Poly1305 和 AES-GCM) 发挥着非常相似的作用。那么哪一个更好呢?
安全性
传奇密码学家 Bruce Schneier 曾经 说过「密码学就是安全的边界。如果能破解 n 轮密码,那你就设计 2n 或 3n 轮的密码」。 AES 和 ChaCha20 都使用 多轮 加密数据,每轮由一系列算法计算操作组成。
AES-256 使用 14 轮,而 ChaCha20 使用 20 轮。轮数本身无法进行有意义的比较,但在具有重大影响力的论文 Too Much Crypto 中,作者提出「算法在多少轮后就已经具有可信任的可靠性,认为它不会受到攻击,更不用说被破解了 (propose numbers of rounds for which we have strong confidence that the algorithm will never be wounded, let alone broken) 」。 作者在结论中推荐 AES-256 仅需要 11 轮 (而不是默认使用的 14 轮),而 ChaCha20 更仅需要 8 轮 (而不是默认使用的 20 轮)。
这意味着 ChaCha20 比 AES-256 有更高的安全边界。 当然,论文作者对于推导出建议的计算轮数后,也指明,「从实现的轮数可以明显看出,这样的攻击只是一个密码分析测试,不影响 ChaCha20 和 AES-256 的实际安全性 (From these surrealist figures, it is obvious that such an attack is only a cryptanalysis exercise and does not have much to do with the real security of AES)」。 换句话说,从算法上看,目前的实际应用中,AES 和 ChaCha20 都足够安全。
但是 AES 是否在其他方面存在漏洞呢?
已知 AES 对 时序攻击存在漏洞,在这种攻击中,通过记录计算密钥执行操作所需的时间,来判断并减少暴力攻击所需的组合数量 (尽管有多种方法可以预防这种攻击)。
但对于 ChaCha20 的加密方案,由于使用 add-rotate-xor (块加密) 分块加密,对此类时序攻击的抵抗能力要强太多。 当然都非常理论化。当前正确实现的 AES 和 AES-GCM 依然被大多数认为是无法破解的。
性能
AES 性能通常通过在现代处理器中内置 AES-NI (专门的硬件指令) 硬件支持来提升。然而,即使有了支持,虽然可能相差不是非常大,ChaCha20 通常依然会提供比 AES 更好的性能。
当硬件不支持 AES-NI 加速时,尤其是在一些不支持该技术的 ARM 芯片上。ChaCha-Poly1305 更能获取最大的性能提升,可以提供更高效和更快的加密、解密操作,成为这些情况下的首选加密方式。
什么是 XChaCha20?
加密随机数是一个只使用一次的任意值,它往往是一个随机或伪随机数,以避免重放攻击。Nonce 也用于流密码以确保安全。如果需要使用相同的密钥加密一个以上的消息,就需要 Nonce 来确保不同的消息与该密钥加密的密钥流唯一。
eXtended-nonce ChaCa20 (即 XChaCha20) 是 ChaCha20 的一个变种,它使用 192 位随机数而不是 96 位随机数。这使得选择一个随机数明显更安全,因为它实际上不可能被重复使用。
然而,就 XChaCha20 而言,目前尚未有被正式认可的标准,最近一次试图制定标准的尝试是在 2020 年且失败了。这导致了这种稍微更安全的变种被采用得更为缓慢。
最后,我们选择 ChaCha20
ChaCha20 是一种安全且性能出色的对称密钥算法,它与更为熟知的 AES 算法(ChaCha20-Poly1305 与 AEA-GCM 相比)有着高度可比性。
ChaCha20 相对于 AES,可以获取一定优势,但目前大多数主要行业参与者,认为从 AES 切换过来,并没有足够的需求和利益。
然而,当 WireGuard vpn 协议选择传输数据时采用 ChaCha20-Poly1305 而非 AEA-GCM 加密,使得这种算法获取越来越多关注,这可能预示着该算法未来会有更加广泛应用。