文章目录
一、前言
在写这篇博客前,笔者刚赶完密码学与信息安全的实验报告,用了一天把这个问题涉及的算法仔仔细细啃了一遍,忍不住想写一篇博客。为什么呢?因为笔者昨天在查找资料时真的吐槽到无力!!各大博客网站的博文基本就那几篇,搬来搬去也不加自己的理解,甚至代码都没自己调通一遍。。。另外S_box相关问题的博文倒有几篇不错的,可惜基本都是C或者Java写的,终于看到一个Python的了,那代码冗杂得完全就是C直接翻译过来的,重点还是错的。。。最后,声明一下,笔者上课基本睡觉,涉及的知识基本就这两天看的William Stallings的那本密码编码学P86页,所以知识水平不高,以下写的内容,目标都是编出能用且优雅的代码,Heavy Math只说明不解释。
笔者期望好好写篇关于AES乘法逆元的博文,力求讲清楚每个算法,以免后来人爬我爬过的坑,如果你在这篇文章找到了解决方案,点个赞再走呗(づ ̄3 ̄)づ╭❤~
二、数学基础
1、GF(2⁸)有限域内的多项式
规定GF(2⁸)中的多项式
f ( x ) = a 7 x 7 + a 6 x 6 + ⋯ + a 1 x + a 0 = ∑ i = 0 7 a i x i f(x)=a_{7}x^{7}+a_{6}x^{6}+\cdots+a_1x+a_0=\sum_{i=0}^{7}a_ix^i f(x)=a7x7+a6x6+⋯+a1x+a0=i=0∑7aixi
其系数 a i a_i ai 只能为1或者0,则该多项式可以由组成它的二进制系数 ( a 7 , a 6 , a 5 , a 4 , a 3 , a 2 , a 1 , a 0 ) (a_7,a_6,a_5,a_4,a_3,a_2,a_1,a_0) (a7,a6,a5,a4,a3,a2,a1,a0) 组成。将这些数字按高位到低位排列,则可以形成一个二进制整数,整数的范围为0~256,代表了有限域中的256个多项式。
2、不可约多项式
大部分场景,包括S_box问题中,都遇到一个特殊的多项式 m ( x ) = x 8 + x 4 + x 3 + x + 1 m(x)=x^8+x^4+x^3+x+1 m(x)=x8+x4+x3+x+1 ,称之为不可约多项式。
简单来说,相当于自然数中的质数,也就是它的的因式只有1和它本身,所以称为不可约多项式。
3、多项式模运算
到了这里,笔者开始飞炸,觉得自己15年读了个假数学。。。认真看了会书,笔者才看懂,原来多项式运算分为3种:
- 使用代数基本规则的普通多项式运算
- 系数运算是模 p p p 运算的多项式运算,即系数在 G F ( p ) GF(p) GF(p) 中
- 系数在 G F ( p ) GF(p) GF(p) 中,且多项式被定义为模一个 n n n 次多项式 m ( x ) m(x) m(x) 的多项式运算
所以,我们的乘法逆元要用到的就是第三种,也就是按正常运算完后再对一个 m ( x ) m(x) m(x) 取余数,才是最终运算结果。惊了吧,15年就只学了个普通数学!!!
接下来笔者就举一个例子,各位读者。。爱看不看。。
现在假设这个 m ( x ) m(x) m(x) 就是我们刚才说的不可约多项式 m ( x ) = x 8 + x 4 + x 3 + x + 1 m(x)=x^8+x^4+x^3+x+1 m(x)=x8+x4+x3+x+1,对于多项式 f ( x ) = x 6 + x 4 + x 2 + x + 1 f(x)=x^6+x^4+x^2+x+1 f(x)=x6+x4+x2+