对称密码aes,在有限域GF(2^8)下求多项式乘法 Python代码实现

需知

        对于GF(2^8)下多项式相乘的结果g(x)如果超过7次的需要模去不可约多项式m(x):

g(x)mod(m(x))    ;   m(x) = x^{8}+x^{4}+x^{3}+x+1

        同样我们知道:

x^{8}\equiv x^{4}+x^{3}+x+1mod(m(x))

        通过这个我们可以将高次变为低次,如

x^{10}=x^{8}*x^{2}=(x^{4}+x^{3}+x+1)x^{2}=x^{6}+x^{5}+x^{3}+x^{2}

实现原理

        计算多项式相乘时以二进制形式进行,如:

a(x)*b(x)=(x^{5}+x^{4}+x^{2}+1)x^{3}=x^{8}+x^{7}+x^{5}+x^{3}

a(x)*b(x)=110101*1000=110101000

        因为二进制形式的乘法本质上就是进位,如a*100表示进2位,在十进制上就是a*4.

在二进制上a*1010表示:a进3位+a进1位,在GF2^8上便是 a*1000 异或 a*10.

        对于任意的多项式相乘均可如此计算,对于超过7次即二进制位超过8位的,按照需知里面最后一个方法,再将其与后八位的二进制进行异或计算即可,如上述的

110101*1000=110101000=100000000+10101000= 11011\bigoplus 10101000

第二行的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

第一次发布,如有问题多多请教

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值