一种基于Xiao-Lai方案的动态SM4白盒算法
1 白盒密码概述
白盒密码是一种特殊的密码学技术,旨在保护加密算法在不可信环境中的安全性,最早由Chow等人提出[1]。与传统的黑盒模型不同,白盒密码假设攻击者可以完全访问算法的内部细节,包括密钥和中间计算结果。其主要应用场景包括软件保护、数字版权管理(DRM)和嵌入式系统等,确保即使攻击者能够逆向工程或动态调试,也无法轻易提取密钥或破坏加密过程。白盒密码通过复杂的数学变换和混淆技术,将密钥与算法深度融合,从而在开放环境中实现高强度的安全防护。
2 方案设计
2.1 白盒密码原理
白盒密码的原理是通过混淆技术在关键密码操作的输入和输出添加置乱编码,并封装成查找表的形式,隐藏关键的加密逻辑和数据。例如对于一个从m比特到n比特的映射F,分别使用一个从m比特到m比特的随机双射G(例如可逆仿射变换)和一个从n比特到n比特的随机双射H对映射F的输入和输出进行混淆:
F′=H∘F∘G−1.
分组密码可以看作是由一系列串行的子部件(例如AES-128中的轮密钥加、S盒替换等)构成,在白盒实现中需要分别对每一个子部件进行混淆。每一个部件的输入置乱编码应是上一个部件的输出置乱编码的逆。例如对于一个从m比特到n比特的映射F和一个从n比特到p比特的映射K,K∘F应被混淆为:
K′∘F′=(P∘K∘H−1)∘(H∘F∘G−1)
其中P是一个从p比特到p比特的随机双射。分别将(H∘F∘G−1)和(P∘K∘H−1)固化成查找表,将F和K的逻辑隐藏。值得注意的是,在上述串行子部件“头”“尾”两端的置乱编码为外部编码(external encoding)。例如在本例中,需要使用G对输入进行编码,使用P−1对输出进行解码。
2.2 Xiao-Lai方案
Xiao-Lai方 案 [2] 使用可逆仿射变换作为置乱编码,将轮函数F(Xi,Xi+1,Xi+2,Xi+3,rki)执行过程分为三个部分,分别进行Xi+1,Xi+2,Xi+3三个状态的异或、原SM4算法中的非线性变换τ与线性变换L,以及Xi与X′′的异或操作。
(1) 计算Xi′=Xi+1⊕Xi+2⊕Xi+3
在计算之前需要消去上一个变换中的输出置乱编码,随后添加新的置乱编码Ei。本阶段的计算过程可以表示为:
Xi′=Ei∘Pi+1−1[Xi+1]⊕Ei∘Pi+2−1[Xi+2]⊕Ei∘Pi+3−1[Xi+3],
其中Pi+j(j=1,2,3)是32比特到32比特的随机可逆仿射变换:
Pi(x)=Ai⋅x⊕ai,
其中Ai为GF(2)上的32×32的可逆矩阵,ai为32比特的向量。
Ei=diag(Ei0,Ei1,Ei2,Ei3),其中Eij是8比特到8比特的可逆仿射变换。
记
Mi+j=Ei∘Pi+j,j=1,2,3.
最后只需要保存Mi+j,而Ei和Pi+j都不会在白盒环境中单独出现,保证了SM4算法中间状态的安全性。由于仿射变换的类线性性质,可以直接将带有可逆仿射置乱编码的中间状态进行异或操作。
(2) 计算Xi′′=T(Xi′⊕rki)
在Xiao-Lai方案中,将轮密钥隐藏到S盒中。即在每一轮的非线性变换τ中,
=τ(Xi′⊕rki)(Sbox(xi0⊕rki0),Sbox(xi0⊕rki0),Sbox(xi0⊕rki0),Sbox(xi0⊕rki0))⊤
其中,
Xi′rki=(xi0,xi1,xi2,xi3)⊤,=(rki0,rki1,rki2,rki3)⊤
记Sij(x)=Sbox(x⊕rkij), i=0,1,…,31, j=0,1,2,3,则子密钥被隐藏到每一轮的Sij。由于S盒是公开的,攻击者得到Sij的时候依然可以得到密钥信息,因此,还需要在输入输出侧添加置乱编码。
线性变换L可以表示为左乘一个GF(2)上的32×32的矩阵L, 将非线性变换τ与线性变换L结合在一起,并添加输出置乱编码Qi。Qi同样是32比特到32比特的可逆仿射变换。前一步操作的输出置乱编码Ei的逆Ei−1作为本操作的输入置乱编码。对于一个32到32比特的非线性变换,如果用查找表表示,查找表的大小将为232×32=16GB,这样大小的查找表在实际应用中并不适用。因此,Xiao-Lai方案根据矩阵乘法的性质,把整个变换拆分成4个8比特到32比特的变换,再用查找表的形式表示拆分后的8比特到32比特变换。不妨设Qi(x)=Bi⋅x⊕bi,则