Fluxle Cipher:基于 SPN-ARX 混合架构的轻量级对称加密算法设计与实现

第一章:引言与设计初衷

1.1 项目背景

目前,AES(高级加密标准)依然是国际公认的主流分组密码算法,其在安全和性能上的平衡经受住了时间的考验。然而,在特定场景下——如轻量级嵌入式设备、对侧信道分析极度敏感的环境——传统的 S-Box 查表法实现往往面临缓存计时分析的风险,且代码体积较大。
Fluxle Cipher 的定位是一种融合了 SPN(代换置换网络)的扩散特性与 ARX(模加-循环移位-异或)的非线性特性的实验性算法。它旨在探索"无 S-Box"设计的安全边界,在保持代码极简的同时,提供足以抵御现代分析手段的安全强度。本算法的设计大量参考了 SHA-3 的置换理念,在此致敬 AES、SHA-3 以及 ChaCha20 等前辈算法。

1.2 设计哲学

  • 透明性原则:拒绝"魔术数字"。所有初始常量均有可溯源的语义解释,确保设计过程公开透明,无后门隐患。
  • 混合架构:采用 SPN-ARX 混合架构。利用 SPN 的 θ\thetaθ 扩散理念提供快速的全状态扩散,利用 ARX 的模加运算提供核心非线性安全边际。
  • 实现友好:针对现代 CPU 指令集(如循环移位指令)优化,摒弃查表法,从根本上防御缓存计时分析,实现天然的抗侧信道特性。

1.3 版权与开源声明

本算法基于 MIT 协议开源,允许任意商业与非商业使用、修改与分发。
风险警示

“Fluxle Cipher 目前处于学术研究与原型验证阶段。本人尚未委托任何权威第三方密码分析机构对其进行完整的安全性审计。虽然设计过程遵循了标准的密码学原则,但可能存在未知的弱点或漏洞。因此,严禁将本算法用于保护任何形式的高价值机密数据或生产环境中的关键资产。使用本代码的风险由使用者自行承担。”


第二章:算法数学规范

2.1 基础参数定义

  • 状态规模:128位(4个32位字),记为 S=(S0,S1,S2,S3)S = (S_0, S_1, S_2, S_3)S=(S0,S1,S2,S3)
  • 密钥规模:256位(8个32位字),支持高强度的安全冗余。
  • 轮数R=24R=24R=24。考虑到 ARX 结构非线性安全边际的复杂性,并参考 SHA-3 Keccak-p[1600, 24] 的轮数选择,我们保守地选择了 24 轮以确保足够的安全冗余。

2.2 状态表示的二元性

Fluxle Cipher 的核心设计巧妙地利用了状态的两种视角进行转换,这是理解算法运作机制的关键:

  1. 字视角:在 χ\chiχξ\xiξ 函数中,状态被视为 4 个独立的 32-bit 字。
    • 这主要服务于 ARX 运算。现代 CPU 的寄存器通常为 32 位或 64 位,这种视角允许我们将整个状态直接加载到寄存器中进行高效的算术运算,无需处理复杂的字节对齐问题。
    • 此时,状态更新主要体现为"行"内的运算。
  2. 字节矩阵视角:在 θ\thetaθϵ\epsilonϵ 函数中,状态被视为 4×44 \times 44×4 的字节矩阵 BBB
    • 映射规则:状态字 SiS_iSi 对应矩阵的第 iii 行。若采用大端序存储,SiS_iSi 的最高位字节 Si[3]S_{i[3]}Si[3] 对应矩阵元素 Bi,0B_{i,0}Bi,0,最低位字节 Si[0]S_{i[0]}Si[0] 对应 Bi,3B_{i,3}Bi,3
    • 这种视角打破了 32 位字的边界,允许我们在"列"和"对角线"维度上操作数据,从而实现跨字的扩散。

这种二元性使得 Fluxle 既能享受 ARX 的高效运算,又能拥有 SPN 结构优异的扩散性能。

优化版实现通过字内操作模拟字节矩阵视角,无需显式转换。


第三章:核心组件深度解析

3.1 扩散函数 θ\thetaθ (Theta)

作用:提供快速的线性扩散,使输入的微小变化迅速波及整个状态,属于自逆矩阵。

数学原理

设状态为 4×44 \times 44×4 字节矩阵 BBB,坐标 (x,y)(x, y)(x,y) 表示第 yyy 行第 xxx 列(x,y∈{0,1,2,3}x, y \in \{0,1,2,3\}x,y{0,1,2,3})。

步骤 1:奇偶校验计算
对于每一列 xxx,计算该列所有字节的汉明重量奇偶性:
Cx=⨁y=03popcount(B[x,y])mod  2C_x = \bigoplus_{y=0}^{3} \text{popcount}(B[x,y]) \mod 2Cx=y=03popcount(B[x,y])mod2
其中 popcount(z)\text{popcount}(z)popcount(z) 表示字节 zzz 中比特 1 的个数,⊕\oplus 表示异或运算。CxC_xCx 是一个比特值(0 或 1)。

步骤 2:对角线扩散
对每个位置 (x,y)(x, y)(x,y),计算扩散值:

Dx,y=Cx+1,y+1⊕Cx+2,y+2⊕Cx+3,y+3D_{x,y} = C_{x+1,y+1} \oplus C_{x+2,y+2} \oplus C_{x+3,y+3}Dx,y=Cx+1,y+1Cx+2,y+2Cx+3,y+3
其中下标运算均在 模 4 下进行。

步骤 3:状态更新
将 1-bit 的校验位扩展为 8-bit 掩码:
B′[x,y]=B[x,y]⊕(Dx,y×0xFF)B'[x,y] = B[x,y] \oplus (D_{x,y} \times 0xFF)B[x,y]=B[x,y](Dx,y×0xFF)
Dx,y=1D_{x,y} = 1Dx,y=1 时,B′[x,y]=B[x,y]⊕0xFFB'[x,y] = B[x,y] \oplus 0xFFB[x,y]=B[x,y]0xFF(翻转所有比特);
Dx,y=0D_{x,y} = 0Dx,y=0 时,B′[x,y]=B[x,y]B'[x,y] = B[x,y]B[x,y]=B[x,y](保持不变)。

自逆性证明
注意到 DxD_xDx 仅依赖于对角线 CCC 的奇偶性。
因为 B[x,y]×0xFFB[x, y]\times 0xFFB[x,y]×0xFF 不改变奇偶性,所以 θ(θ(B))=B\theta(\theta(B)) = Bθ(θ(B))=B,即 θ\thetaθ 是自逆的。

翻转字节(异或0xFF)不改变该字节的奇偶性(因为 popcount(x) mod 2 == popcount(~x) mod 2)。
扩散矩阵 D 的计算仅依赖于奇偶性矩阵 C。
因此,第一次应用 θ\thetaθ 后,奇偶性矩阵 C 不变,第二次应用θ会生成相同的 D,再次翻转相同字节,从而恢复原状态。

代码实现深度解析

对比 fluxle-debug.h(直观版)与 fluxle.h(优化版)的实现:
直观版实现
采用双重循环遍历字节矩阵,显式计算每个字节的 popcount,再通过模运算处理矩阵边界。逻辑清晰,但分支判断较多,效率较低,且容易引入侧信道泄露。

// 伪代码示意
for (int x = 0; x < 4; x++) {
    for (int y = 0; y < 4; y++) {
        if (D[x][y])
            B[x][y] = ~B[x][y]; // 分支判断
    }
}

优化版实现
利用 SWAR (SIMD within a Register) 技术进行极速计算:

  1. 并行奇偶计算:利用位运算 x ^= x >> 4... 并行计算 4 个字节的奇偶校验,生成掩码 0x01010101
    // 并行计算 4 字节的奇偶性
    uint32_t p = x;
    p ^= p >> 16;
    p ^= p >> 8;
    p ^= p >> 4;
    p &= 0x0F;  // 提取低4位
    // 现在 p 的每个字节包含该字节的 popcount 低4位
    // 继续计算奇偶性...
    
  2. 掩码生成技巧:利用 (d << 8) - d 快速计算 d * 0xFF
    • ddd 为奇偶校验位(0 或 1,扩展为 0x00...0x01...)时,(d << 8) - d 等价于 d * 255
    • d=1d=1d=1,结果为 0xFF;若 d=0d=0d=0,结果为 0x00
    • 这避免了分支判断,保证了常数时间执行,彻底消除了计时分析面。

3.2 行混淆函数 ξ\xiξ (Xi)

作用:字内部的比特扩散,实现横向扩散。
数学定义
Si←Si⊕(Si⋙3)⊕(Si⋙12)⊕(Si⋙16)⊕(Si⋙27)S_i \leftarrow S_i \oplus (S_i \ggg 3) \oplus (S_i \ggg 12) \oplus (S_i \ggg 16) \oplus (S_i \ggg 27)SiSi(Si3)(Si12)(Si16)(Si27)
其中 ⋙\ggg 表示 32 位循环右移。

移位量选择分析

移位量 (3,12,16,27)(3, 12, 16, 27)(3,12,16,27) 经过挑选,满足以下性质:
性质 1:差分唯一性
旋转常数 r1,r2,r3,r4r_1, r_2, r_3, r_4r1,r2,r3,r4 之间的所有差值 ri−rjr_i - r_jrirj(对于 i≠ji \neq ji=j)在模 32 下互不相同。

  • 证明概要:设集合 R={0,3,12,16,27}R = \{0, 3, 12, 16, 27\}R={0,3,12,16,27}(包含 r0=0r_0=0r0=0)。计算所有差值:
    3−0=3,12−0=12,16−0=16,27−0=2712−3=9,16−3=13,27−3=2416−12=4,27−12=1527−16=11 \begin{aligned} 3-0 &= 3, & 12-0 &= 12, & 16-0 &= 16, & 27-0 &= 27 \\ 12-3 &= 9, & 16-3 &= 13, & 27-3 &= 24 \\ 16-12 &= 4, & 27-12 &= 15 \\ 27-16 &= 11 \end{aligned} 3012316122716=3,=9,=4,=111201632712=12,=13,=15160273=16,=24270=27
    所有差值模 32 后为 {3,4,9,11,12,13,15,16,24,27}\{3, 4, 9, 11, 12, 13, 15, 16, 24, 27\}{3,4,9,11,12,13,15,16,24,27},无重复。因此 RRR 是一个 Sidon 集,分支数达到最优。
  • 性质 2:雪崩准则满足
    旋转常数满足 0=r0<r1<r2<r3<r4<320 = r_0 < r_1 < r_2 < r_3 < r_4 < 320=r0<r1<r2<r3<r4<32 时,定义间隔长度:
    d1=r1−r0=3d2=r2−r1=9d3=r3−r2=4d4=r4−r3=11d5=32−r4=5 \begin{aligned} d_1 &= r_1 - r_0 = 3 \\ d_2 &= r_2 - r_1 = 9 \\ d_3 &= r_3 - r_2 = 4 \\ d_4 &= r_4 - r_3 = 11 \\ d_5 &= 32 - r_4 = 5 \\ \end{aligned} d1d2d3d4d5=r1r0=3=r2r1=9=r3r2=4=r4r3=11=32r4=5
    当输入字有一个字节为 0xFF0xFF0xFF 时,ξ(S)\xi(S)ξ(S) 满足 SAC(严格雪崩准则)的必要条件是:
    ∑i=15max⁡(0,di−8)=4\sum_{i=1}^{5} \max(0, d_i - 8) = 4i=15max(0,di8)=4
    验证
    max⁡(0,3−8)+max⁡(0,9−8)+max⁡(0,4−8)+max⁡(0,11−8)=0+1+0+3=4\max(0, 3-8) + \max(0, 9-8) + \max(0, 4-8) + \max(0, 11-8) = 0 + 1 + 0 + 3 = 4max(0,38)+max(0,98)+max(0,48)+max(0,118)=0+1+0+3=4
    符合性质2。
满秩证明

ξ\xiξ 的变换是:
Y=X⊕rotr(X,3)⊕rotr(X,12)⊕rotr(X,16)⊕rotr(X,27)Y = X \oplus \text{rotr}(X, 3) \oplus \text{rotr}(X, 12) \oplus \text{rotr}(X, 16) \oplus \text{rotr}(X, 27)Y=Xrotr(X,3)rotr(X,12)rotr(X,16)rotr(X,27)
这是一个线性变换(在 F2\mathbb{F}_2F2 域上),可以写成矩阵形式 Y=MXY = MXY=MX,其中 MMM 是循环矩阵。
多项式表示
F2[x]/(x32+1)\mathbb{F}_2[x] / (x^{32}+1)F2[x]/(x32+1) 中,该变换对应的多项式:
P(x)=1+x3+x12+x16+x27P(x) = 1 + x^3 + x^{12} + x^{16} + x^{27}P(x)=1+x3+x12+x16+x27
矩阵 MMM 可逆的充要条件是:gcd⁡(P(x),x32+1)=1\gcd(P(x), x^{32}+1) = 1gcd(P(x),x32+1)=1
计算最大公约数
F2\mathbb{F}_2F2 域上,x32+1=(x+1)32x^{32} + 1 = (x + 1)^{32}x32+1=(x+1)32(由 Freshman’s Dream 恒等式)。
因此只需判断 P(x)P(x)P(x) 是否能被 (x+1)(x+1)(x+1) 整除。根据因子定理:
P(1)=1⊕1⊕1⊕1⊕1=5 mod 2=1≠0P(1) = 1 \oplus 1 \oplus 1 \oplus 1 \oplus 1 = 5 \bmod 2 = 1 \neq 0P(1)=11111=5mod2=1=0
(x+1)(x+1)(x+1) 不是 P(x)P(x)P(x) 的因子,P(x)P(x)P(x)x32+1x^{32}+1x32+1 互素,矩阵 MMM 满秩,变换可逆。

3.3 列混合函数 χ\chiχ (Chi) —— 安全性核心

作用:轮函数中唯一的非线性组件,提供基于字的混淆

ARX 结构分析

设状态向量是 (a,b,c,d)(a, b, c, d)(a,b,c,d),操作序列:

  1. a←a⊞ba \leftarrow a \boxplus baab
  2. b←b⊕cb \leftarrow b \oplus cbbc
  3. c←c⊞dc \leftarrow c \boxplus dccd
  4. d←d⊕ad \leftarrow d \oplus adda
  5. a←a⊕ca \leftarrow a \oplus caac
  6. b←b⊞ab \leftarrow b \boxplus abba
  7. c←c⊞bc \leftarrow c \boxplus bccb
  8. d←d⊕bd \leftarrow d \oplus bddb

其中 ⊞\boxplus 表示模 2322^{32}232 加法。

S盒形式化

定义输出 (a′,b′,c′,d′)(a', b', c', d')(a,b,c,d),展开计算:
a′=(a⊞b)⊕(c⊞d)b′=(b⊕c)⊞((a⊞b)⊕(c⊞d))c′=c⊞d⊞[(b⊕c)⊞((a⊞b)⊕(c⊞d))]d′=(d⊕(a⊞b))⊕[c⊞d⊞[(b⊕c)⊞((a⊞b)⊕(c⊞d))]] \begin{aligned} a' &= (a \boxplus b) \oplus (c \boxplus d) \\ b' &= (b \oplus c) \boxplus ((a \boxplus b) \oplus (c \boxplus d)) \\ c' &= c \boxplus d \boxplus [(b \oplus c) \boxplus ((a \boxplus b) \oplus (c \boxplus d))] \\ d' &= (d \oplus (a \boxplus b)) \oplus [c \boxplus d \boxplus [(b \oplus c) \boxplus ((a \boxplus b) \oplus (c \boxplus d))]] \end{aligned} abcd=(ab)(cd)=(bc)((ab)(cd))=cd[(bc)((ab)(cd))]=(d(ab))[cd[(bc)((ab)(cd))]]

非线性度分析

模加 ⊞\boxplus 是 ARX 中唯一的非线性源。其非线性来源于进位传播:
ci=ai⊕bi⊕carryi−1c_i = a_i \oplus b_i \oplus \text{carry}_{i-1}ci=aibicarryi1
其中 carryi−1\text{carry}_{i-1}carryi1 依赖于所有低位比特,形成复杂的非线性关系。

与 AES S-Box 对比

特性 AES S-Box ARX 模加
非线性度 112(最优) 约 96-104(理论值)
查表需求 是(256字节)
侧信道抗性 需防护缓存分析 天然免疫
实现效率 中等(查表) 极高(寄存器运算)

虽然 ARX 单轮非线性度略低,但在 24 轮迭代下,差分/线性特征的传播概率理论估计已降至极低水平(预期 <2−128< 2^{-128}<2128)。

3.4 字移位函数 ρ\rhoρ (Rho)

作用:字级循环左移,破坏字间对称性。
数学定义
S0←S0⋘7S1←S1⋘8S2←S2⋘12S3←S3⋘16 \begin{aligned} S_0 &\leftarrow S_0 \lll 7 \\ S_1 &\leftarrow S_1 \lll 8 \\ S_2 &\leftarrow S_2 \lll 12 \\ S_3 &\leftarrow S_3 \lll 16 \end{aligned} S0S1S2S3S07S18S212S316
其中 ⋘\lll 表示循环左移。

移位量选择理由

移位量 (7,8,12,16)(7, 8, 12, 16)(7,8,12,16) 的选择基于以下考虑:

  1. 破坏对称性:不同字使用不同位移量,防止差分特征在不同行之间简单复制。
  2. 字节边界对齐:移位量 8 和 16 是字节边界的倍数,便于某些特定实现和安全分析;而 7 和 12 不是,进一步增加混淆。
安全性贡献

ρ\rhoρ 与后续的 ϵ\epsilonϵ 配合,实现了三维扩散:

  • ξ\xiξ:字内比特扩散(行内)
  • ρ\rhoρ:字间位置变换(行间)
  • ϵ\epsilonϵ:字节级列变换(列间)

三者结合,使单个比特的变化能在 2-3 轮内扩散至整个状态。

3.5 列置换函数 ϵ\epsilonϵ (Epsilon)

作用:字节级的列循环移位,配合 θ\thetaθρ\rhoρ 实现全维度扩散。
数学定义
设状态为 4×44 \times 44×4 字节矩阵 BBB,对每一列进行字节级循环移位:
B′[0,y]=B[0,(y+0) mod 4]B′[1,y]=B[1,(y+1) mod 4]B′[2,y]=B[2,(y+2) mod 4]B′[3,y]=B[3,(y+3) mod 4] \begin{aligned} B'[0, y] &= B[0, (y+0) \bmod 4] \\ B'[1, y] &= B[1, (y+1) \bmod 4] \\ B'[2, y] &= B[2, (y+2) \bmod 4] \\ B'[3, y] &= B[3, (y+3) \bmod 4] \end{aligned} B[0,y]B[1,y]B[2,y]B[3,y]=B[0,(y+0)mod4]=B[1,(y+1)mod4]=B[2,(y+2)mod4]=B[3,(y+3)mod4]
即第 0 列不移位,第 1 列下移 1 字节,第 2 列下移 2 字节,第 3 列下移 3 字节。
(第 i 列下移 i 字节,i∈[0,3]i \in [0, 3]i[0,3]

扩散效果分析

ϵ\epsilonϵ 的作用是打破 θ\thetaθ 建立的列结构:

  1. θ\thetaθ:每个字节的影响已扩散到同一行的多个位置。
  2. ϵ\epsilonϵ:同一列的字节被分散到不同行,使得下一轮的 θ\thetaθ 能从不同角度进行扩散。

具体例子
设初始状态仅 B[0,0]B[0,0]B[0,0] 为活跃字节(发生变化),其余为常数。

  • 第 1 轮 θ\thetaθ 后:B[0,0]B[0,0]B[0,0] 的影响扩散到 B[0,⋅]B[0,\cdot]B[0,](同一行)。
  • 第 1 轮 ϵ\epsilonϵ 后:B[0,⋅]B[0,\cdot]B[0,] 的字节被分散到不同行。
  • 第 2 轮 θ\thetaθ 后:扩散到更多位置。
    这种"行扩散 →\to 列重排 →\to 行扩散"的模式,实现了快速的全方位扩散。
与 SHA-3 的对比

SHA-3 的扩散通过 θ\thetaθ(列扩散)、ρ\rhoρ(面内移位)、π\piπ(面间置换)实现。Fluxle 的设计借鉴了这一理念,但适配了 128 位状态:

SHA-3 组件 Fluxle 对应 作用
θ\thetaθ θ\thetaθ 列扩散
ρ,π\rho, \piρ,π ρ,ϵ\rho, \epsilonρ,ϵ 位置置换
χ\chiχ χ\chiχ 非线性混淆

3.6 轮函数 F(S)F(S)F(S)

轮函数定义为:
F(S)=ϵ∘ρ∘χ∘ξ∘θ(S)F(S) = \epsilon \circ \rho \circ \chi \circ \xi \circ \theta (S)F(S)=ϵρχξθ(S)
执行顺序:θ→ξ→χ→ρ→ϵ\theta \to \xi \to \chi \to \rho \to \epsilonθξχρϵ

设计逻辑

每一层的作用:

  1. θ\thetaθ(线性扩散):基于列奇偶性的快速扩散,确保输入的任何变化都能影响多个位置。
  2. ξ\xiξ(行内扩散):字内比特混淆,打破字内线性关系。
  3. χ\chiχ(非线性核心):唯一非线性组件,提供差分/线性分析抵抗力。
  4. ρ\rhoρ(字间置换):字级移位,破坏对称性。
  5. ϵ\epsilonϵ(列置换):字节级置换,配合 θ\thetaθ 实现全维度扩散。

3.7 完整加密流程

fluxle cipher完整流程
完整加密流程:

  1. 初始白化S0←P⊕RK0S_0 \leftarrow P \oplus RK_0S0PRK0,其中 PPP 为明文,RK0RK_0RK0 为初始白化密钥。
  2. 轮迭代Si←F(Si−1)⊕RKiS_i \leftarrow F(S_{i-1}) \oplus RK_iSiF(Si1)RKi,共24轮密钥加(包括初始白化),其中轮函数实际执行23次。
  3. 输出:密文 C=S23C = S_{23}C=S23

第四章:密钥编排 ψ\psiψ (Key Schedule)

4.1 初始白化与常量 α\alphaα

无后门设计证明
α\alphaα 的具体数值:0xBCD3BCF5D2C6CEBBD2ECBBF2C2D6D7AA
含义:这是 GBK 编码下的"加减移位异或轮转"对应的字节序列。

// 基于GBK编码选择无后门的初始异或常数
constexpr std::array<u32, 4> alpha = {
    0xBCD3BCF5, // 加减 -> "Add"
    0xD2C6CEBB, // 移位 -> "Rot"
    0xD2ECBBF2, // 异或 -> "XOR"
    0xC2D6D7AA  // 轮转 -> "SPN-ARX"
};

如果是后门常数,分析者无法解释其来源;而使用人类可读的助记词编码,透明地证明了常数的随机性与无后门属性。这是一种"Nothing up my sleeve number"的标准实践。

4.2 轮常量生成 ι\iotaι

规则ιi=2g⋘sp\iota_i = 2^g \lll s_pιi=2gsp
其中 g=⌊i/4⌋g = \lfloor i/4 \rfloorg=i/4 为轮数组索引,p=i mod 4p = i \bmod 4p=imod4 为组内位置索引,移位表 s=(0,16,8,24)s = (0, 16, 8, 24)s=(0,16,8,24)
示例

  • i=0i=0i=0g=0,p=0,ι0=20⋘0=0x00000001g=0, p=0, \iota_0 = 2^0 \lll 0 = 0x00000001g=0,p=0,ι0=200=0x00000001
  • i=1i=1i=1g=0,p=1,ι1=20⋘16=0x00010000g=0, p=1, \iota_1 = 2^0 \lll 16 = 0x00010000g=0,p=1,ι1=2016=0x00010000
  • i=4i=4i=4g=1,p=0,ι4=21⋘0=0x00000002g=1, p=0, \iota_4 = 2^1 \lll 0 = 0x00000002g=1,p=0,ι4=210=0x00000002
  • i=23i=23i=23g=5,p=3,ι23=25⋘24=0x02000000g=5, p=3, \iota_{23} = 2^5 \lll 24 = 0x02000000g=5,p=3,ι23=2524=0x02000000

作用分析

  1. 指数增长2g2^g2g 部分随着轮数增加,保证了轮常量的汉明重量和数值差异,防止轮常量重复或线性相关。
  2. 位置分散:移位表 sss 将扰动位分散到 32 位字的四个不同字节位置,确保全字长的完整性。
    此设计有效防止了相关密钥分析和滑动分析。

4.3 生成流程

从主密钥 MKMKMK 生成轮密钥 RK0,…,RK23RK_0, \dots, RK_{23}RK0,,RK23 的全过程复用了轮函数 FFF 的部分逻辑作为伪随机数生成器。

  1. 初始白化密钥RK0=(MK0⊕α0,MK1⊕α1,MK2⊕α2,MK3⊕α3)RK_0 = (MK_0 \oplus \alpha_0, MK_1 \oplus \alpha_1, MK_2 \oplus \alpha_2, MK_3 \oplus \alpha_3)RK0=(MK0α0,MK1α1,MK2α2,MK3α3)
  2. 种子注入RK1=(MK4,MK5,MK6,MK7)⊕G(RK0,ι0)RK_1 = (MK_4, MK_5, MK_6, MK_7) \oplus G(RK_0, \iota_0)RK1=(MK4,MK5,MK6,MK7)G(RK0,ι0)
    其中 GGG 是注入轮常量的简化轮函数 FFF
  3. 迭代生成RKi=G(RKi−1,ιi−1)RK_i = G(RK_{i-1}, \iota_{i-1})RKi=G(RKi1,ιi1)i=2,…,23i = 2, \dots, 23i=2,,23
    这种设计不仅节省代码体积(复用硬件指令),还利用了 FFF 的扩散特性来"搅拌"密钥,确保主密钥的每一位都能均匀地影响所有轮密钥,杜绝了弱密钥的出现。

第五章:实现优化与代码分析

5.1 扁平化状态架构

fluxle.h 使用 std::array<uint32_t, 4> 而非二维数组或结构体数组,这是针对现代 CPU 架构的关键优化。

  • 寄存器驻留:在 x86-64 架构下,整个 128 位状态可以完全驻留在 4 个通用寄存器(如 rax, rbx, rcx, rdx)或 SSE/AVX 寄存器中。
  • 零内存访问:相比于需要在内存中查表(S-Box)或访问分散状态的传统实现,扁平化设计使得核心轮函数可以在寄存器级完成所有运算,极大地减少了内存读写延迟,提升了吞吐量,且更易于流水线并行。

5.2 C++20 特性应用

  • std::rotl / std::rotr:C++20 标准库引入的位操作函数。编译器能将其直接翻译为单条汇编指令(如 x86 的 rol)。这不仅比手写的移位-或运算更高效、更易读,而且消除了未定义行为的隐患。
  • constexpr:密钥编排中的轮常量数组 ι\iotaι 和初始常量 α\alphaα 均标记为 constexpr。这意味着这些数据在编译期即可完成计算并嵌入二进制文件,消除了程序启动时的初始化开销。
  • noexcept:所有核心函数均标记为 noexcept,这向编译器承诺不会抛出异常,从而允许编译器生成更简洁的汇编代码(无需生成异常处理表的胶水代码),并启用更激进的内联优化。

第六章:安全性分析与免责

6.1 理论安全性

  • 扩散性分析:经过 θ\thetaθ(列扩散)、ξ\xiξ(行扩散)与 ρ⋅ϵ\rho \cdot \epsilonρϵ(置换)的组合,输入单一比特的变化在极少的轮数内即可扩散至整个状态。基于 SPN 的扩散层设计理论,预计在 3-4 轮内即可达到完全性。
  • 非线性度χ\chiχ 函数引入的模加运算提供了必要的非线性。尽管 ARX 的单轮非线性度通常低于 AES S-Box,但在 24 轮的深度迭代下,差分/线性特征的传播概率理论上已降至极低水平(预期 <2−128< 2^{-128}<2128),足以抵抗常规的差分与线性分析。

6.2 局限性与已知问题

  • 未经审计:算法未经过形式化验证或第三方权威审计,可能存在未知的弱点。
  • ARX 的局限:ARX 结构的非线性度依赖于模加进位,其安全边际通常不如大 S-Box 直观。虽然 24 轮提供了较高的冗余,但是否存在针对此特定结构的特定分析路径(如旋转对称分析),仍有待研究。

6.3 模拟安全性分析

6.3.1 差分分析

θ⋅ξ\theta \cdot \xiθξ 带来了极强的扩散,χ\chiχ 对高熵的数据混淆效果极好,因此需要绕过 θ⋅ξ\theta \cdot \xiθξ。而 ξ\xiξ 是满秩的,所以保持熵不变。
我们观察到,θ\thetaθ 根据字节奇偶性扩散,如果构造偶重量差分奇重量的反转差分那就可以忽略 θ\thetaθξ\xiξ 的分支数不高,扩散速度会慢很多。
模拟 1:构造偶重量差分
设差分 δ=(0x11000000,0,0,0)\delta = (0x11000000, 0, 0, 0)δ=(0x11000000,0,0,0)(字节 0 和 2 各有 1 bit 置位,总重量为 2,偶数)。

  • θ\thetaθ 后:由于偶重量,奇偶性不变,差分保持 δ′=(0x33210102,0,0,0)\delta' = (0x33210102, 0, 0, 0)δ=(0x33210102,0,0,0)ξ\xiξ 的作用)。
  • χ\chiχ 后:模加影响字节上的差分重量并扩散至另外 2 个字,(0x33210102,0x33210102,0x33210102,0)(0x33210102, 0x33210102, 0x33210102, 0)(0x33210102,0x33210102,0x33210102,0)
  • ρ⋅ϵ\rho \cdot \epsilonρϵ 后:影响差分的重量和位置 (0x90002333,0x21800032,0x10018100,0x00100219)(0x90002333, 0x21800032, 0x10018100, 0x00100219)(0x90002333,0x21800032,0x10018100,0x00100219),难以追踪差分路径。
  • 第二次进入 F()F()F()θ\thetaθ 被激活,ξ\xiξ 进行高速扩散,χ\chiχ 混淆,此时状态完全活跃。
    模拟 2:构造奇重量的反转差分
    设差分 δ=(0x10000000,0xFF0000,0xFF00,0xFF)\delta = (0x10000000, 0xFF0000, 0xFF00, 0xFF)δ=(0x10000000,0xFF0000,0xFF00,0xFF)(字节 0 有 1 bit,其他字节有 8 bits,总重量为 25,奇数)。
  • θ\thetaθ 后:(0x10000000,0,0,0)(0x10000000, 0, 0, 0)(0x10000000,0,0,0),差分被部分消除。
  • ξ\xiξ 后:(0x12011002,0,0,0)(0x12011002, 0, 0, 0)(0x12011002,0,0,0)
  • χ\chiχ 后:(0x12011002,0x12011002,0x12011002,0)(0x12011002, 0x12011002, 0x12011002, 0)(0x12011002,0x12011002,0x12011002,0),差分保留。
  • ρ\rhoρ 后:(0x00880109,0x01100212,0x11002120,0)(0x00880109, 0x01100212, 0x11002120, 0)(0x00880109,0x01100212,0x11002120,0)
  • ϵ\epsilonϵ 后:(0x00002112,0x01880020,0x11100100,0x00000209)(0x00002112, 0x01880020, 0x11100100, 0x00000209)(0x00002112,0x01880020,0x11100100,0x00000209)
  • 第二次进入 F()F()F()θ\thetaθ 被激活,ξ\xiξ 进行高速扩散,χ\chiχ 混淆,此时状态完全活跃。

计算得最小活跃 S 盒为 2

  • 第 1 轮:密钥白化。
  • 第 2 轮:最小活跃数为 2。
  • 第 3 轮及以后:由于扩散层的作用,差分会迅速充满整个状态,每轮活跃数为 4。
    对于 RRR 轮加密:
    Min Active Adds≈2+4×max⁡(0,R−2)\text{Min Active Adds} \approx 2 + 4 \times \max(0, R - 2)Min Active Adds2+4×max(0,R2)
    对于 24 轮:
    Min Active Adds=2+4×22=90\text{Min Active Adds} = 2+ 4 \times 22 = 90Min Active Adds=2+4×22=90
    考虑到 ρ\rhoρ 移位和 ξ\xiξ 混淆对差分路径的破坏,攻击者难以利用理论最优的差分特征,因此保守取单次活跃概率为 2−22^{-2}22,则 24 轮后的差分均匀度为 2−2×90=2−1802^{-2 \times 90} = 2^{-180}22×90=2180,因此差分分析不可行,估计有 13 轮的安全冗余。

不严谨,待进一步验证

6.3.2 线性分析

在 ARX 密码学中,加法对线性分析的抵抗力很强:

  • LSB(最低位)的线性性:加法的最低位确实是线性的(a0⊕b0=c0a_0 \oplus b_0 = c_0a0b0=c0),这看起来是个弱点。
    • 高位的非线性:一旦涉及到高位,进位就会引入非线性。ci=ai⊕bi⊕carryi−1c_i = a_i \oplus b_i \oplus \text{carry}_{i-1}ci=aibicarryi1。这个进位依赖于所有低位。
  • ρ\rhoρ 的破坏作用χ\chiχ 函数之后紧接着 ρ\rhoρ(循环左移)。如果某一轮利用了 LSB 的线性弱点,下一轮 ρ\rhoρ 会把这个 LSB 移动到高位。一旦进入高位,加法的非线性进位机制就会生效,线性偏差会迅速衰减。
  • 不动点(不变子空间):不可行,每个组件都具有扩散的交互作用、ρ\rhoρϵ\epsilonϵ 有移位、χ\chiχ 打破规则性,综合来看不存在此类弱点。

因没有算力、时间和金钱,无法给出确切的安全边际。

6.3.3 积分分析

模拟分别以 A(Active,活跃,遍历 0-255)B(Balanced,平衡,XOR 和为 0)C(Constant,常数) 三种属性为输入,对 Fluxle Cipher 进行逐轮的属性追踪模拟。

仅理论推导,待实验验证

1. 模拟设置

我们以三种典型的积分分析模型进行测试:

  • 模型 A(单字节活跃):输入状态中某一个字节为 A(遍历 0x00-0xFF),其余 15 个字节为 C(常数,如 0x00)。集合大小 282^828
  • 模型 B(单字节平衡):输入状态中某一个字节为 B(XOR 和为 0,例如遍历所有偶数值),其余为 C。集合大小 272^727
  • 模型 C(全字节平衡):输入状态中所有字节均为 B(每个字节的 XOR 和为 0)。集合大小不定,假设为 272^727 或更小的精心构造集合。
    我们追踪的核心指标是:集合中所有元素的 XOR 和是否为 0。若为 0,属性记为 B(Balanced)或 A;若不为 0,属性记为 ?(Unknown),分析宣告失败。
2. 逐轮属性传播追踪
模型 A(单字节活跃)

输入[A,C,…,C][A, C, \dots, C][A,C,,C]
第一轮传播

  1. θ\thetaθ
    • A 字节的汉明重量奇偶性 P(A)P(A)P(A)。由于 0-255 中 128 个奇、128 个偶,故奇偶性是 B(平衡)
    • 扩散矩阵 DDD 会将这个 B 属性扩散到其他字节。
    • C⊕B→BC \oplus B \to BCBB(常数字节异或平衡掩码,结果仍平衡)。
    • A⊕0→AA \oplus 0 \to AA0A(活跃字节异或常数,仍活跃)。
    • 状态
      [ACCCCBCCCCBCCCCB] \begin{bmatrix} A & C & C & C \\ C & B & C & C \\ C & C & B & C \\ C & C & C & B \end{bmatrix} ACCCCBCCCCBCCCCB
  2. ξ\xiξ
    • 线性变换(XOR/Rotation)。L(A)=AL(A) = AL(A)=AL(B)=BL(B) = BL(B)=B
    • 由于旋转量 r1=7r_1=7r1=7 不是 8 的倍数,A 字节的活跃位被打散到字内的多个字节。
    • 状态
      [AAAABBBBBBBBBBBB] \begin{bmatrix} A & A & A & A \\ B & B & B & B \\ B & B & B & B \\ B & B & B & B \end{bmatrix} ABBBABBBABBBABBB
  3. χ\chiχ 层(核心非线性)
    • 模加运算 a←a⊞ba \leftarrow a \boxplus baab
    • 输入是平衡集合(XOR 和为 0)。
    • 关键性质:模加运算 不保持 XOR 平衡性
      • 证明:设集合 S={0,3}S = \{0, 3\}S={0,3},XOR 和 0⊞3=3≠00 \boxplus 3 = 3 \neq 003=3=0(不平衡)。模加的进位会随机化高位。
    • 结果:状态属性迅速变为 ?(Unknown)
    • 结论:单字节积分分析在 第 1 轮 即失效。
模型 B(单字节平衡)

输入[B,C,…,C][B, C, \dots, C][B,C,,C](某个字节 XOR 和为 0,其余为常数)。

第一轮传播

  1. θ\thetaθ
    • 不激活,字节平衡则奇偶性为偶,不扩散。
    • 状态[B,C,…,C][B, C, \dots, C][B,C,,C]
  2. ξ\xiξ
    • 线性变换不影响平衡状态,但是扩散了平衡状态。
    • 状态
      [BBBBCCCCCCCCCCCC] \begin{bmatrix} B & B & B & B \\ C & C & C & C \\ C & C & C & C \\ C & C & C & C \end{bmatrix} BCCCBCCCBCCCBCCC
  3. χ\chiχ
    • 让我们查看形式化的 χ\chiχ 运算:
      a′=(a⊞b)⊕(c⊞d)b′=(b⊕c)⊞((a⊞b)⊕(c⊞d))c′=c⊞d⊞[(b⊕c)⊞((a⊞b)⊕(c⊞d))]d′=(d⊕(a⊞b))⊕[c⊞d⊞[(b⊕c)⊞((a⊞b)⊕(c⊞d))]] \begin{aligned} a' &= (a \boxplus b) \oplus (c \boxplus d) \\ b' &= (b \oplus c) \boxplus ((a \boxplus b) \oplus (c \boxplus d)) \\ c' &= c \boxplus d \boxplus [(b \oplus c) \boxplus ((a \boxplus b) \oplus (c \boxplus d))] \\ d' &= (d \oplus (a \boxplus b)) \oplus [c \boxplus d \boxplus [(b \oplus c) \boxplus ((a \boxplus b) \oplus (c \boxplus d))]] \end{aligned} abcd=(ab)(cd)=(bc)((ab)(cd))=cd[(bc)((ab)(cd))]=(d(ab))[cd[(bc)((ab)(cd))]]
      代入:
      a′=(B⊞C)⊕(C⊞C)b′=(C⊕C)⊞((B⊞C)⊕(C⊞C))c′=C⊞C⊞[(C⊕C)⊞((B⊞C)⊕(C⊞C))]d′=(C⊕(B⊞C))⊕[C⊞C⊞[(C⊕C)⊞((B⊞C)⊕(C⊞C))]] \begin{aligned} a' &= (B \boxplus C) \oplus (C \boxplus C) \\ b' &= (C \oplus C) \boxplus ((B \boxplus C) \oplus (C \boxplus C)) \\ c' &= C \boxplus C \boxplus [(C \oplus C) \boxplus ((B \boxplus C) \oplus (C \boxplus C))] \\ d' &= (C \oplus (B \boxplus C)) \oplus [C \boxplus C \boxplus [(C \oplus C) \boxplus ((B \boxplus C) \oplus (C \boxplus C))]] \end{aligned} abcd=(BC)(CC)=(CC)((BC)(CC))=CC[(CC)((BC)(CC))]=(C(BC))[CC[(CC)((BC)(CC))]]
    • 结果
      [BBBBBBBBBBBB????] \begin{bmatrix} B & B & B & B \\ B & B & B & B \\ B & B & B & B \\ ? & ? & ? & ? \end{bmatrix} BBB?BBB?BBB?BBB?
    • 结论:经过第2轮后,全状态未知,单字节平衡输入在 第 2 轮 失效。
模型 C(全字节平衡)

输入:所有字节均为 B(每个字节的 XOR 和为 0)。
第一轮传播

  1. θ\thetaθ
    • 不激活,同上述。
    • 状态:全 B。
  2. ξ\xiξ
    • 不改变积分状态。
  3. χ\chiχ
    • 输入:两个平衡字 a,ba, ba,b
    • 运算:c=a+bc = a + bc=a+b
    • 两个平衡集合的模加,其 XOR 和 不为 0(理由同上)。
    • 结果:状态属性变为 ?(Unknown)
    • 结论:全字节平衡输入在 第 1 轮 即失效。
3. 结论:积分分析安全边际
分析模型 初始输入 第 1 轮后属性 第 2 轮后属性 分析结果
单字节活跃 1 Byte A, 15 Bytes C ? (Unknown) ? (Unknown) 1 轮失效
单字节平衡 1 Byte B, 15 Bytes C B (Balanced) ? (Unknown) 2 轮失效
全字节平衡 16 Bytes B ? (Unknown) ? (Unknown) 1 轮失效

优势:ARX 结构(模加 ⊞\boxplus)是积分分析的天然克星。模加运算极其有效地破坏了字节或字级别的 XOR 平衡性。
最终判定
分析者在尝试了基本的积分路径后,发现 区分器在第 2 轮即消失。面对 24 轮的加密深度,积分分析的安全边际为 22 轮,这表明算法在该维度上是非常坚固的。

6.4 适用场景建议

基于算法目前的实验性质,作者对其实际安全性不承担任何担保责任。

  • 推荐:密码学教学演示、CTF 比赛题目设计、嵌入式算法研究原型、非关键数据的低功耗加密实验。
  • 不推荐:银行交易系统、个人隐私数据存储、军事通信、任何涉及生命财产安全的关键系统。

第七章:结语

Fluxle Cipher 是一次对 SPN 与 ARX 融合架构的探索尝试。它在保持代码简洁、逻辑透明的同时,试图构建一个安全、高效的加密原语。设计得失之间,我们希望能为轻量级密码学社区提供一个有价值的参考样本。

我们感谢任何的社区贡献:无论是提供差分分析脚本、形式化验证报告,还是 Rust、Assembly 等语言的移植版本,都将是本项目宝贵的财富。


附录

测试向量

用于验证实现的正确性:

  • Test Case 1:
    • Key: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    • Plaintext: 00000000 00000000 00000000 00000000
    • Ciphertext: 2171213d cd1f7672 4375717b f7941555
  • Test Case 2:
    • Key: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
    • Plaintext: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
    • Ciphertext: f2e5e775 f43e027f be23d2ad 84aebd0c

致敬算法

[1] National Institute of Standards and Technology. FIPS 197: Advanced Encryption Standard (AES). 2001.
[2] Guido Bertoni, Joan Daemen, et al. The Keccak sponge function family (SHA-3). 2011.
[3] Daniel J. Bernstein. ChaCha, a variant of Salsa20. 2008.

致谢

  • DeepSeek Chat 的数学推演、代码实现和模拟分析。
  • 智谱清言 ChatGLM 的理论分析、代码优化和文章编撰。

作者神秘的胡言乱语(其实这里不重要)

其实这个算法是我目前设计的可能最有理念的一个分组加密算法了,用时超过了半年(当然挺随便的),很多地方都是我独立设计的。

其实现在看起来真的很混乱(虽然比我之前好多了),Fluxle 并没有针对一个固定的对象(就像AES针对字节、SHA-3针对比特、ChaCha20和SM4针对字),这让安全性很难分析,当然大概率也不安全就是了。

不管了,挺满意的,反正就是一个业余的爱好者,自己摸索了这么久可以设计出这个算法很满意了。也准备大考了,估计以后更没时间搞这些东西。

(ps:其实文章很大一部分是AI代劳的,我的语言表达能力实在是有点胜任不了这些,我好像说过了?)
(ps:其实我都没看过致敬算法的文献)

嗯……这篇文章本来应该很早就发布了,但是因为学业原因拖了很久很久。

总之,如果真的有人可以研究我的 Fluxle 那简直太荣幸了,我能力不足,就算了吧。

非常感谢大家能看到这里。

(ps:今天是我的生日,祝我生日快乐!)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐