本文为CSDN博主「Yuixz」的原创文章
原文链接:https://blog.csdn.net/u012620515/article/details/49825407
在原文基础上基础上增加了一些内容
字节运算:有限域GF(2^8)上的运算有限域GF(2^8)
- 有限域GF(2^8)表示特征为2的具有2^8个元素的有限域,这里表示成系数在{0,1}中的多项式集合:
b(x)={b7x^7+b6x^6+b5x^5+b4x^4+b3x^3+b2x^2+b1x+b0}
这样任意的8位二进制数就和有限域中的一个多项式建立了一一对应的关系。
- 加法运算
在多项式表示中,GF(2^8)上两个元素的和仍然是一个次数不超过7的多项式,其系数等于两个元素对应的系数的模2加(即异或)。
由于每个元素的加法逆元等于自己,所以减法和加法相同。
- xtime(x)
定义: 函数xtime(x) 定义为GF (2 )上的x·b(x) 。其运算如下:若b 7 =0 ,则x·b(x) 的结果就是把字节b 左移一位,且在最右边补上上0 ;若b 7 =1 ,则先对b(x) 在字节内左移一位(最后一位补0 ),则再与‘1B’ (00011011 )做逐比特异或。
实质上就是将参数的值乘以2,b7=0,则直接左移;b7=1,结果中x8系数为1,则需要减去不可约多项式m(x)=x8+x4+x3+x+1。(11B),即与1B进行异或。
- 乘法运算
在AES算法中,若两个多项式进行乘法运算,运算的方法为两个多项式相乘,若运算的结果超过8次方,则必须对此结果对一个多项式m(x)进行模运算。AES算法 中,这个8次不可约多项式确定为m(x)=x8+x4+x3+x+1。
乘法原理:
在二进制中,所有的数都能用0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80异或得到。
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80的表示如下:00000001,00000010,00000100,00001000,00010000,0010000,01000000,10000000.
举个栗子:
例如,‘57’·‘13’ 可按如下方式实现:
•‘57’·‘02’=xtime(57)=‘AE’ ;
•‘57’·‘04’=xtime(AE)=‘47’ ;
•‘57’·‘08’=xtime(47)=‘8E’ ;
•‘57’·‘10’=xtime(8E)=‘07’ ;
•‘57’·‘13’=‘57’·(‘01’⊕ ‘02’ ⊕‘10’)
• =‘57’⊕ ‘AE’ ⊕‘07’=‘FE’