SM4 Bit Slice 实现

SM4算法是一个分组算法。该算法的分组长度为128 比特,密钥长度为128 比特。加密算法与密钥扩展算法都采用32 轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

由于SM4算法在实现的过程中,要根据内部状态做查表动作,导致其算法的运行时间泄漏了内部状态的值,使得基于Cache时间的攻击能够对SM4产生现实性的威胁。因此,有必要开发一种运行时间与部状态无关的SM4算法,同时,为了提升运算能力,将SM4算法拆成4 bits运算,使得算法在64位的处理器上,最多可以支持16组SM4算法同时进行。

原理说明

算法结构:算法将一个字节的信息按照高位4bit,低位4bit分开存储,因此1个64寄存器可以保存16个高位或者16个低位信息,而一个32位字可以分解成4个高位和4个低位,分开保存在8个64位寄存器内。算法的整体结构基于这种存储结构对标准的SM4算法进行改造,保证单个SM4加密在算法全过程中只使用4bit宽度的存储位,从而在64位寄存器中可以实现16路SM4并行。

S_BOX 拆分实现:SM4的S盒由矩阵运算和8次多项式构成的有限域求逆元运算构成,S盒的一般实现是根据算法的内部状态值,查找内存中表的对应值来实现的,不同的状态值查找的时间可能不同,这也是cache攻击能够产生效果的原因,为了使S盒的查找符合常量时间要求,并满足bit slice算法的结构,对S盒进行拆分,查找过程是输入状态值得4bit高位和4bit低位,输出也是4bit高位和4bit低位,64位寄存器同样可以满足16路并行查找。查表算法中,8bit矩阵运算被分解成4bit内的矩阵运算,而8次多项式构成的有限域求逆,则按照复合域同构映射的方法,先映射到有限域$GF(4^2)$上,在映射到有限域$GF(((2)^2)^2)$上,使得$GF(8)$上的有限域求逆过程,转化成$GF(((2)^2)^2)$上的运算,其求逆运算被降低到了$GF(2)$上的求逆(可以用简单的函数实现)。经过此方法的分解,S盒的查表运算变成一个可以在4bit寄存器内实现,运行时间与输入无关,64位下可以满足16路并行查表的bit slice算法。

16路并行:输入数据为16个分组,每个分组为16字节,数据要分割成16对64位数据,每对64位数据保存16组数据对应字节的高位和低位,经过算法计算,算法密文以同样的结构输出