素域和扩域
素域(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\)
另外素域\(GF(p)\)一般还用符号\(F_p\)表示,记\(F_p^*\)是由\(F_p\)中所有非零元构成的乘法群,即\((1,2,...,p-1)\),又因为\(F_p^*\)是循环群,所以在\(F_p\)中至少存在一个元素\(g\),使得\(F_p\)中任意非零元都可与由\(g\)的一个方幂表示,称\(g\)为\(F_p^*\)的生成元(本原元),即\(F_p^*=\left \{ g^i|0\le i\le p-2 \right \}\)。设\(a=g^i\in F_p^*\),其中\(0\le i\le p-2\),则\(a\)的乘法逆元为\(a^{-1}=g^{p-1-i}\)。
举例:
13是\(F_{19}^*\)的一个生成元,则\(F_{19}^*\)中的元素可以由13的方幂表示出来:
\(\begin{array}{l} 13^{0}=1,13^{1}=13,13^{2}=17,13^{2}=13^{4}=4,13^{5}=10,3^{7}=10,13^{7}=16,13^{9}=18,\\ 13^{10}=6,13^{11}=2,13^{12}=7,13^{14}=5,13^{15}=8,13^{16}=9,13^{17}=3,13^{18}=1 \end{array}\)
扩域(extension field)
如果有限域的阶不是素数,则这样的有限域内的加法和乘法运算就不能用模整数加法和整数乘法模p表示。
阶数不是素数,且大于1的有限域被称为扩展域
为了处理扩展域,我们就要使用不同的符号表示扩展域内的元素,使用不同的规则执行扩展域内元素的算术运算。
设\(q\)是一个素数或素数方幂,\(f(x)\)是多项式环\(F_q[x]\)上的一个\(m(m>1)\)次不可约多项式,商环\(F_q[x]/f(x)\)是含\(q^m\)个元素的有限域,记\(F_{q^m}\),即\(F_{q^m}\)是有限域\(F_q\)的扩域,域\(F_q\)是域\(F_{q^m}\)的子域,\(m\)是扩展次数(因子)。
\(F_{q^m}\)可以看作\(F_q\)上的\(m\)维向量空间,即在\(F_{q^m}\)中存在\(m\)个元素\(\left \{ \alpha_{0},\alpha_{1},...., a_{m-1} \right \}\),使得\(\forall a \in F_{q^{m}}\),\(a\)可以唯一表示为:\(a=a_{m-1}\alpha_{m-1}+...+a_{1}\alpha_{1}\),其中\(a_i\in F_q\),把\(\left\{\alpha_{m-1}, \cdots, \alpha_{1}, \alpha_{0}\right\}\)叫做\(F_{q^m}\)上在\(F_q\)上的一组基。
给定这样的一组基,就可以由向量\(\left(a_{m-1},a_{m-2}...., a_{1}, a_{0}\right)\)来表示域元素\(a\)。
⚠️:这里一个元素可以由一个向量表示,在同态加密的SIMD中有用到!
\(F_{q^m}\)在\(F_q\)上的基有多种选择:多项式基和正规基等,下面简单介绍:
(1)多项式基
-
不可约多项式\(f(x)\)可以取首一多项式\(f(x)=x^{m}+f x^{-n-1}+...+f_{2} x^{2}+f_{1} x+f_{0}\)(其中\(f_i\in F_q,i=0,...,m-1\))
-
\(F_{q^m}\)中的元素由多项式环\(F_q[x]\)中所有次数低于\(m\)的多项式构成,即\(F_{q^m}=\left\{a_{m-1} x^{m-1}+a_{m-2} x^{m-2}+\cdots+a_{1} x+a_{0} \mid a_{i} \in F_{q}, i=0,1, \cdots, m-1\right\}\)
-
多项式集合\(\left\{x^{m-1}, x^{m-2}, \cdots, x, 1\right\}\)是\(F_{q^m}\)作为向量空间在\(F_q\)上的一组基,称为多项式基
-
当\(m\)含有因子\(d(1<d<m)\) 时, \(F_{q^{m}}\) 可以由\(F_{q^{d}}\)扩张生成, 从 \(F_{q^{d}}[x]\) 中选取一个合适的 \(m / d\) 次不可约多项式作为 \(F_{q^{m}}\)在 \(F_{q^{d}}\) 上的不可约多项式,\(F_{q^{m}}\) 可以由塔式扩张方法 (towering method) 得到, 这种扩张的基本形式仍是由\(F_{q}\) 中元素组成的向量
-
例如当 \(m=6\) 时, 可以先由 \(F_{q}\) 经过 3 次扩张得扩域 \(F_{q^{3}}\) ,再由 \(F_{q^{3}}\) 经过 2 次扩张得到扩域 \(F_{q^{5}}\) ; 也可以先由 \(F_{q}\) 经过 2 次扩张得扩域 \(F_{q^{2}}\) , 再由 \(F_{q^{2}}\) 经过 3 次扩张得到扩域\(F_{q^{5}}\)
(2)正规基
\(F_{q^{m}}\)在\(F_{q}\)上形如\(\left\{\beta, \beta^{q}, \beta^{q^{2}}, \cdots, \beta^{q^{m-1}}\right\}\) 的一组基称为正规基, 其中 \(\beta \in F_{q^{m}}\) 。 \(\forall a \in F_{q^{m}}, a\) 可以唯一 表示为: \(a=a_{0} \beta+a_{1} \beta^{q}+\cdots+a_{m-1} \beta^{q^{m-1}}\) , 其中 \(a_{i} \in F_{q}, i=0,1, \cdots, m-1\)。
- 对于任意有限域 $ F_{q}$ 及其扩域\(F_{q^{m}}\) , 这样的基总是存在的。
⚠️:常用的是多项式基表示,以下都是以多项式基表示!
例如在扩展域\(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)\)中,将两个整数相乘得到的结果除以一个素数,化简后的结果就是最后的余数。而在扩展域中进行的操作就是:将两个多项式相乘的结果除以一个不可约多项式,最后的结果就是最后的余数。(这里的不可约多项式大致可以看作一个素数)
举例: