Salsa20 加密
支持扩展 nonce 变体的高速流密码
客户端安全
所有加密解密操作都在您的浏览器本地执行,不会向任何服务器发送数据。
初始块计数器值(加密通常为 0,解密使用相同值)
关于 Salsa20
Salsa20 是 Daniel J. Bernstein 于 2005 年设计的流密码。它使用 256 位密钥和 64 位 nonce 生成密钥流,与明文异或得到密文。该密码专为软件实现的高性能而设计。
Salsa20 被提交到 eSTREAM 项目并被选为软件配置文件的最终候选。它是 ChaCha 密码家族的基础。
算法对比
| 算法 | 轮数 | Nonce 长度 | 速度 | 最佳用途 |
|---|---|---|---|---|
| Salsa20/20 | 20 | 64 bits (8 bytes) | 标准 | 通用加密,高安全性 |
| Salsa20/12 | 12 | 64 bits (8 bytes) | 快速 | 性能关键型应用 |
| Salsa20/8 | 8 | 64 bits (8 bytes) | 最快 | 最高速度场景 |
| XSalsa20 | 20 | 192 bits (24 bytes) | 标准 | 随机 nonce,NaCl/libsodium |
Salsa20 工作原理
Salsa20 在 4×4 的 32 位字矩阵(共 512 位)上运算。初始状态由密钥(256 位)、nonce(64 位)、计数器(64 位)和四个常量字组成,常量字形成字符串 'expand 32-byte k'。
核心函数应用 20 轮四分之一轮操作,仅使用加法-旋转-异或(ARX)运算。这使得 Salsa20 在软件中高效运行,并能抵抗时序攻击。
XSalsa20 使用 HSalsa20 将 nonce 扩展到 192 位,HSalsa20 从 nonce 的前 128 位派生子密钥,剩余 64 位作为实际 nonce。这允许安全的随机 nonce 生成。
轮数变体
- Salsa20/20(20 轮)- 提供完整安全裕度的标准变体。推荐用于大多数应用。
- Salsa20/12(12 轮)- eSTREAM 组合入选。在性能和安全性之间提供良好平衡。
- Salsa20/8(8 轮)- 最快变体。无已知实际攻击,但安全裕度降低。
主要特性
- 高性能:针对软件优化,在现代 CPU 上每字节仅需 3-4 个时钟周期
- 设计简洁:仅使用 ARX 运算,无需查找表即可轻松实现
- 常量时间:抵抗缓存时序侧信道攻击
- 大计数器:64 位计数器允许每个密钥-nonce 对加密最多 2^70 字节
- 扩展 Nonce:XSalsa20 的 192 位 nonce 支持随机 nonce 生成
安全注意事项
- 绝不要在相同密钥下重用 nonce - 这会完全破坏安全性
- Salsa20 仅提供加密,不提供认证 - 需要与 Poly1305 结合使用 AEAD
- 对于随机 nonce,使用 XSalsa20 以最小化碰撞概率
- 使用正确的 KDF(HKDF、Argon2)从密码派生密钥
实际应用
- NaCl/libsodium:XSalsa20-Poly1305 是默认的 AEAD 构造
- 加密工具:许多文件加密实用程序使用 Salsa20 变体
- 密码管理器:部分使用 Salsa20 加密存储的凭据
- 游戏引擎:用于网络游戏中的快速加密
参考资料
常见问题
Salsa20 和 ChaCha20 有什么区别?
ChaCha20 是 Salsa20 的改进版本,每轮具有更好的扩散性。ChaCha20 每轮能获得更好的安全性,因此成为了 IETF 标准。对于新项目,通常推荐使用 ChaCha20。
应该使用哪种轮数变体?
使用 Salsa20/20 获得最大安全性。Salsa20/12 在速度和安全性之间取得良好平衡。仅当性能绝对关键且威胁模型允许降低安全裕度时才使用 Salsa20/8。
什么时候应该使用 XSalsa20?
当需要生成随机 nonce 时使用 XSalsa20。其 192 位 nonce 空间使得随机生成时碰撞几乎不可能发生。标准 Salsa20 的 64 位 nonce 需要仔细的计数器管理。
没有认证的 Salsa20 安全吗?
单独的 Salsa20 仅提供机密性,不提供完整性。攻击者可以在不被检测的情况下修改密文。应始终与 Poly1305 或其他 MAC 结合使用以实现认证加密。
这个工具可以用于生产环境吗?
这个工具用于教育和开发目的。虽然实现遵循规范,但生产系统应使用经过审计的加密库,如 libsodium、OpenSSL 或平台提供的 API。