Salsa20 是一种基于 Salsa20 的流密码算法,由 Daniel J. Bernstein 设计。它以其速度快、安全性高、实现简洁而闻名,广泛应用于安全通信、加密存储等场景。

在本章中,我们将深入剖析 Salsa20 加密算法的核心原理与实现细节。我们将从流密码的基础特性出发,逐步拆解其核心的 20 轮加密过程,详细分析其状态矩阵的构造、每轮的操作步骤以及最终的密钥流生成机制,全面理解 Salsa20的加密过程和安全性分析。

Salsa20 加密算法 😋

Salsa20 的核心原理基于一个 4x4 的状态矩阵,包含了常量、密钥、计数器和随机数。每轮加密过程中,算法通过一系列的加法、异或和位移操作来混合这些元素,从而生成一个伪随机的密钥流。这个密钥流随后与明文进行异或操作,产生密文。
Salsa20加密流程图

初始状态矩阵

Salsa20 的初始状态是一个 4×4 的 32 位无符号整数矩阵(共 512 位),由固定常量(”expand 32-byte k” 的 ASCII 编码)、256 位密钥、计数器、随机数(nonce) 四部分按固定位置填充构成:

其中:

  • $c_0, c_1, c_2, c_3$ 是常量,分别对应 “expa”, “nd 3”, “2-by”, “te k” 的 ASCII 编码。
  • $k_0, k_1, k_2, k_3, k_4, k_5, k_6, k_7$ 是密钥的 8 个 32 位部分。
  • $n_0, n_1$ 是随机数(nonce)的 2 个 32 位部分。
  • $t_0, t_1$ 是计数器的 2 个 32 位部分。

QR(Quarter Round) 操作

上图中的所谓 “置换” 并不是简单的矩阵转置,而是指对状态矩阵进行一系列的 QR(Quarter Round)操作。QR 函数对 4 个 32 比特的单词( $a$、$b$、$c$ 和 $d$)进行变形:

符号 $\lll$ 指的是单词向左移动一定比特,移动的位数可以为 1 到 31 之间的任何值(对于32比特的单词来说)。符号 $\oplus$ 是按位异或操作,符号 $+$ 是无符号整数的加法。

20 轮加密过程

Salsa20 的加密过程包含 20 轮,每轮由 4 个 QR 操作组成,分别作用于状态矩阵的不同部分。每轮结束后,状态矩阵会被更新,最终生成一个新的状态矩阵。

规则是奇数轮对列进行 QR 操作,偶数轮对行进行 QR 操作。

列操作:

行操作:

细心的同学可能会有疑问,明明列操作是作用与矩阵的行上的,行操作是作用于矩阵的列上的,为什么叫列操作和行操作呢?这是因为命名看的是「扩散目标方向」,不是「操作时的分组方向」,这是 Salsa20 独有的历史设计遗留问题。 🤫

密钥流生成与加密

经过 20 轮后,最终的状态矩阵会与初始状态矩阵进行逐位相加,每一位都模 $2^{32}$,得到一个新的状态矩阵。这个新的状态矩阵 512 位(16 个 32 位单词)就是生成的密钥流。最后,密钥流与明文进行异或操作,得到密文。

当然,我们加密过程中,不一定要一次性处理所有的明文数据。Salsa20 允许我们分块处理明文,每次生成一个新的密钥流块(512 位),与对应的明文块进行异或操作,然后计数器递增,进入下一轮加密,直到所有明文都被加密完成。

ChaCha20 加密算法 😇

ChaCha20 是 Salsa20 的一个变体,由同一位设计者 Daniel J. Bernstein 开发。它解决了原算法扩散效率、硬件适配性等问题,被纳入 IETF 标准(RFC 7539),广泛应用于 TLS 1.3、WireGuard、SSH 等主流安全协议。

ChaCha20 的核心原理与 Salsa20 类似,仍然基于一个 4x4 的状态矩阵和 QR 操作,但在每轮的操作顺序和参数选择上进行了优化,以提高安全性和性能。ChaCha20 的加密过程同样包含 20 轮,每轮由 4 个 QR 操作组成,但它采用了不同的操作顺序和参数设置,使得算法更适合现代处理器架构,具有更好的性能表现。

初始状态矩阵

ChaCha20 的初始状态矩阵与 Salsa20 类似,也是一个 4×4 的 32 位无符号整数矩阵,但计数器的设置有所不同, ChaCha20 只有 1个 32 位的计数器:

其中:

  • $c_0, c_1, c_2, c_3$ 是常量,分别对应 “expa”, “nd 32”, “-byte”, “ k” 的 ASCII 编码。
  • $k_0, k_1, k_2, k_3, k_4, k_5, k_6, k_7$ 是密钥的 8 个 32 位部分。
  • $t_0$ 是计数器的 32 位部分。
  • $n_0, n_1, n_2$ 是随机数(nonce)的 3 个 32 位部分。

QR(Quarter Round) 操作

ChaCha20 的 QR 操作与 Salsa20 类似,但在每轮的操作上进行了优化,以提高安全性和性能。ChaCha20 的加密过程同样包含 20 轮,每轮由 4 个 QR 操作组成,但它采用了不同的操作,奇数轮对列进行 QR 操作,偶数轮对对角线进行 QR 操作。

列操作和 Salsa20 一致,对角线操作如下:

什么!明明和前面的行操作一样,为什么叫对角线操作?这是因为一开始设计的时候,ChaCha20 的操作顺序是按照顺序进行的,后来为了兼容 Salsa20 的命名习惯,才把它叫做对角线操作了,这也是 ChaCha20 独有的历史设计遗留问题。 🤫

剩下的部分和 Salsa20 基本一致,就不多说了。

上一章:加解密模式分析 - RC4 加密算法 👈
下一章:加解密模式分析 - DES 加密算法 👈
回到开始:关于我 👈

相关链接: