SM4 算法有多个位置存在泄漏点,如下图所示:
在位置1和2,可以逐个字节攻击密钥,因为密钥和中间结果之间没有扩散,这时通常取Sbox的输出作为攻击点,因为在位置2处的功耗是大于位置1的,但是在FPGA硬件电路中,Sbox产生的功耗相对于状态寄存器来说小得多,有文章中的数据显示,如果攻击点在Sbox处,至少需要采集270000条功率曲线才可以破解出密钥。在实际密码电路中,产生功耗的寄存器出现在位置3,因为SM4算法的移位操作,密钥和明文高度混淆,直接攻击需要
2
32
2^{32}
232次穷举尝试,如果选择随机明文,则在位置3中不可能进行攻击。因为选择位置3作为攻击点时,应该使用选择特定的明文方法来获得密钥。这与破解AES密钥是不同的,因为在AES的每轮的状态寄存器中,最后一步是轮密钥加操作,状态寄存器的每个字节的数据只与其对应的密钥字节有相关性,可以使用正常的随机明文作为输入来攻击。
对于SM4算法而言,使用选择特定的明文方法如下:
(1)以第一轮攻击为例,第一轮密钥为
r
k
0
rk_0
rk0?,记
r
k
0
=
(
r
k
0
,
0
,
r
k
0
,
1
,
r
k
0
,
2
,
r
k
0
,
3
)
rk_0 = (rk_{0,0}, rk_{0,1},rk_{0,2},rk_{0,3})
rk0?=(rk0,0?,rk0,1?,rk0,2?,rk0,3?)。
(2)选择明文
(
X
0
,
X
1
,
X
2
,
X
3
)
=
(
00000000
h
,
00000000
h
,
00000000
h
,
X
X
000000
h
)
(X_0,X_1,X_2,X_3)=(00000000h, 00000000h, 00000000h,XX000000h)
(X0?,X1?,X2?,X3?)=(00000000h,00000000h,00000000h,XX000000h),其中
X
X
XX
XX表示一个字节的随机数据。根据SM4算法步骤,经过Sbox替换后,输出的值为:
B
=
(
S
b
o
x
(
X
X
⊕
r
k
0
,
0
)
,
S
b
o
x
(
r
k
0
,
1
)
,
S
b
o
x
(
r
k
0
,
2
)
,
S
b
o
x
(
r
k
0
,
3
)
)
B = (Sbox(XX \oplus rk_{0,0}), Sbox(rk_{0,1}), Sbox(rk_{0,2}), Sbox(rk_{0,3}))
B=(Sbox(XX⊕rk0,0?),Sbox(rk0,1?),Sbox(rk0,2?),Sbox(rk0,3?))
从这看出,只有 32bits的
b
0
b_0
b0? 是变量,其他
b
1
,
b
2
,
b
3
b_1, b_2,b_3
b1?,b2?,b3?都是常量,为了便于表述,把Sbox输出
B
B
B以及移位的结果在下表中进行推导,表中字母
X
X
X表示1bit变量,其他字母表示1bit固定常量。
移位操作 | 32bit寄存器中的值 |
---|---|
B = ( b 0 , b 1 , b 2 , b 3 ) B=(b_0,b_1,b_2,b_3) B=(b0?,b1?,b2?,b3?) | XXXXXXXX ABCDEFGH IJKLMNOP QRSTUVWY |
移位2比特 | XXXXXXAB CDEFGHIJ KLMNOPQR STUVWYXX |
移位10bit | CDEFGHIJ KLMNOPQR STUVWYXX XXXXXXAB |
移位18 bits | KLMNOPQR STUVWYXX XXXXXXAB CDEFGHIJ |
移位24bits | QRSTUVWY XXXXXXXX ABCDEFGH IJKLMNOP |
(3)经过线性位移后,状态寄存器的值为:
C
=
B
⊕
(
B
<
<
<
2
)
⊕
(
B
<
<
<
10
)
⊕
(
B
<
<
<
18
)
⊕
(
B
<
<
<
24
)
C=B \oplus(B <<< 2) \oplus (B <<< 10) \oplus (B <<< 18) \oplus (B <<< 24)
C=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24)
其中
c
0
c_0
c0? 表达式如下:
c
0
=
b
0
⊕
(
b
0
<
<
<
2
)
⊕
m
a
s
k
c_0 = b_0 \oplus (b_0 <<< 2) \oplus mask
c0?=b0?⊕(b0?<<<2)⊕mask
mask 是一个与后3个字节的子密钥相关的未知的8 bits 常量。根据表达式可以看出
c
0
c_0
c0? 与轮密钥的第一个字节
r
k
0
,
0
rk_{0,0}
rk0,0?具有很强的相关性,根据功耗攻击原理,可以恢复出
r
k
0
,
0
rk_{0,0}
rk0,0?。同理,如果选择明文:
(
X
0
,
X
1
,
X
2
,
X
3
)
=
(
00000000
h
,
00000000
h
,
00000000
h
,
00
X
X
0000
h
)
(X_0,X_1,X_2,X_3) = (00000000h, 00000000h, 00000000h, 00XX0000h)
(X0?,X1?,X2?,X3?)=(00000000h,00000000h,00000000h,00XX0000h)可以恢复出
r
k
0
,
1
rk_{0,1}
rk0,1?,依次按字节恢复出轮密钥,然后依据第1-4轮的轮密钥通过密钥扩展算法反推出加密的原始密钥。