本文档主要介绍基于非线性双射的SM4白盒实现方案,包括设计原理、代码实现的详细流程、安全性分析、与现有SM4白盒实现的比较以及白盒API调用示例。
1 设计原理
本方案采用了非线性双射置乱编码技术,用于对SM4算法中的查找表进行有效地混淆和保护。与传统的线性仿射变换相比,非线性双射的设计显著提高了查找表的安全性,这种设计避免了在白盒实现中常见的、攻击者可能利用的数学特征,从而使得查找表能够成功抵御那些专门针对白盒实现的攻击。此外,本方案还对SM4算法的每一轮加解密计算过程进行了细致的拆分,将其分为个若干独立的部分 ,这一拆分过程遵循了如图1-1所示的构造方法,通过精心设计的置乱编码生成查找表,每一部分都应用了经过特别设计的置乱编码技术,以实现对查找表的混淆。这种混淆机制有效地隐藏了密钥信息,从而在白盒攻击环境下确保了SM4算法的加解密过程的安全性。

图1-1 非线性双射白盒SM4方案架构图
方案具体实现如图1-1所示。其中,Pi,Ei,Fi,Qi,Wi,Ci,Di表示四个并行的8位随机非线性双射,Gi,Hi,Ai,Bi表示四个并行的8位随机仿射变换,而Ai和Bi除了所对应的常数项C中所有元素的值均被置为0之外,变换Ai和Gi完全一致,变换Bi和Hi完全一致。这里所提到的仿射变换可以与有限域GF(2)上的矩阵运算等效,上述四个变换的设计原理在于,对于仿射变换F(X)=M×XT+C,其变换结果在互相进行按位异或操作后,常数部分C会被抵消,即在GF(2)中满足式(1):
F(X)⊕F(Y)=(M×XT+C)⊕(M×YT+C)=M×(X⊕Y)T(1)
在图1-1中,函数Sij如式(2)所示,其中i=0,1,...,31表示加密轮次。rkij是轮密钥rki的组成部分,j=0,1,2,3,如式(3)所示:
Sij(xj)=Sbox(xj⊕rkij)(2)
rki=[rki0,rki1,rki2,rki3](3)
线性变换L可以表示为与一个GF(2)上的32×32位的矩阵L相乘,该矩阵的定义如式(4)所示,其组成元素B1,B2,B3是由1和0组成的矩阵。
L=B1B3B2B2B2B1B3B2B2B2B1B3B3B2B2B1(4)