现代密码学笔记-Chapter3
一、分组密码概述
扩散和混淆
- 扩散
- 明文的统计特性散布到密文中去
- 混淆
- 密文与密钥之间的统计关系变得尽可能复杂
二、DES
Feistel结构(迭代与密钥相关的非线性变换)
- 加解密一致(相同硬件结构,改变(逆序)密钥输入)
- 扩散性较差(两轮才改变输入的一比特信息)
L
i
=
R
i
−
1
\qquad L_i=R_{i-1}
Li=Ri−1
R
i
=
L
i
−
1
⊕
F
(
R
i
−
1
,
K
i
)
\qquad R_i=L_{i-1}\oplus F(R_{i-1},K_i)
Ri=Li−1⊕F(Ri−1,Ki)
F
:
Z
n
×
Z
m
→
Z
n
\qquad F:\mathbb{Z}^n\times \mathbb{Z}^m\rightarrow \mathbb{Z}^n
F:Zn×Zm→Zn
- 64比特输入 → \rightarrow → 初始置换IP → \rightarrow → 16轮结构(左右32比特) → \rightarrow → 左右交换 → \rightarrow → 逆初始置换 → \rightarrow → 64比特输出
- 64比特密钥 → \rightarrow → 除去校验位 → \rightarrow → 56比特(左右28比特) → \rightarrow → (下一轮密钥输入,置换选择2 → \rightarrow → K i K_i Ki(48比特))
- F函数:( R i − 1 → R_{i-1}\rightarrow Ri−1→ 扩展变换E) ⊕ K i \oplus K_i ⊕Ki → \rightarrow → S盒 → \rightarrow → 置换P,即 P ( S [ E ( R i − 1 ) ⊕ K i ] ) P(S[E(R_{i-1})\oplus K_i]) P(S[E(Ri−1)⊕Ki])
- 扩展变换E:32比特 → \rightarrow → 48比特
\qquad
————————————————
\qquad
32
∣
∣
1
2
3
4
∣
∣
5
4
∣
∣
5
6
7
8
∣
∣
9
⋮
∣
∣
⋮
⋮
⋮
⋮
∣
∣
⋮
28
∣
∣
29
30
31
32
∣
∣
1
\begin{array}{rccccl} \textbf{32}|| & 1 & 2 & 3 & 4 & ||\textbf{5}\\ \textbf{4}|| & 5 & 6 & 7 & 8 & ||\textbf{9}\\ \vdots|| & \vdots& \vdots& \vdots & \vdots & ||\vdots\\ \textbf{28}|| & 29 & 30 & 31 & 32 & ||\textbf{1}\\ \end{array}
32∣∣4∣∣⋮∣∣28∣∣15⋮2926⋮3037⋮3148⋮32∣∣5∣∣9∣∣⋮∣∣1
\qquad
————————————————
- S盒
- 1、6比特选择4种代换中的某行
- 2、3、4、5比特选择该代换中16列的某列
- 110101 → \rightarrow →行号 ( 11 ) 2 (11)_2 (11)2=3,列号 ( 1010 ) 2 (1010)_2 (1010)2=10,即第4行第11列(从0开始)
形式
- 平衡(平分输入)
- 非平衡(改变F函数的输出长度)
三、二重DES
1. 112比特攻击难度(密钥长度56比特)
C
=
E
k
2
[
E
k
1
(
P
)
]
\qquad C=E_{k_2}[E_{k_1}(P)]
C=Ek2[Ek1(P)]
P
=
D
k
1
[
D
k
2
(
C
)
]
\qquad P=D_{k_1}[D_{k_2}(C)]
P=Dk1[Dk2(C)]
无法找到另一密钥 k 3 k_3 k3使得 E k 2 [ E k 1 ( P ) ] = E k 3 ( P ) E_{k_2}[E_{k_1}(P)]=E_{k_3}(P) Ek2[Ek1(P)]=Ek3(P)
2.中间相遇攻击
X
=
E
k
1
(
P
)
=
D
k
2
(
C
)
\qquad X=E_{k_1}(P)=D_{k_2}(C)
X=Ek1(P)=Dk2(C)
对已知明密文对
(
P
,
C
)
(P,C)
(P,C),执行如下攻击行为:
- 用 2 56 2^{56} 256种潜在的密钥 K 1 K_1 K1对明文 P P P加密得到 C ( k ) C^{(k)} C(k),将临时密文按序存入到表 T T T中( 2 56 2^{56} 256行记录 { K 1 ( k ) , C ( k ) } \{K^{(k)}_1,C^{(k)}\} {K1(k),C(k)});
- 用 2 56 2^{56} 256种潜在的密钥 K 2 K_2 K2对密文 P P P解密得到 M ( k ) M^{(k)} M(k),在表 T T T种查找匹配项;
- 若匹配,记录对应的密钥 K 1 K_1 K1和 K 2 K_2 K2,用新的明密文对检验
\qquad
对于已知明文,二重DES产生
2
64
2^{64}
264种潜在的密文,但潜在的密钥有
2
112
2^{112}
2112种。因而,如果已知一个明文,有
2
112
/
2
64
=
2
48
2^{112}/2^{64}=2^{48}
2112/264=248种密钥可产生已知的密文,即存在多对一的映射,
2
48
2^{48}
248种密钥加密已知明文通过不同的映射产生此对应的密文。
\qquad
若再得一组明密文对检验,
2
48
2^{48}
248种密钥对
2
64
2^{64}
264种映射。即没有映射到当前密文的概率是
2
48
/
2
64
=
2
−
12
2^{48}/2^{64}=2^{-12}
248/264=2−12,也就是虚警(误报率)。
\qquad
因而,获得两份明密文对,中途相遇攻击的成功概率(找到密钥的概率)为
1
−
2
−
16
1-2^{-16}
1−2−16。
P.S.书上讲的误报率,直接理解有点迷惑。针对误报率,它的解释就是正例样本中负例的比例。个人理解为潜在的
2
48
2^{48}
248种密钥的错误率,即找错了密钥,加密第二份明文不会映射到当前密文,而是映射为其他的密文,这个概率是
2
−
12
2^{-12}
2−12。立即推,正确的概率为互补概率
1
−
2
−
16
1-2^{-16}
1−2−16。
3. 三重DES
- 两个密钥 C = E k 2 [ D k 2 [ E k 1 ( P ) ] ] C=E_{k_2}[D_{k_2}[E_{k_1}(P)]] C=Ek2[Dk2[Ek1(P)]]
- 三个密钥 C = E k 3 [ D k 2 [ E k 1 ( P ) ] ] C=E_{k_3}[D_{k_2}[E_{k_1}(P)]] C=Ek3[Dk2[Ek1(P)]]
四、运行模式
1.电码本ECB
- 每个分组同一密钥加密
- 传送短数据
- C i = E k [ P i ] , P i = D k [ C i ] C_{i}=E_k[P_i],P_i=D_k[C_i] Ci=Ek[Pi],Pi=Dk[Ci]
2. 密码分组链接CBC
- 当前明文组与前一密文组异或
- 认证,传送数据分组(64比特)
- C i = E k [ I V ⊕ P i ] , P i = I V ⊕ D k [ C i ] C_i=E_k[IV\oplus P_i],P_i=IV\oplus D_k[C_i] Ci=Ek[IV⊕Pi],Pi=IV⊕Dk[Ci]
3.密码反馈CFB
- 只处理临时密文组 j j j比特最高有效位,与当前明文组异或(输出的密文与IV j j j比特最低有效位相同)
- 认证,传送数据流
- C i = P i ⊕ S j ( E ( I V ) ) , P i = C i ⊕ S j ( E ( I V ) ) C_i=P_i\oplus S_j(E(IV)),P_i=C_i\oplus S_j(E(IV)) Ci=Pi⊕Sj(E(IV)),Pi=Ci⊕Sj(E(IV))
4.输出反馈OFB
- 类似CFB,不同点:临时密文的 j j j比特直接下一轮IV的 j j j比特最低有效位(不再异或),密文仍然需要异或
- 干扰信道,传送数据流,错误不传播
五、AES
Rijndael结构(迭代与密钥相关的非线性变换)
- 轮数更少,扩散更快
- S盒混淆,P置换扩散
- 抵抗差分密码攻击、线性密码攻击
字节代换(非线性)
→
\rightarrow
→行移位
→
\rightarrow
→列混合(多项式,矩阵乘法)
→
\rightarrow
→轮密钥加(矩阵异或)
明文
→
\rightarrow
→初始密钥加
→
\rightarrow
→[[字节代换
→
\rightarrow
→行移位
→
\rightarrow
→列混合
→
\rightarrow
→轮密钥加]]
(
k
e
y
1
)
^{(key_1)}
(key1)
→
⋯
→
\rightarrow\cdots\rightarrow
→⋯→[[字节代换
→
\rightarrow
→行移位
→
\rightarrow
→轮密钥加]]
(
k
e
y
r
)
^{(key_r)}
(keyr)
→
\rightarrow
→密文
明文
←
\leftarrow
←[[轮密钥加
←
\leftarrow
←逆字节代换
←
\leftarrow
←逆行移位]]
(
k
e
y
1
)
^{(key_1)}
(key1)
←
⋯
←
\leftarrow\cdots\leftarrow
←⋯←[[列混合
←
\leftarrow
←轮密钥加
←
\leftarrow
←逆字节代换
→
\rightarrow
→逆行移位]]
(
k
e
y
r
)
^{(key_r)}
(keyr)
←
\leftarrow
←密钥加
←
\leftarrow
←密文
part 1
- 字节代换ByteSub对每个字节做相同变换(逆元+仿射)
- 行移位ShiftRow对整行字节进行循环移位
- InvByteSub → \rightarrow →InvShiftRow ≡ \equiv ≡InvShiftRow → \rightarrow →InvByteSub
part 2
列混合MixColumn将列视为
G
F
(
2
8
)
GF(2^8)
GF(28)上的多项式,与
c
(
x
)
c(x)
c(x)进行模
x
4
+
1
x^4+1
x4+1乘法。
- x i x^i xi ≡ x i − x i − 4 ( x 4 + 1 ) ≡ x i − ( x i + x i − 4 ) \equiv x^i-x^{i-4}(x^4+1)\equiv x^i-(x^i+x^{i-4}) ≡xi−xi−4(x4+1)≡xi−(xi+xi−4) ≡ x i − 4 ( mod x 4 + 1 ) \equiv x^{i-4} (\textrm{mod} x^4+1) ≡xi−4(modx4+1)
- c ( x ) = 03 x 3 + 01 x 2 + 01 x + 02 → b ( x ) = c ( x ) ⊗ a ( x ) c(x)=03x^3+01x^2+01x+02\rightarrow b(x)=c(x)\otimes a(x) c(x)=03x3+01x2+01x+02→b(x)=c(x)⊗a(x)
- c ( x ) ⊗ d ( x ) ≡ 01 c(x)\otimes d(x)\equiv 01 c(x)⊗d(x)≡01
-
d
(
x
)
=
d
3
x
3
+
d
2
x
2
+
d
1
x
+
d
0
d(x)=d_3x^3+d_2x^2+d_1x+d_0
d(x)=d3x3+d2x2+d1x+d0存在当且仅当:
( 03 x 3 + 01 x 2 + 01 x + 02 ) ( d 3 x 3 + d 2 x 2 + d 1 x + d 0 ) ≡ 1 ( mod x 4 + 1 ) (03x^3+01x^2+01x+02)(d_3x^3+d_2x^2+d_1x+d_0)\equiv 1 (\textrm{mod} x^4+1) (03x3+01x2+01x+02)(d3x3+d2x2+d1x+d0)≡1(modx4+1)
因此有:- ( 03 x 3 + 01 x 2 + 01 x + 02 ) ( d 2 x 3 + d 1 x 2 + d 0 x + d 3 ) ≡ x ( mod x 4 + 1 ) (03x^3+01x^2+01x+02)(d_2x^3+d_1x^2+d_0x+d_3)\equiv x (\textrm{mod} x^4+1) (03x3+01x2+01x+02)(d2x3+d1x2+d0x+d3)≡x(modx4+1)
- ( 03 x 3 + 01 x 2 + 01 x + 02 ) ( d 1 x 3 + d 0 x 2 + d 3 x + d 2 ) ≡ x 2 ( mod x 4 + 1 ) (03x^3+01x^2+01x+02)(d_1x^3+d_0x^2+d_3x+d_2)\equiv x^2 (\textrm{mod} x^4+1) (03x3+01x2+01x+02)(d1x3+d0x2+d3x+d2)≡x2(modx4+1)
- ( 03 x 3 + 01 x 2 + 01 x + 02 ) ( d 0 x 3 + d 3 x 2 + d 2 x + d 1 ) ≡ x 3 ( mod x 4 + 1 ) (03x^3+01x^2+01x+02)(d_0x^3+d_3x^2+d_2x+d_1)\equiv x^3 (\textrm{mod} x^4+1) (03x3+01x2+01x+02)(d0x3+d3x2+d2x+d1)≡x3(modx4+1)
- 改写成矩阵乘法:
[ 02 03 01 01 01 02 03 01 01 01 02 03 03 01 01 02 ] ⋅ [ d 0 d 3 d 2 d 1 d 1 d 0 d 3 d 2 d 2 d 1 d 0 d 3 d 3 d 2 d 1 d 0 ] = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] \left[\begin{array}{llll} 02 & 03 & 01 & 01\\ 01 & 02 & 03& 01\\ 01 & 01& 02& 03\\ 03 & 01& 01& 02\\ \end{array} \right]\cdot\left[\begin{array}{llll} d_0 & d_3& d_2& d_1\\ d_1 & d_0& d_3& d_2\\ d_2 & d_1& d_0& d_3\\ d_3 & d_2& d_1& d_0\\ \end{array} \right]=\left[\begin{array}{llll} 1& 0& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1& 0\\ 0& 0& 0& 1\\ \end{array} \right] ⎣⎢⎢⎡02010103030201010103020101010302⎦⎥⎥⎤⋅⎣⎢⎢⎡d0d1d2d3d3d0d1d2d2d3d0d1d1d2d3d0⎦⎥⎥⎤=⎣⎢⎢⎡1000010000100001⎦⎥⎥⎤
得到 d ( x ) = 0 B x 3 + 0 D x 2 + 09 x + 0 E d(x)=0\textrm{B}x^3+0\textrm{D}x^2+09x+0\textrm{E} d(x)=0Bx3+0Dx2+09x+0E
- 注意此处的加法是指逐比特异或操作,乘法是 G F ( 2 8 ) GF(2^8) GF(28)上的多项式乘法运算:即加法逆元等于自己,乘法逆元模 m ( x ) = x ∗ + x 4 + x 3 + x + 1 m(x)=x^*+x^4+x^3+x+1 m(x)=x∗+x4+x3+x+1,并可以利用扩展的欧几里得算法求逆。
- 矩阵的逆元按照正常的逆元求解,但加法和乘法必须满足 G F ( 2 8 ) GF(2^8) GF(28)上的性质。
- 用 M ( x ) = x 4 + 1 M(x)=x^4+1 M(x)=x4+1来求解AES的列混合中的逆元,但具体求解过程则将每个字节展开为 G F ( 2 8 ) GF(2^8) GF(28)上的多项式进行运算
part 3
密钥加AddRoundKey将轮密钥与状态逐比特异或
当分组长度为128,即
N
b
=
N
k
=
4
N_b=N_k=4
Nb=Nk=4,列宽为4,则迭代轮数
N
r
=
10
N_r=10
Nr=10
矩阵4列的4个字依次命名为
W
[
0
]
,
W
[
1
]
,
W
[
2
]
,
W
[
3
]
W[0],W[1],W[2],W[3]
W[0],W[1],W[2],W[3],它们构成一个以字为单位的数组
W
W
W。因而,轮密钥一共
128
×
(
N
r
+
1
)
128\times (N_r+1)
128×(Nr+1)比特=44列,即需要扩充40个新列。新列以如下的递归方式产生:
- 如果 i i i不是4的倍数,那么第 i i i列由如下等式确定: W [ i ] = W [ i − 4 ] ⊕ W [ i − 1 ] W[i]=W[i-4]\oplus W[i-1] W[i]=W[i−4]⊕W[i−1] .
- 如果
i
i
i是4的倍数,那么第
i
i
i列由如下等式确定:
W [ i ] = W [ i − 4 ] ⊕ T ( W [ i − 1 ] ) W[i]=W[i-4]\oplus T(W[i-1]) W[i]=W[i−4]⊕T(W[i−1])
函数T由3部分组成:字循环(循环左移1个字节)、字节代换(S盒)和轮常量异或( R c o n [ i / 4 ] = ( R C [ i / 4 ] , 00 , 00 , 00 ) = ( x i / 4 − 1 , 00 , 00 , 00 ) Rcon[i/4]=(RC[i/4],00,00,00)=(x^{i/4-1},00,00,00) Rcon[i/4]=(RC[i/4],00,00,00)=(xi/4−1,00,00,00))。
part2和part3逆运算交换顺序:
\quad
AddRoundKey(
⋅
\cdot
⋅,Key)
→
\rightarrow
→InvMinColumn
=(状态阵列
⊕
\oplus
⊕轮密钥阵列)
⊗
d
(
x
)
\otimes d(x)
⊗d(x)
=(状态阵列
⊗
d
(
x
)
\otimes d(x)
⊗d(x))
⊕
\oplus
⊕(轮密钥阵列
⊗
d
(
x
)
\otimes d(x)
⊗d(x))
=InvMinColumn
→
\rightarrow
→ AddRoundKey(
⋅
\cdot
⋅,InvMinColumn(Key))