前一阵密码学课上学AES,其中的字运算用到了一些数学上的知识。做作业的时候是很懵,网上搜了搜也没找到看着特别清楚的教程。不过很感谢老师布置的作业量蛮大的,不悟一些奇技淫巧出来怕是头上有点凉,做着做着就忽然悟出一些技巧来,寻思着发篇博客,不求让别人看了夸我,起码过一阵以后自己回顾一下还能够想起当初的奇技淫巧
1.有限域
GF(28)
设
F2是由0和1构成的二元域,用
F2[x]表示在
F2上的多项式环,找到一个8次不可约多项式
m(x)(在AES的Rijndeal算法中,约定了
m(x)=x8+x4+x3+x1+x0),那么
F2[x]/m(x)就是一个有限域
GF(28)
这个有限域其实可以看成与一个字节一一对应——
xk前的系数就表示第k位的值,比如说:
x7+x5+x2+x+1就可以和
10100111对应起来
在这个域上就可以定义一些运算
(1)加法
这个因为是定义在
F2上的,所以其实多项式的系数就是模二加,或者理解为
⊕异或也可以
比如说
10100011+00100100=10000111
或者表示为
f1(x)=x7+x5+x+1
f2(x)=x5+x2
f1(x)+f2(x)=x7+x2+x+1
也就是说如果表示成字节加法的时候,是不向高位进位的
(2)乘法
这里是头秃第一步
乘法其实就是简单的多项式乘法,不过注意累加的时候要按上面的模二加法来做,结果还要模掉
m(x)求余
乘法就不说了,简单说一下模运算,如
x6+x5+x3+x2+1(modx4+x)
解决思路是从被除多项式的最高项开始逐个击破直到余项小于除数多项式
x2×(x4+x)=x6+x3
(x6+x5+x3+x2+1)−(x6+x3)=x5+x2+1
x×(x4+x)=x5+x2
(x5+x2+1)−(x5+x2)=1
∴x6+x5+x3+x2+1(modx4+x)=1
(3)求逆元
求逆元是真的最令人头秃的
如果是自己写程序来做的话可以用遍历的方式实验有限域内每一个多项式与给定的多项式相乘
手算可以用广义Euclid算法,之前看到一位大佬用矩阵法做的(本质还是广义Euclid),思路很清楚,不知道贴个链接可不可以扩展欧几里得算法(Bezout恒等式)求有限域上多项式的乘法逆元
2.系数在
GF(28)上的多项式
GF(28)[x]
类似于上面的定义,可以建立一个
GF(28)[x]/n(x),令这里的
n(x)是一个四次不可约多项式
那么我们就可以得到一个系数为一个字节的三次多项式,比如
′AE′x3+′02′x2+′C5′x+′7E′
(1)加法
加法其实和上面一样是十分trivial的
(2)乘法
这里的乘法一度迷惑了我很久,因为书上在一开始指明了Rijndeal中用到的
n(x)=x4+1,所以后面啥过程也没有就直接给了一个结果公式,可偏偏老师就给出了一个
n1(x)=x4+x+1的题
经过仔细的观察和充分的验证以及无尽的脱发,发现了一个简单的技巧
首先因为多项式是3次的,所以初始结果最高为6次
当
n(x)=x4+1的时候,
x6(modx4+1)=x2,所以只需要把
x6的系数放在
x2上面就可以,类似的这样操作下来,如果用
k0,..,k6来表示初始结果对应次数的系数,用
p0,..,p6表示最终结果对应次数的系数
那么就可以得到
p0=k0+k4
p1=k1+k5
p2=k2+k6
p3=k3
那么当我们把
n(x)=x4+1换成
n1(x)=x4+x+1的时候,
x6(modx4+x+1)=x3+x2,所以就需要把
x6的系数放在
x3和
x2上面,同样用上面的表示方法就可以得到
p0=k0+k4
p1=k1+k4+k5
p2=k2+k5+k6
p3=k3+k6
大概就这样吧,要出去夜跑了