SM4加密算法的侧信道攻击实现

发布时间:2023年12月18日

SM4 算法有多个位置存在泄漏点,如下图所示:
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(XXrk0,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
移位10bitCDEFGHIJ KLMNOPQR STUVWYXX XXXXXXAB
移位18 bitsKLMNOPQR STUVWYXX XXXXXXAB CDEFGHIJ
移位24bitsQRSTUVWY 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轮的轮密钥通过密钥扩展算法反推出加密的原始密钥。

文章来源:https://blog.csdn.net/m0_74043383/article/details/134919778
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。