# 分组密码

8 min read
Table of Contents

分组密码是将明文数字序列按固定长度分组,并使用一个密钥和同一加密算法逐组加密的密码。

二进制明文分组长度 nn分组长度分组规模。明密文空间 {0,1}n\{ 0,1 \}^n

二进制密钥的长度 ll密钥长度密钥规模。密钥空间 {0,1}l\{ 0,1 \}^l

安全原则

混淆扩散

混淆:明文与密钥关系复杂。

扩散:明文和密钥影响尽可能大,隐藏明文的统计特性和结构规律。

DES 数据加密标准

迭代型分组密码算法。

分组长度:64 bit

密钥长度:64 bit

有效密钥长度: 56 bit(去掉8个校验位)

迭代圈数:16 r

圈密钥长度:48 bit

前15次都一样,最后一次不交换。

初始置换IP

它的本质是:将输入每个字节的第 ii 个位集中到输出的一个字节。如第一行 mod8mod 8 均为 2。

逆变换也是一样的道理,只是将其反转。

圈函数

前15次:

(Li,Ri)=(Ri1,Li1f(Ri1,Ki))(L_i, R_i) = (R_{i-1}, L_{i-1} \oplus f(R_{i-1}, K_i))

第16次:

(L16,R16)=(L15f(R15,K16),R15)(L_{16}, R_{16}) = (L_{15} \oplus f(R_{15}, K_{16}), R_{15})

f函数

f(R,k)=PS(E(R)k)f(R, k) = PS(E(R) \oplus k)
  1. 输入拓展 48 位,与 48 位轮密钥异或。
  1. 每 6 位进入 s 盒变换输出 4 位,共计输出 32 位。

非线性变换,s 盒固定,输入第 1,6 位作列、第 2,3,4,5 位作行,查表得到输出。

  1. 32 位进入 p 盒置换得到输出。

圈密钥生成算法

置换选择1:64 位丢弃最高位,选 56 位,分为两个 28 位。

置换选择2:从56 位,即两个 28 位中选 24 + 24 = 48 位,即为圈密钥。

循环移位人为设计,迭代 16 次后回到初态。

脱密

加密可拆分为两个对合变换:

  1. Feistel函数:
(x,y)(xfk(y),y)(x, y) \longmapsto (x \oplus f_k(y), y)
  1. 左右块变换:
(a,b)(b,a)(a, b) \longmapsto (b, a)

因为对合变换两次得到自身,故脱密就是圈密钥顺序相反的加密过程。

IDEA 国际数据加密标准

迭代型分组密码算法。

分组长度:64 bit

密钥长度:128 bit

迭代圈数:8 + 1输出 r

圈密钥长度:16 bit 为一块,每圈 6 个, 输出 4 个,共 56 个。

基本运算

逐位模2\oplus 逐位模 2 加 216\boxplus 模 2^{16} 加 216+1乘法\otimes 模 2^{16} + 1 乘法 128比特向量的循环移位变换128 比特向量的循环移位变换

圈函数

考试不考,也不太想用这种结构,这里我就不求甚解了。

子密钥生成算法

一开始的 128 位直接作为最开始的 8 个 16 位密钥子块。

然后将 128 位循环左移 25 位,得到随后的 8 个密钥子块。

重复这个过程,直到产生 52 个所需的 16 位密钥子块。

脱密

与加密算法相同,密钥变为脱密密钥。

依然,共处理 GkG_k 和中间块对换 DD 都是对合变换,所以直接再次操作即可。

群运算 QkQ_k 需要使用对应的逆变换 Qk1Q_k^{-1}

AES 高级加密标准

也是迭代型分组密码算法。

分组长度:128 bit

密钥长度:128、192 或 256 bit

圈数:10、12 或 14 r

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

圈函数

字节代替变换

非线性层,混淆&局部扩散

128 位被分为 16 个字节操作。

其中包含两个操作:

每个字节变换为有限域 GF(28)GF(2^8) 上的乘法逆元。0 变换为自身:

二元域上的仿射变换:

依然人为规定,查表。

行移位变换

线性混合层,扩散

按照如图字节矩阵进行字节的行移位。

只改变行中字节位置,把同一列的字节分散到不同的列中。

列混合变换

线性混合层,扩散

a0=02a003a101a201a3a'_0 = 02 \cdot a_0 \oplus 03 \cdot a_1 \oplus 01 \cdot a_2 \oplus 01 \cdot a_3

为了追求整体的扩散,还要进行列混合。

对人为规定的矩阵乘,产生列混合效果。

圈密钥加

密钥参与层

圈密钥矩阵由密钥生成算法产生,简单与之前的结果字节矩阵异或即可。

密钥生成算法

圈密钥长度一定等于分组长度 128 bit,即 4 个 32 位字。圈数 r 共需密钥为 4(r+1)4(r+1) 个 32 位。

设有 NkN_k 个初始密钥(例如 128 位时,Nk=128/32=4N_k = 128 / 32 = 4),前 NkN_k 个直接取初始密钥;

NkN_k 倍数也较为简单,取上一轮同余的密钥 wiNkw_{i-N_k} 与上一个密钥 wi1w_{i-1} 异或;

只有 NkN_k 倍数的密钥需要:循环左移 1 字节,使用 AES s 盒进行字节代替,模上一轮同余密钥 wiNkw_{i - N_k} 和常数 Rcon[i/Nk]Rcon[i/N_k]

256 位密钥时略有不同,分三种情况生成。

非倍数与 8 倍数与更少密钥相同;

仅为 4 倍数时,直接进行字节代替并与上一轮同余密钥 wiNkw_{i-N_k} 异或。

脱密算法

除圈密钥加不再是对合变换了,故解密过程都采用逆变换。

注意字节代替逆变换的顺序也要反序,先逆仿射变换再应用逆 s 盒。

其他变换没什么特别的,行左移逆操作就是行右移,以此类推。

加脱密的相似性

为什么加解密字节代替和行列操作等顺序不用反过来?

字节代替只修改内容,没改变顺序。反过来操作结果也是一样的。

又因为

C1(XK)=C1(X)C1(K)=C1(X)KC^{-1}(X \oplus K) = C^{-1}(X) \oplus C^{-1}(K) = C^{-1}(X) \oplus K'

列混合与密钥加广义可交换。

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

# 公钥密码

5 min read

发送方只需要加密,接收方只需要脱密。如果加密脱密有两个不同密钥,那么双方只需要有各自需要的密钥就行了。

Read

Comments