伽罗华域(galois field)的乘法计算(异或法)
本文将会以GF(256)举例在伽罗华域中的计算过程
元素的多项式
GF(256) 是包含 28=256 个元素的有限域,数字可以被表示成一个不可约多项式,
每个元素 a(x) 是 GF(2)[x] 中次数小于8的多项式:
例如
每个乘法计算时先将元素转化成一个不可约多项式再进行乘法计算
例如:计算 0x80 乘以 0x32
0x80:二进制为 10000000
,对应多项式 x7
0x32:二进制为 00110010
,对应多项式 x5+x4+x
乘法
转化完成后直接进行乘法计算:
此时发现已经出现了超过7的次幂,需要做的就是将高次项降次,这里需要用到不可约多项式
不可约多项式
不可约多项式具有如下几个特性:
- 不可约性:多项式 P(x) 在 GF(2)[x] 中无法分解为两个低次多项式的乘积(类似素数在整数中的性质)。
- 消除零因子:若 P(x) 可约(如 P(x)=Q(x)R(x)),则商环中存在零因子 Q(x) 和 R(x),无法构成域。
- 保证域结构:不可约多项式确保每个非零元素在模 P(x) 下都有乘法逆元,从而满足域的四个基本运算性质
简单点说就是GF(256)可以使用的不可约多项式就是在256-512之间的所有质数,它的作用就是在GF域中给高次项将次,通过高次项对不可约多项式取模而降次,常用的不可约多项式有:
在本例子中我们取用的不可约多项式为:
降次
上一节计算0x80乘以0x32得到了3个高次项:
分别对三个高次项降次
替换并合并同类项
将降次后的三个项相加,合并同类项,相同次幂相加为0
将最后计算出的结果转化成16进制:
多项式 x6+x5+x3 对应二进制 01101000
,即十六进制 0x68。
所以:
代码实现
def gf256_multiply(a: int, b: int, poly: int = 0x11B) -> int:"""GF(256) 乘法,直接计算法:param a: 操作数1 (0~255):param b: 操作数2 (0~255):param poly: 不可约多项式 (默认0x11B):return: a × b mod poly"""product = 0for i in range(8): # 遍历b的每一位if b & 1: # 如果当前位为1,异或a到productproduct ^= aa <<= 1 # a左移一位(相当于乘以x)if a & 0x100: # 若a的最高位溢出(超过x^7)a ^= poly # 异或不可约多项式降次b >>= 1 # b右移一位return product