分组密码是将明文数字序列按固定长度分组,并使用一个密钥和同一加密算法逐组加密的密码。
二进制明文分组长度 为分组长度或分组规模。明密文空间 。
二进制密钥的长度 为密钥长度或密钥规模。密钥空间 。
安全原则
混淆,扩散
混淆:明文与密钥关系复杂。
扩散:明文和密钥影响尽可能大,隐藏明文的统计特性和结构规律。
DES 数据加密标准
迭代型分组密码算法。
分组长度:64 bit
密钥长度:64 bit
有效密钥长度: 56 bit(去掉8个校验位)
迭代圈数:16 r
圈密钥长度:48 bit

前15次都一样,最后一次不交换。
初始置换IP

它的本质是:将输入每个字节的第 个位集中到输出的一个字节。如第一行 均为 2。
逆变换也是一样的道理,只是将其反转。
圈函数
前15次:
第16次:
f函数

- 输入拓展 48 位,与 48 位轮密钥异或。

- 每 6 位进入 s 盒变换输出 4 位,共计输出 32 位。
非线性变换,s 盒固定,输入第 1,6 位作列、第 2,3,4,5 位作行,查表得到输出。
- 32 位进入 p 盒置换得到输出。

圈密钥生成算法

置换选择1:64 位丢弃最高位,选 56 位,分为两个 28 位。
置换选择2:从56 位,即两个 28 位中选 24 + 24 = 48 位,即为圈密钥。
循环移位人为设计,迭代 16 次后回到初态。
脱密
加密可拆分为两个对合变换:
- Feistel函数:
- 左右块变换:
因为对合变换两次得到自身,故脱密就是圈密钥顺序相反的加密过程。
IDEA 国际数据加密标准
迭代型分组密码算法。
分组长度:64 bit
密钥长度:128 bit
迭代圈数:8 + 1输出 r
圈密钥长度:16 bit 为一块,每圈 6 个, 输出 4 个,共 56 个。
基本运算
圈函数

考试不考,也不太想用这种结构,这里我就不求甚解了。
子密钥生成算法
一开始的 128 位直接作为最开始的 8 个 16 位密钥子块。
然后将 128 位循环左移 25 位,得到随后的 8 个密钥子块。
重复这个过程,直到产生 52 个所需的 16 位密钥子块。
脱密
与加密算法相同,密钥变为脱密密钥。
依然,共处理 和中间块对换 都是对合变换,所以直接再次操作即可。
群运算 需要使用对应的逆变换 。
AES 高级加密标准
也是迭代型分组密码算法。
分组长度:128 bit
密钥长度:128、192 或 256 bit
圈数:10、12 或 14 r

以 128 为例。最开始与原密钥 ,经过 9 轮圈函数,第 10 轮即出口处理变换。
圈函数

字节代替变换
非线性层,混淆&局部扩散

128 位被分为 16 个字节操作。
其中包含两个操作:
每个字节变换为有限域 上的乘法逆元。0 变换为自身:


二元域上的仿射变换:
依然人为规定,查表。
行移位变换
线性混合层,扩散

按照如图字节矩阵进行字节的行移位。
只改变行中字节位置,把同一列的字节分散到不同的列中。
列混合变换
线性混合层,扩散

为了追求整体的扩散,还要进行列混合。
对人为规定的矩阵乘,产生列混合效果。
圈密钥加
密钥参与层
圈密钥矩阵由密钥生成算法产生,简单与之前的结果字节矩阵异或即可。
密钥生成算法
圈密钥长度一定等于分组长度 128 bit,即 4 个 32 位字。圈数 r 共需密钥为 个 32 位。

设有 个初始密钥(例如 128 位时,),前 个直接取初始密钥;
非 倍数也较为简单,取上一轮同余的密钥 与上一个密钥 异或;
只有 倍数的密钥需要:循环左移 1 字节,使用 AES s 盒进行字节代替,模上一轮同余密钥 和常数 。

256 位密钥时略有不同,分三种情况生成。
非倍数与 8 倍数与更少密钥相同;
仅为 4 倍数时,直接进行字节代替并与上一轮同余密钥 异或。
脱密算法

除圈密钥加不再是对合变换了,故解密过程都采用逆变换。
注意字节代替逆变换的顺序也要反序,先逆仿射变换再应用逆 s 盒。
其他变换没什么特别的,行左移逆操作就是行右移,以此类推。
加脱密的相似性
为什么加解密字节代替和行列操作等顺序不用反过来?
字节代替只修改内容,没改变顺序。反过来操作结果也是一样的。
又因为
列混合与密钥加广义可交换。