需知
对于GF(2^8)下多项式相乘的结果g(x)如果超过7次的需要模去不可约多项式m(x):
;
同样我们知道:
通过这个我们可以将高次变为低次,如
实现原理
计算多项式相乘时以二进制形式进行,如:
因为二进制形式的乘法本质上就是进位,如a*100表示进2位,在十进制上就是a*4.
在二进制上a*1010表示:a进3位+a进1位,在GF2^8上便是 a*1000 异或 a*10.
对于任意的多项式相乘均可如此计算,对于超过7次即二进制位超过8位的,按照需知里面最后一个方法,再将其与后八位的二进制进行异或计算即可,如上述的
第二行的11011为超过八位的1即x的八次方转换为x^{4}+x^{3}+x+1的二进制形式
在代码里面11011写作十进制数27,a进x位用a<<x表示,a异或b为a^b(ab为十进制数,具有二进制同样效果,因此无需转换)
代码实现如下
a,b = '0xd6','0x59'#示例数
def GF2_8(a,b):
a = format(eval(a),'08b')#format将传入参数a转为八位二进制11010110,为字符串类型
b = eval(b)#将b转为整数
c = b*eval(a[-1])#c为a的常数项与b相乘
for x in range(1,8):#a剩下的7位代表是否左移和左移位数
d = eval(a[7-x])
if d:#判断是否左移
d = b<<x#d为将b左移x位的结果
c = c^d#c与d异或
while len(format(c,"0b"))>8:
#判断c的二进制位是否超过八位,超过就降次
d = eval('0b'+format(c,"0b")[-8:])#后八位
c = '0b'+format(c,"0b")[:-8]#高出7次方的前几位
#加上'0b'是为了让计算机知道这个是二进制
l = len(c)
for x in range(l-2):
if eval(c[x+2]):#判断是否需要降次
d ^= 27<<(l-x-2)
#27为文章里面的11011,l-x-2为需要进位的次数,如10次方需要进2位
c = d
#交换位置,以便下一次检测循环
return c
第一次发布,如有问题多多请教