5个1600比特大状态置换算法的设计与分析
以下是五个风格完全不同的 1600 比特大状态置换构造。它们都定义在 {0,1}^1600 上,且整体均为可逆置换。轮常数可用简单计数器生成,下面给出的是核心结构。
说明:这些是展示构造思路的概念设计,未经过完整密码分析,不应直接用于安全敏感场景。
1. PentaStorm-1600:宽化五列 SPN
风格:类 Rijndael 的宽轨迹 SPN,但使用 5×5 个 64 位字。
状态布局:
M[i][j],0 <= i,j < 5,每个元素为 64 位字。
轮数:12
轮函数:
{
for i, j in 0..4:
M[i][j] = AES_SBOX_64(M[i][j]) //对 8 个字节并行用 AES S 盒
// ShiftRows
for i in 0..4:
row i循环左移 i 个字
// MixColumns
for j in 0..4:
col = (M[0][j], ..., M[4][j])
col = H * col
// H是 GF(2^64) 上的 5×5 柯西矩阵
// H[r][c] = (alpha_r xor beta_c)^{-1}
//乘法在 GF(2^64) 上进行
// AddRoundConstant
M[0][0] ^= RC[round]
M[1][1] ^= rol64(RC[round], 17)
M[2][2] ^= rol64(RC[round], 31)
M[3][3] ^= rol64(RC[round], 47)
M[4][4] ^= rol64(RC[round], 59)
}
可逆性:
AES S盒可逆,行移位可逆,柯西矩阵可逆,轮常数异或可逆。
2. TangoFeistel-1600:五分支非平衡 Feistel
风格:非平衡 Feistel 网络,分支宽达 320 位,内部 F 函数是小型布尔/ARX 混合器。
状态布局:
5个 320 位分支:B[0], B[1], B[2], B[3], B[4]。
每个分支可视为 5 个 64 位字。
轮数:16
轮函数:
{
for round = 0..15:
tmp = F(B[1], B[2], B[3], B[4], RC[round])
B[0] = B[0] xor tmp
//循环左移一个分支
(B[0], B[1], B[2], B[3], B[4]) =
(B[1], B[2], B[3], B[4], B[0])
}
其中F为非压缩函数,内部把四个 320 位分支拆成 20 个 64 位字w[0..19],执行 8 轮:
{
w[0] ^= RC
repeat 8:
for j in 0..19:
w[j] ^= rol64(w[(j+3) % 20], 7)
w[j] += w[(j+7) % 20] //模 2^64 加法
w[j] ^= w[(j+11) % 20] AND NOT w[(j+15) % 20]
tmp = w[0..4]
}
可逆性:
每轮先更新B[0],然后循环移位分支。解密时反向循环移位,再重新计算同一个F异或即可恢复。
3. Triad-1600:纯 ARX 置换
风格:类似 Threefish/Skein 的 ARX 结构,完全使用模加、旋转、异或。
状态布局:
25个 64 位字:X[0], X[1], ..., X[24]。
轮数:16
轮函数:
{
// 1.成对 MIX
for p = 0..11:
a = X[2p]
b = X[2p+1]
a = a + b //模 2^64
b = rol64(b, R[p]) xor a
X[2p] = a
X[2p+1] = b
// 2.单独处理第 25 个字
X[24] = rol64(X[24], 29) xor RC[round]
// 3.字置换
Y[k] = X[(17k + 7) mod 25] // gcd(17,25)=1,是双射
X = Y
// 4.轮常数
X[0] ^= RC[round]
旋转偏移示例:
R = [32, 16, 48, 9, 37, 61, 23, 53, 32, 16, 48, 9]
}
可逆性:
每个成对 MIX 可逆,字置换可逆,旋转异或常数可逆。
4. InterlaceCA-1600:交织元胞自动机
风格:可逆元胞自动机,采用偶数/奇数下标交织扫描,局部使用 16 位非线性函数。
状态布局:
100个 16 位字:c[0], c[1], ..., c[99]。
轮数:24
轮函数:
{
//偶数下标先更新
for i in even indices 0,2,4,...,98:
c[i] ^= f(c[(i-1) mod 100], c[(i+1) mod 100])
//奇数下标后更新
for i in odd indices 1,3,5,...,99:
c[i] ^= g(c[(i-1) mod 100], c[(i+1) mod 100])
//轮常数
c[0] ^= low16(RC[round])
c[25] ^= mid16(RC[round])
c[50] ^= rol16(RC[round], 7)
c[75] ^= rol16(RC[round], 13)
//局部 16 位旋转
for i in 0..99:
c[i] = rol16(c[i], i mod 16)
其中 16 位函数示例:
f(a,b) = rol16(a,3) xor rol16(b,5) xor (a AND NOT b)
g(a,b) = rol16(a,1) xor rol16(b,9) xor (a AND b) xor 0x3C6E
}
可逆性:
偶数更新依赖旧奇数,奇数更新依赖新偶数。逆过程先反向奇数更新,再反向偶数更新即可。
5. ToffoliMesh-1600:门级可逆布尔电路
风格:直接基于 Toffoli 门和 40×40 比特矩阵转置的可逆计算结构。
状态布局:
1600比特排成40×40比特矩阵T[r][c]。
轮数:64
轮函数:
{
// 1.每行内并行 Toffoli 门
for r = 0..39:
for t = 0,3,6,...,36: // 13个三元组
(a,b,c) = T[r][t], T[r][t+1], T[r][t+2]
c = c xor (a AND b) // Toffoli门
T[r][t+2] = c
// T[r][39]不参与本轮
// 2.矩阵转置
T[r][c] = T[c][r]
// 3.第 r 行循环左移 r 位
for r = 0..39:
row r = rol_bitrow(row r, r)
// 4.轮常数
for c = 0..39:
T[0][c] ^= bit_c(RC[round])
}
可逆性:
并行 Toffoli 门自逆,矩阵转置自逆,行旋转可逆,轮常数异或自逆。整体为 1600 比特置换。
这五种构造分别走了 SPN、Feistel、ARX、交织元胞自动机、门级可逆布尔电路五条完全不同的路线,风格差异足够大。