如何基于置换算法来设计对称加密算法
一、置换算法的定义
在密码学中,“置换”通常有两层含义。
狭义定义:位置置换。
给定一个有限符号序列,置换算法按照固定规则重新排列符号的位置,但不改变符号本身。例如把 64 个比特重新排成另一个顺序。数学上可写成双射
π:01…n-1→01…n-1
输出第i位等于输入第πi
位,或反过来。因为π
是双射,所以每个位置恰好被映射一次,逆置换存在,信息无损。
广义定义:有限集合上的双射。
若集合为01n,则置换是n
比特串到自身的双射
P:01n→01n
每个输入对应唯一输出,每个输出也恰好有一个原像。分组密码的加密函数Ek在固定密钥k
下,本质上就是01n
上的一个置换;解密则是其逆置换。
因此,置换与“代换”不同:
- 代换改变符号的值,例如把字节0x3A
换成0xC5
;
- 置换改变符号的位置,例如把第 1 位放到第 17 位。
纯位置置换保持汉明重量、符号频率和整体统计分布,但改变局部相关性。
二、置换算法在对称加密算法中的地位
1. Shannon的混淆与扩散
Shannon提出强密码需要“混淆”和“扩散”。
- 混淆:使密钥与密文之间的关系复杂,通常由非线性代换完成,如 S 盒。
- 扩散:使明文或密钥的每一位影响密文的许多位,通常由置换和线性混合完成。
置换算法主要承担扩散功能。没有扩散,S 盒逐字节独立工作,局部变化无法传播到整个分组,容易受到差分分析、线性分析和截断差分分析。
2.分组密码中的核心组件
现代分组密码常见结构是 SPN,即“代换-置换网络”。
- 代换层:S 盒提供非线性;
- 置换层或线性扩散层:重新排列或混合比特/字节,使一个 S 盒的输出扩散到下一轮多个 S 盒。
- 密钥加层:引入密钥。
典型例子:
- DES 中有初始置换 IP、扩展置换 E、P 盒、压缩置换 PC-1/PC-2。
- AES 中没有传统比特 P 盒,但有 ShiftRows 和 MixColumns,它们共同完成字节级扩散。
- PRESENT、GIFT 等轻量级密码使用规则比特置换层,如 PRESENT 的 pLayer 将比特i
映射为16imod63
,使每个 S 盒输出扩散到下一轮不同 S 盒。
3.分组密码本身是伪随机置换
从理论上看,一个安全分组密码的理想模型是伪随机置换,即固定密钥后,加密函数看起来像一个随机选择的置换。安全性定义通常要求攻击者不能区分Ek与随机置换,也不能区分其逆Ek-1
与随机逆置换。
因此,置换不仅是组件,也是分组密码的理论抽象。Luby-Rackoff 还证明,用伪随机函数通过 Feistel 结构多轮迭代,可以构造伪随机置换。
4.流密码、哈希与海绵结构
在流密码、哈希函数和认证加密中,置换也常作为核心。例如 Keccak/SHA-3 使用 Keccak-f[1600] 置换,海绵结构通过反复应用置换吸收和挤出数据。这里置换必须是高效、可逆、扩散良好的双射。
5.密钥编排与白化
置换还用于密钥编排,如 DES 的 PC-1、PC-2,把密钥比特重新排列和选取,使轮密钥之间相关性降低。白化操作中也常通过置换或线性混合增强密钥影响。
总之,置换在对称加密中不是单独的安全来源,而是扩散和结构的基础。单独使用纯置换不安全,因为它保持频率和汉明重量;但缺少置换,现代分组密码的扩散和雪崩效应会严重不足。
三、密码学性质良好的置换算法应怎样设计
设计良好的置换算法,需要区分目标:是设计纯位置置换/P 盒,还是设计线性扩散层,还是设计伪随机置换/分组密码整体。下面给出通用原则和具体方法。
1.基本安全目标
一个好的置换算法通常应满足:
- 双射与可逆性:构造上保证每个输入有唯一输出,逆置换存在且高效。
- 强扩散性:输入一位变化应影响输出多位,多轮后接近雪崩效应。
- 雪崩准则:翻转输入任意一位,输出每一位翻转概率约为1/2
。
- 比特独立准则:输出位之间尽量独立,不泄露输入位关系。
- 低差分与线性相关性:若置换是非线性 S 盒或伪随机置换,应具有低差分均匀性和低线性偏差。
- 大周期、无短循环:作为置换,其循环结构不能有大量短环或固定点,避免迭代攻击和弱结构。
- 实现友好:低门数、低延迟、常数时间、硬件面积小、抗侧信道。
2.纯位置置换/P 盒的设计
纯位置置换是线性操作,只重排比特或字节。设计重点在扩散。
常用指标:
- 分支数:
BP=minx≠0wtx+wtPx
分支数越大,一个非零输入经过置换后非零位越多,扩散越强。对线性扩散层,MDS 矩阵可达到最优分支数n+1。
- 扩散距离:任意输入位到输出位的影响路径长度。
- SAC/BIC:检查输入翻转一位时输出位翻转概率是否接近1/2
。
设计方法:
- 规则置换:如循环移位、比特矩阵、PRESENT pLayer,便于硬件布线,几乎零门成本。
- 不规则置换:通过搜索算法、SAT/SMT、MILP、遗传算法寻找扩散更好的位置映射。
- 与 S 盒配合:置换层应使每个 S 盒输出进入下一轮不同 S 盒,最大化活跃 S 盒数量。
- 宽轨迹策略:扩散层分支数越高,多轮后活跃 S 盒下界越大,抗差分和线性分析能力越强。AES 的 ShiftRows + MixColumns 是典型代表。
注意:纯比特置换保持汉明重量,本身线性,不能单独作为密码。它必须与非线性代换和密钥加交替迭代。
3.线性扩散层的设计
现代分组密码常把置换推广为线性扩散层,如 GF(2) 或 GF(2^8) 上的矩阵乘法。
设计要点:
- 使用MDS矩阵:在n
个符号上达到分支数n+1
,如 AES MixColumns 在 4 字节上分支数为 5。
- 可用 Reed-Solomon 码、Cauchy 矩阵、循环矩阵构造。
- 循环矩阵便于硬件实现,但需检查差分/线性分支数。
- 二进制矩阵适合轻量级实现,但分支数通常低于 MDS,需要更多轮数补偿。
- 扩散层应与 S 盒层对齐,使每轮活跃 S 盒数最大。
4.密钥控制置换与伪随机置换
若目标是设计一个由密钥控制的置换族Pk,或直接设计分组密码,常用结构:
- Feistel结构:轮函数不必可逆,整体可逆。Luby-Rackoff 证明 3 轮可构造 PRP,4 轮可构造强 PRP。
- SPN结构:S 盒 + 线性扩散 + 轮密钥加,多轮迭代。AES 是典型。
- ARX结构:模加、循环移位、异或。软件友好,但安全分析较复杂。
- Benes网络/开关网络:用密钥控制交换开关,可实现任意置换,适合设计密钥控制置换,但需防止相关密钥攻击。
- 海绵结构中的置换:如 Keccak-f,强调扩散、非线性、常数时间。
设计时轮数必须足够,使差分、线性、积分、代数、滑动、不变子空间、回旋等攻击的复杂度高于穷举。密钥编排应避免弱密钥和轮密钥简单关系。
5. S盒作为置换的设计
S盒本身是01n→01n的双射,因此也是一种置换。AES S 盒设计是经典:
- 先取有限域GF28
上的乘法逆:x↦x-1
,0↦0
;
- 再作仿射变换。
- 结果是差分均匀性为 4,线性偏差低,代数次数为 7,能抵抗已知差分和线性攻击。
设计 S 盒时应关注:
- 差分均匀性尽量小;
- 线性谱尽量平坦;
- 代数次数高;
- 无固定点、无反演点;
- 无隐藏陷门;
- 实现可常数时间。
6.评估与验证
设计完成后需从多个维度评估:
- 数学指标:分支数、SAC、BIC、差分均匀性、线性偏差、代数次数、置换周期。
- 密码分析:差分、线性、截断差分、积分、代数、滑动、不变子空间、回旋、相关密钥。
- 实现指标:门数、面积、延迟、吞吐、功耗、常数时间性。
- 可证明安全:活跃 S 盒下界、宽轨迹策略、PRP/PRF 归约。
总结
置换算法是有限集合上的双射,在对称加密中主要承担扩散功能。现代分组密码中,它既是 SPN 的线性扩散层,也是分组密码整体的理论模型——伪随机置换。好的置换设计不能孤立追求“排列复杂”,而应与非线性 S 盒、密钥加和多轮迭代配合:纯位置置换要优化分支数、雪崩和活跃 S 盒;线性扩散层要用 MDS 或高分支数矩阵;伪随机置换要用足够轮数和抗分析结构;S 盒型置换要追求低差分、低线性、高代数次数。最终目标是在安全性、可证明性、实现效率和抗侧信道之间取得平衡。