Sbox 生成原理
Aes 算法的 S 盒是定义在 $GF(2^8)$ 中,使用的不可约多项式为 $x^8+x^4+x^3+x+1$,生成方式为 $S(x)=Ax^{-1}+c$
在 SM4 的官方文档中,仅给出了 Sbox 盒的定义, 并未给出生成方法。进行学术搜索后,在论文 Analysis of the SMS4 Block Cipher 中提到,SM4 算法的 S 盒同样定义在 $GF(2^8)$ 中。使用的不可约多项式为 $x^8+x^7+x^6+x^5+x^4+x^2+1$,生成方式为 $S(x)=A(Ax+c)^{-1}+c$
SM4-SBox 生成方法
伽罗瓦域 $GF(2^8)$ 上的四则运算是基于多项式进行计算的。
- 加法:多项式对应项系数相加,由于每一项的系数都是在 $GF(2)$ 上进行运算,结果要对 2 取模。表现出来就是异或运算。
- 减法:在 $GF(2^8)$ 中,加减法最终都是异或运算。
- 乘法:选取不可约多项式 $x^8+x^7+x^6+x^5+x^4+x^2+1$,当出现大于 $x^8$ 的项时,将 $x^8$ 替换为 $x^7+x^6+x^5+x^4+x^2+1$
- 除法:除以一个多项式等价于乘它的逆元。
在将上述 Sbox 的计算公式翻译为代码时,加减法可以直接使用异或运算完成,乘除法的计算过程相对麻烦,但由于 $GF(2^8)$ 中除去 0 仅有 255 个多项式,可以打表实现:
1 | BIT gen = 0b11110101; |
利用上述 3 个表,我们可以快速实现 $GF(2^8)$ 上的乘除法运算。
之后按照定义将 Sbox 的生成函数写出:
1 | BIT A[] = {0b11100101, 0b11110010, 0b01111001, 0b10111100, 0b01011110, 0b00101111, 0b10010111, 0b11001011}; |
运行结果如下:
1 | 0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05 |
其实这样的方案在硬件实现上并无优势,朴素的实现需要将 Sbox 全部存储下来(利用 ROM),需要存储 256 份的信息。利用 $GF(2^8)$ 进行计算时,也同样需要预先打出逆元的表。
当然,这个方法也不是一无是处,如果能找到 $GF(2^8)\to GF((2^4)^2)$ 的对应方案,便可以不利用 ROM 使用纯粹的组合逻辑实现 SM4-Sbox。
这是作者第一次接触到这部分知识点,难免有疏漏或错误的地方,如果有发现还请指出。