素域和扩域
作者:互联网
素域(prime field)
有限域也叫伽罗瓦域(galois field),指的是由有限个元素组成的集合,在这个集合内可以执行加、减、乘和逆运算。
而在密码学中,我们只研究拥有有限个元素的域,也就是有限域。
-
域中包含元素的个数称为域的阶。
-
只有当\(m\)是一个素数幂时,即\(m=p^n\)(其中\(n\)为正整数是\(p\)的次数,\(p\)为素数),阶为\(m\)的域才存,\(p\)称为这个域的特征。
也就是说,有限域中元素的个数可以是11(p=11是一个素数,n=1)、可以是81(p=3是一个素数,n=4)、也可以是256(p=2是一个素数,n=8).....但有限域的中不可能拥有12个元素,因为\(12=2·2·3\),因此12也不是一个素数幂。
有限域中最直观的例子就是阶为素数的域,即\(m=p^n,(n=1)\)的域,域中的元素可以用整数\(\left \{0、1、...、p-1 \right \}\) 来表示。
域的两种操作就是整数加法(模p)和整数乘法(模p),\(p\)是一个素数,整数环\(Z\)表示为\(GF(p)\),也成为拥有素数个元素的素数域或者伽罗瓦域。
所以总结:素域就是有素数个元素的有限域,即阶为素数的有限域。
-
\(GF(p)\)中所有的非零元素都存在逆元
-
\(GF(p)\)内所有的运算都是模\(p\)实现的。
素域内的算数运算规则如下:
-
加法和乘法都是通过模\(p\)实现的;
-
任何一个元素\(a\)的加法逆元都是由\(a+(a的逆元)=0(mod p)\)得到的;
-
任何一个非零元素\(a\)的乘法逆元定义为\(a·a的逆元=1(mod p)\)。
例:在素域\(GF(5)=\left \{0、1、2、3、4 \right \}\)中,2的加法逆元为3,这是因为\(2+(3)=5,5mod5=0\),所以\(2+3=5mod5=0\);2的乘法逆元为3,这是因为\(2·3=6,6mod5=1\),所以\(2·3=6mod5=1\)。
在很多地方a的加法逆元用\(-a\)表示,a的乘法逆元用\(a^{-1}\)表示
注:\(GF(2)\)是一个非常重要的素域,也是存在的最小的有限域,由于\(GF(2)\)的加法,即模2加法与异或(XOR)门等价,\(GF(2)\)的乘法与逻辑与(AND)门等价。
加法:\(0+1=1;1+1=0;0+0=0\)
乘法:\(1\times 0=0;1\times 1=1;0\times 0=0\)
扩域(extension field)
如果有限域的阶不是素数,则这样的有限域内的加法和乘法运算就不能用模整数加法和整数乘法模p表示。
阶数不是素数,且大于1的有限域被称为扩展域
为了处理扩展域,我们就要使用不同的符号表示扩展域内的元素,使用不同的规则执行扩展域内元素的算术运算。
例如在扩展域\(GF(2^m)\)中,元素并不是用整数表示的,而是用系数为域\(GF(2)\)中元素的多项式表示,这个多项式最大阶数(degree)为m-1,所以每个元素共有m个系数。比如在AES算法使用的域\(GF(2^8)\)中,每个元素\(A\in GF(2^8)\)都可以表示为:\(A(x)=a_7x^7+a_6x^6+...+a_1x+a_0,a_i\in GF(2)\)
注意:在域\(GF(2^8)\)中这样的多项式共有256个,这256个多项式组成的集合就是扩展域\(GF(2^8)\),每个多项式都可以按一个8位向量的数值形式存储:\(A=(a_7,a_6,...,a_1,a_0)\),像\(x^7,x^6,…x\)等因子都无需存储,因为从位的位置就可以清楚地判断出每个系数对应的幂。
扩域\(GF(2^m)\)内的算数运算规则如下:
- 加减法
例如在AES算法中的密钥加法层中就使用了这部分的知识,但是不是很明显,因为我们通常把扩展域中的加法当作异或运算进行处理了,因为在扩展域\(GF(2^m)\)中的加减法处理都是在底层域\(GF(2)\)内完成的,与按位异或运算等价。假设\(A(x)、B(x)∈GF(2^m)\),计算两个元素之和的方法就是:
\(C(x)=A(x)+B(x)=\sum_{i=0}^{m-1}c_ix^i\),其中$c_i=(a_i+b_i)mod 2 $
两个元素之差的计算公式就是:
\(C(x)=A(x)-B(x)=\sum_{i=0}^{m-1}C_ix^i\),其中$c_i=(a_i-b_i)mod 2=(a_i+b_i)mod 2 $
注:在减法运算中减号之所以变成加号,这就和二进制减法的性质有关了,从上述两个公式中我们发现在扩展域中加法和减法等价,并且与XOR等价(异或运算也被称作二进制加法)。
二进制减法:\((0-1)mod 2=(0+1)mod 2=1;(1-1)mod2=(1+1)mod 2=0\)
- 乘法
例如扩展域的乘法主要运用在AES算法的列混淆层(Mix Column)中,也是列混淆层中最重要的操作。
我们想将扩展域中的两个元素用多项式形式展开,然后使用标准的多项式乘法规则将两个多项式相乘:\(C(x)=A(x).B(x)=(a_{m-1}x^{m-1}+...+a_0).(b_{m-1}x^{m-1}+...+b_0)=c_{2m-2}x^{2m-2}+...+c_0\),其中\(c_0=(a_0.b_0)mod 2,c_1=(a_1.b_0+a_0.b_1)mod 2,...,c_{2m-2}=(a_{m-1}.b_{m-1})mod 2\)
注:通常在多项式乘法中\(C(x)\)的级数会大于\(m-1\),因此需要对此进行化简,而化简的基本思想与素域内乘法情况相似:在素域\(GF(p)\)中,将两个整数相乘得到的结果除以一个素数,化简后的结果就是最后的余数。而在扩展域中进行的操作就是:将两个多项式相乘的结果除以一个不可约多项式,最后的结果就是最后的余数。(这里的不可约多项式大致可以看作一个素数)
这里是不是和多项式环\(R_q=Z_q[x]/(x^n+1)\)很像,留一个疑问:有什么区别?
举例:
参考
https://www.cnblogs.com/chenshikun/p/11667438.html
标签:扩域,元素,GF,素数,加法,mod,素域,乘法 来源: https://www.cnblogs.com/pam-sh/p/16540779.html