AES加密(2):GF(256)域
GF(256)域是一个有限域,在密码学中非常常用
什么是有限域/伽罗瓦域(Galois Field)?
顾名思义,有限域就是含有有限个元素的域。
既然是含有有限个元素的域,那么关键点就在于有限和域两个概念。
首先我们看一下域的定义(来自维基百科)):
在抽象代数中,域(Field)是一种可以进行加,减,乘,除(除了除以加法单位元“0”)运算的代数结构。域的概念是数域以及四则运算的推广。
在这里加法和乘法并不是我们所熟悉的加法和乘法。我们把这个域记作$F$,其中加法和乘法满足以下几种特性:
这其中(1)描述了加法与乘法的封闭性,(2),(3),(4)则是我们所熟悉的交换律、结合律和分配律,而(4),(5)分别是对单位元与逆元的定义。
看到这,我们可以很容易的发现:实数集就是一个满足域的定义的集合。确实,域的概念就是由数域推广发展而来的。
但是很显然,实数域并不是一个有限的域。
那么有限域又是怎么回事呢?
有限域显而易见也是满足域的定义的一个集合,但是这个集合却是一个有限集。在有限域上定义的加和乘仍然满足封闭性。这看起来不可能,但实际上这样的域是存在的。有限域中元素的个数叫做阶,任意有限域的阶必然是一个素数的幂。
那GF(256)又是什么呢?
$GF(256)$,就是阶为256的有限域。因为$2^8=256$,所以这个域是存在的。
在$GF(256)$中的任意元素都可以表示成以下形式:
其中$b_i\in{0,1}$。比如说十六进制数0x57
,转换为二进制之后是01010111
,就可以表示成以下形式:
接下来我们来看看$GF(256)$上的运算
加法
我们有两个数0x57
和0x83
,它们都是$GF(256)$的元素。把0x57+0x83
用上面所述的方式表达出来,有下面的式子:
但是由于$b_i\in{0,1}$,所以结果里的每一项的系数都要模2,也就是变为他除以二的余数,得到:
再将其变回16进制形式得到0xd4
。我们把这种运算记作$a\oplus b$。
注意到0x57 ^ 0x83=0xd4
,这里^
指异或。所以我们可以知道$\oplus$与异或是同种运算。
这里看起来有点草率,但这是有道理的。因为异或本质上就是不带进位的二进制加法,而$\oplus$运算也一样,所以这两种确实就是同种运算。
乘法
首先我们得到$GF(2^8)$的本原多项式:
由此得到在$GF(256)$上,$x^8=x^4+x^3+x+1$ (在$GF(256)$上加法与减法是同一种运算,这是由于异或运算是自己的逆运算导致的)。
现在我们有两个数0x57
和0x83
,我们用多项式形式表示出来:
然后:
得到最终结果0xc1
可以证明这种运算在$GF(256)$上满足分配律。
xtime函数
我们定义函数xtime
,其中xtime(a)=a·0x02
,也就是说这个函数的返回值 (或者说是因变量) 是这个函数的参数 (自变量) 在$GF(256)$上与0x02
的乘积。
那这有什么用呢?
我们又有两个数0x57
和0x13
,要求他们在$GF(256)$上的积
首先我们知道:
1 | xtime(0x57)=0xAE |
然后我们应用分配律有:
这样可以简化计算。
GF(256)上的多项式乘法
我们现在有两个多项式如下:
接着又有一个多项式$c(x)=a(x)b(x)$,于是有:
我们再定义一个多项式 (这个多项式也是$GF(16)$上的本原多项式) :
将$c(x)$模去$M(x)$,得到多项式$d(x)$:
同时也可以写成:
我们把这种运算记作$\otimes$,即$a(x)\otimes b(x)=d(x)$
现在我们设$c(x)=x\otimes b(x)$,那么我们有:
把他们转换为二进制形式,可以看到$c$就是将$b$左环移一位得到的结果,也就是说左环移就是在$GF(256)$上乘以0x01
。
GF(256)有什么用?
$GF(256)$上的四则运算是AES加密算法的数学基础,在密码学中有广泛应用。
参考资料: