声明:本篇博文的内容摘自于《密码编码学与网络安全》这本书。
群、环和域都是数学理论中的一个分支,即抽象代数或称为近世代数的基本元素。在抽象代数中,我们关心的是其元素能进行代数运算的集合,也就是说,我们可以通过很多种方法,使集合上的两个元素组合得到集合中的第三个元素。这些运算方法都遵守特殊的规则,而这些规则又能确定集合的性质。根据约定,集合上元素的两种主要运算符号与普通数字的加法和乘法所使用的符号是相同的。然而,我们必须指出,在抽象代数中,我们并不仅仅限于普通的算术操作。
群
群G,有时记为{G, . },是定义了一个二元运算的集合,这个二元运算可表示为 . ,G中的每一个序偶(a,b)通过运算生成G中的元素(a.b),并满足以下公理: (A1)封闭性:如果a和b都属于G,则a.b也属于G。 (A2)结合律:对于G中任意a,b,c,都有(a.b).c=a.(b.c)成立。 (A3)单位元:G中存在一个元素e,对于G中任意元素a,都有a.e=e.a=a。 (A4)逆元:对于G中任意元素a,G中都存在一个元素a',使得下式成立:a.a'=a'.a=e 如果一个群的元素是有限的,则该群称为有限群,并且群的阶就等于群中元素的个数。否则,称该群为无限群。 一个群如果还满足以下条件,则称为交换群: (A5)交换律:对于G中任意的元素a,b,都有a.b=b.a成立。
循环群
我们在群中定义求幂运算为重复运用群中的运算,如a3=a.a.a。而且,我们定义a0=e作为单位元;并且a-n=(a')n,其中a'是a在群内的逆元算。如果群G中的每一个元素都是一个固定元素a(a属于G)的幂ak(k为整数),则称群G是循环群。我们认为元素a生成了群G,或者说a是群G的生成元。循环群总是交换群,它可能是有限群或无限群。
环
环R,有时记为{R,+,x},是一个有两个二元运算的集合,这两个二元运算分别称为加法和乘法,且对于R中的任意元素a,b,c满足以下公理。 (A1~A5)R关于加法是一个交换群;也就是说,R满足从A1到A5的所有原则。对于此种情况下的加法群,我们用0表示其单位元,-a表示a的逆元。 (M1)乘法的封闭性:如果a和b都属于R,则ab也属于R。 (M2)乘法的结合律:对于R中的任意元素a,b,c,有a(bc)=(ab)c成立。 (M3)分配律:对于R中的任意元素a,b,c,下面两个式子总成立: a(b+c)=ab+ac (a+b)c=ac+bc 本质上说,环就是一个集合,我们可以在其上进行加法、减法[a-b=a+(-b)]和乘法而不脱离该集合。 环如果还满足以下条件,则称为交换环。 (M4)乘法的交换律:对于R中任意元素a,b,有ab=ba成立。 下面,我们定义整环,它是满足以下公理的交换环: (M5)乘法单位元:在R中存在元素1,使得对于R中的任意元素a,有a1=1a=a成立。 (M6)无零因子:如果有R中元素a,b,且ab=0,则必有a=0或b=0。
这里简单总结一下,群是定义了一个二元运算的集合而环是定义了两个二元运算的集合。循环群是由一个元素生成的集合。
域
域F,有时记为{F,+,x},是有两个二元运算的集合,这两个二元运算分别称为加法和乘法,且对于F中的任意元素a,b,c 满足以下公理: (A1~M6)F是一个整环;也就是说F满足从A1到A5以及从M1到M6的所有原则。 (M7)乘法逆元:对于F中的任意元素a(除0以外),F中都存在一个元素a-1使得下式成立: aa-1=(a-1)a=1;
注意:乘法逆元是域中的概念。 本质上说,域就是一个集合,我们可以在其上进行加法、减法、乘法和除法而不脱离该集合。除法又按以下规则来定义:a/b=a(b-1)。
有限域GF( p )
无限域在密码学中没有特别的意义,然而,有限域却在许多密码学算法中扮演着重要的角色。有限域的阶(元素的个数)必须是一个素数的幂pn,n为正整数。阶为pn的有限域一般记为GF(pn),GF代表Galois域,以第一位研究有限域的数学家的名字命名。我们在此要关注两种特殊的情形:n=1时的有限域GF(p),它和n>1的有限域相比有着不同的结构。
阶为p的有限域
模算术是一种整数算术,它将所有整数约减为一个固定的集合[0,1,... ,n-1],其中n为某个整数。任何这个集合外的整数通过除以n取余数的方式约减到这个范围内。 在此之前先复习一下模运算:
模数
如果a是整数,n是正整数,则我们定义a模n是a除以n所得的余数。整数n称为模数。因此,对于任意整数a,我们总可以写出 a=qn+r 0<=r 11 mod 7=4; -11 mod 7=3 如果(a mod n)=(b mod n),则我们称整数a和b是模n同余的。可以表示为a同余b 模运算有如下性质: (1)如果n|(a-b),那么a与b模n同余。 (2)a与b模n同余隐含b与a模n同余。 (3)a与b模n同余并且b与c模n同余,那么隐含a与c模n同余。 运算(mod n)将所有的整数映射到集合{0,1,...,(n-1)} 定义比n小的非负整数集合为Zn: Zn={0,1,...,(n-1)}这个集合被称为剩余类集,或模n的剩余类。更准确地说,Zn中每一个整数都代表一个剩余类,我们可以将模n的剩余类表示为[0],[1],[2],...,[n-1],其中 [r]={a:a是一个整数,a同余r(mod n)} 比如模4的剩余类为: [0]={...,-16,-12,-8,-4,0,4,8,12,16,....} [1]={...,-15,-11,-7,-3,1,5,9,13,17,...} 在剩余类的所有整数中,我们通常用最小非负整数来代表这个剩余类。寻找与k是模n同余的最小非负整数的过程,称为模n的k约化。 Zn(是有乘法单位元的交换环)中整数运算的性质: 交换律:(w+x)mod n =(x+w) mod n (w * x) mod n =(x * w) mod n 结合律:[(w+x)+y] mod n=[w+(x+y)] mod n [(wx)y] mod n=[w(xy)] mod n 分配律:[w*(x+y)] mod n=[(wx)+(wy)] mod n 单位元:(0+w) mod n =w mod n (1*w) mod n=w mod n 加法逆元(-w):对于Zn中的任意w,存在一个z使得w+z同余0 mod n。 令a与n互素,如果(ab)同余(ac)(mod n),那么b同余c (mod n) 。 对于任何一般的模数n,如果a和n有任何公因子的话,用乘数a依次作用于0到n-1的所有整数将不会产生一个完整剩余类集。一般来说,如果一个整数与n互素,那么它在Zn中有一个乘法逆元。 给定一个素数p,元素个数为p的有限域GF(p)被定义为整数{0,1,...,p-1}的集合Zp,其运算为模p的算术运算。 当p值较小时,求GF(p)中元素的乘法逆元很容易。你只需构造一个乘法表,所要的结果可以从中直接读出。但是,当p值比较大时,这种方法是不切实际的。 如果a和b互素,则b有模a的乘法逆元。也就是说,如果gcd(a,b)=1,那么b有模a的乘法逆元。即对于正整数b-1-1=1 mod a。如果a是素数并且b-1 更一般地,对于任意的n,扩展Euclid算法可以用于求取Zn内的乘法逆元。如果运用扩展Euclid算法于方程nx+by=d,并且得到d=1,则在Zn内有y=b-1。 在本节中,我们说明了如何构造阶为p的有限域,其中p为素数。特别地,我们定义GF(p)具有如下性质: (1)GF(p)由p个元素组成 (2)集合上定义了二元运算符+和x。加、减、乘、除可以在集合内进行。除了0外,集合内的其他元素都有乘法逆。 我们说明了GF(p)的元素是整数{0,1,...,p-1},算术运算是模p的加法和乘法。 单变元多项式运算分为三种: 1.使用代数基本规则的普通多项式运算。 2.系数运算是模p运算的多项式运算,即系数在GF(p)中。 3.系数在GF(p)中,且多项式被定义为模一个n次多项式m(x)的多项式运算。 一个n次多项式(n>=0)的表达形式如下: f(x)=anxn+an-1xn-1+....+aixi+a1x+a0 其中ai是某个指定数集S中的元素,该数集称为系数集,且an!=0。我们称f(x)是定义在系数集S上的多项式。 零次多项式称为常数多项式,仅仅是系数集里的一个元素。如果an=1,那么对应的n次多项式就被称为首1多项式。 多项式运算包含加法、减法和乘法,这些运算是把变量x当做集合S中的一个元素来定义的。除法也以类似的方式定义,但这时要求S是域。这些域包括 实数域、有理数域和素数p的域Zn。注意整数集并不是域,也不支持多项式除法运算。 现在我们考虑这样的多项式,它的系数是域F的元素。我们称其为域F上的多项式。这种情况下,容易看出这样的多项式集合是一个环,称为多项式环。也 就是说,如果我们把每个不同的多项式视为集合中的元素,这个集合是一个环。 对域上的多项式进行多项式运算时,除法运算是可能的。注意这并不是说能进行整除。这里要注意不同的域上的除法的运算规则不同。如果试图在非域系数集 上进行多项式除法,我们会发现除法运算并不总是有定义的。即使系数集是一个域,多项式除法也不一定是整除。一般说来,除法会产生一个商式和一个余式。 对于域上的多项式,给定n次多项式f(x)和m(m<=n)次多项式g(x),如果用g(x)除f(x),我们得到一个商q(x)和一个余数r(x),满足如下关系式: f(x)=q(x)g(x)+r(x) 各多项式的次数为: Degree f(x)=n Degree g(x)=m Degree q(x)=n-m Degree r(x)<=m-1. 如果允许余数,我们说域上多项式除法是可以的。 域F上的多项式f(x)被称为不可约的(既约的)当且仅当f(x)不能表示为两个多项式的积[两个多项式都在F上,次数都低于f(x)的次数]。与整数相似,一个不可约多项式也被称为素多项式。约的时候注意多项式整除的意义,在不同的域上运算是不一样的。 我们可以通过定义最大公因式来扩展域上的多项式运算和整数运算之间的相似性。如果 (1)c(x)能同时整除a(x)和b(x) (2)a(x)和b(x)的任何公共因式都是c(x)的因式。 就称多项式c(x)为a(x)和b(x)的最大公因式。 本节我们讨论了一般多项式的算术。在一般多项式算术里,变量不予赋值,即我们不给多项式的变量赋值。相反,运用代数的一般规则对多项式进行算术操作(加、减、乘、除)。除非系数是域的元素,否则多项式除法是不行的。 有限域的元素个数必须为pn,其中p为素数,n为正整数。注意到,当n>1时,pn上的多项式在模pn运算时并不能产生一个域。 实际上所有的加密算法(包括对称密钥和公开密码算法)都涉及整数集上的算术运算。如果某种算法使用的运算之一是除法,那么我们就必须使用定义在域上的运算。为了方便使用和提高效率,我们希望这个整数集中的数与给定的二进制位数所能表达的信息一一对应而不出现浪费。也就是说,我们希望这个整数集的范围从0到2n-1,这样正好对应一个n位的字。 我们要寻找一个包含2n个元素的集合,其上定义了加法和乘法使之成为一个域。我们给集合的每一个元素赋值为0~2n-1之间的唯一整数。请记住我们不会用模算术,因为那样不能构成域。我们将会用多项式算术来构造我们需要的域。 设集合S由域Zp上次数小于等于n-1的所有多项式组成。每一个多项式具有如下形式: f(x)=an-1xn-1+an-2xn-2+.....+a1x+a0 其中,ai在集合{0,1,...,p-1}上取值。S中共有pn个不同的多项式。如果定义了合适的运算,那么每一个这样的集合S都是一个 有限域。定义由如下几条组成: (1)该运算遵循代数基本规则中的普通多项式运算规则及如下两条限制。 (2)系数运算以p为模,即遵循有限域Zp上的运算规则。 (3)如果乘法运算的结果是次数大于n-1的多项式,那么必须将其除以某个次数为n的既约多项式m(x)并取余式。对于多项式f(x),这个余数 可表示为r(x)=f(x) mod m(x)。 高级加密标准(AES)使用有限域GF(28)上的运算,其中既约多项式m(x)=x8+x4+x3+x+1. 和简单模运算类似,多项式模运算中也有剩余类集合的概念。设m(x)为n次多项式,则模m(x)剩余类集合有pn个元素,其中每个元素 都可以表示成一个m次多项式( m 以n次既约多项式m(x)为模的所有多项式组成的集合是一个有限域,所有具有相同阶的有限域都是同构的,即任意两个具有相同阶的有限域具有相同 的结构,但是元素的表示和标记可能不同。 正如Euclid算法可以用来求两个多项式的最大公因式,扩展Euclid算法则可以用来求一个多项式的乘法逆元。如果多项式b(x)的次数小于a(x)的次数 且gcd[a(x),b(x)]=1,那么该算法能求出b(x)以a(x)为模的乘法逆元。若a(x)为既约多项式,即除了本身与1之外没有其他因式,则始终有gcd[a(x),b(x)]=1. 算法的描述方式和整数情形的扩展Euclid算法一样。给定两个多项式a(x)和b(x),其中a(x)的次数大于b(x)的次数。我们希望解如下方程获得v(x),w(x)以及 d(x),其中d(x)=gcd[a(x),b(x)] : a(x)v(x)+b(x)w(x)=d(x) 如果d(x)=1,则w(x)是b(x)模a(x)的乘法逆。 GF(2n)中的多项式 f(x)=an-1xn-1+an-2xn-2+...+a1x+a0 可以由它的n个二进制系数(an-1an-2...a0) 唯一地表示。因此GF(2n)中的每个多项式都可以表示成 一个n位的二进制整数。 我们发现这里的多项式加法是将相应的系数分别相加,而对于Z2上的多项式,加法其实就是异或(XOR)运算。所以,GF(2n)中的 两个多项式加法等同于按位异或运算。 简单的异或运算不能完成GF(2n)上的乘法。但是可以使用一种相当直观且容易实现的技巧。 一般地,在GF(2n)上对于n次多项式p(x),有xn mod p(x) =p(x)-xn。 在GF(2)中,模2的加法和减法是等价的,加法等价于XOR运算,乘法等价于逻辑与运算。 现在考虑GF(28)上的多项式f(x)=b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x+b0,将它乘以x,可得 xf(x)=(b7x8+b6x7+b5x6+b4x5+b3x4+b2x3+b1x2+b0x) mod m(x) 如果b7=0,那么结果就是一个次数小于8的多项式,已经是约化后的形式,不需要进一步计算。如果b7=1,那么可以使用xn mod p(x) =p(x)-xn进行模m(x)的约化: xf(x)=(b6x7+b5x6+b4x5+b3x4+b2x3+b1x2+b0x) +(x4+x3+x+1) 这表明乘以x(即00000010)的运算可以通过左移一位后再根据条件按位异或(00011011)来实现。总结为如下的公式: 乘以x的更高次幂可以通过重复使用上式来实现。这样一来,GF(28)上的乘法可以用多个中间结果相加的方法实现。 定义有限域GF(2n)的另一种等价方式有时更方便,它使用相同的不可约多项式。首先,我们需要两个定义:阶为q的有限域F的生成元是一个元素,记为g,该元素的前q-1个幂构成了F的所有非零元素,即域F的元素为0,g0, .... ,gq-2。 考虑由多项式f(x)定义的域F,如果F内的一个元素b满足f(b)=0,则称b为多项式的f(x)的根。(这里注意不是要求这个方程的数值解,只是处理多项式算术) 最后,可以证明一个不可约多项式的根g是这个不可约多项式定义的有限域的生成元。 通常,对于由不可约多项式f(x)生成的域GF(2n),有gn=f(g)-gn。计算gn+1 到g2n-2的值。域的元素对应g的方幂:g0到g2n-2,另外再加上0元素。域元素的乘法用等式gk=gk mod (2n-1)进行,k为任意整数。 这篇文章的内容摘自《密码编码学与网络安全》这本书,最后,我要强调的是GF(28)有限域的运算一定要搞懂,因为在写AES算法以及调试AES算法时我们会用到。同余的性质
模运算的性质
在GF(p)中求乘法逆元
多项式运算
普通多项式运算
系数在Zp中的多项式运算
求最大公因式
有限域 GF(2n)
多项式模运算
求乘法逆元
计算上的考虑
加法
乘法
使用生成元
写在最后