前一阵密码学课上学AES,其中的字运算用到了一些数学上的知识。做作业的时候是很懵,网上搜了搜也没找到看着特别清楚的教程。不过很感谢老师布置的作业量蛮大的,不悟一些奇技淫巧出来怕是头上有点凉,做着做着就忽然悟出一些技巧来,寻思着发篇博客,不求让别人看了夸我,起码过一阵以后自己回顾一下还能够想起当初的奇技淫巧
1.有限域 G F ( 2 8 ) GF(2^8) GF(28)
设 F 2 F_2 F2是由0和1构成的二元域,用 F 2 [ x ] F_2[x] F2[x]表示在 F 2 F_2 F2上的多项式环,找到一个8次不可约多项式 m ( x ) m(x) m(x)(在AES的Rijndeal算法中,约定了 m ( x ) = x 8 + x 4 + x 3 + x 1 + x 0 ) m(x)=x^8+x^4+x^3+x^1+x^0) m(x)=x8+x4+x3+x1+x0),那么 F 2 [ x ] / m ( x ) F_2[x]/m(x) F2[x]/m(x)就是一个有限域 G F ( 2 8 ) GF(2^8) GF(28)
这个有限域其实可以看成与一个字节一一对应—— x k x^k xk前的系数就表示第k位的值,比如说:
x 7 + x 5 + x 2 + x + 1 x^7+x^5+x^2+x+1 x7+x5+x2+x+1就可以和 10100111 10100111 10100111对应起来
在这个域上就可以定义一些运算
(1)加法
这个因为是定义在 F 2 F_2 F2上的,所以其实多项式的系数就是模二加,或者理解为 ⊕ \oplus ⊕异或也可以
比如说
10100011 + 00100100 = 10000111 10100011+00100100=10000111 10100011+00100100=10000111
或者表示为
f 1 ( x ) = x 7 + x 5 + x + 1 f_1(x)=x^7+x^5+x+1 f1(x)=x7+x5+x+1
f 2 ( x ) = x 5 + x 2 f_2(x)=x^5+x^2 <