一、前言
伽罗瓦域上的乘法在包括加/解密编码和存储编码中经常使用,常见的AES 和Reed-Solomon
编码就使用了伽罗瓦域GF(28) 中的运算。以2 或者2w
形式的伽罗瓦域来说,加减法都是异或运算,乘法相对较复杂一些,本文就GF(2w)
上有限域的乘法运算和优化进行分析。现代计算机是为二进制普通运算所设计,对伽罗瓦域计算最多仅有指令集上的优化,而且仅限于某些处理器,因此在更高层次上优化伽罗瓦域上的乘法显得尤为重要。
二、本原多项式
域中不可约多项式(primitive
polynomial)是不能够进行因子分解的多项式,本原多项式是一种特殊的不可约多项式。当一个域上的本原多项式确定了,这个域上的运算也就确定了,本原多项式一般通过查表可得,同一个域往往有多个本原多项式。通过将域中的元素化为多项式的形式,可以将域上的乘法运算转化为普通的多项式乘法模以本原多项式的计算。比如g(x)
= x3+x+1 是GF(23)上的本原多项式,那么GF(23)
域上的元素3*7 可以转化为多项式乘法:
3*7(in GF(23)) →
(x+1)*(x2+x+1) mod g(x) = x3+1 mod
x3+x+1 = x → 3*7 = 2 (in GF(23))
需要注意的是,系数为2 的整数倍会被约去。
三、乘二运算
无论是普通计算还是伽罗瓦域上运算,乘二计算是一种非常特殊的运算。普通计算在计算机上通过向高位的移位计算即可实现,伽罗瓦域上乘二也不复杂,一次移位和一次异或即可,并且2
是GF(28)
中的生成元。从多项式的角度来看,伽罗瓦域上乘二对应的是一个多项式乘以x,如果这个多项式最高指数没有超过本原多项式最高指数,那么相当于一次普通计算的乘二计算,如果结果最高指数等于本原多项式最高指数,那么需要将除去本原多项式最高项的其他项和结果进行异或,在硬件中是这样实现的(g(x)
= x8+x4+x3+x2+1):
x7 ← x6 ←
x5 ← x4 ← x3 ←
x2 ← x1 ←
x0
↓____________↑___↑___↑_________↑
这里x0到x7
分别代表域中一个数的比特位,每次乘二除最高位不移位,其余各位向高位移一位,最高位和指定位进行异或(由本原多项式决定)。不难知道最高位异或的那几位对应着本原多项式系数为1
的几项。
用C 语言可以写成:
1: uint8_t c, cc;
2: cc = (c<<1)^((c&0x80)?0x1d:0)
c&0x80 可以判断数c 最高位是否为1,如果为1 则异或ox1d。
四、一个例子
本节通过一个例子来看看在有限域内做乘法有哪些方法,