CoderTools

Salsa20 加密

支持扩展 nonce 变体的高速流密码

客户端安全

所有加密解密操作都在您的浏览器本地执行,不会向任何服务器发送数据。

Salsa20:256 位流密码,64 位 nonce,20 轮运算。适用于大多数应用的快速安全加密。

初始块计数器值(加密通常为 0,解密使用相同值)

格式选项
🔒 100% 本地处理您的文件完全在浏览器中处理,不会上传到任何服务器。

关于 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。