dustland

dustball in dustland

抽象代数

抽象代数

参考教材:密码编码学与网络安全

AES加密的数学基础

第一遍读感觉教材上对数学基础(群环域,多项式运算)P72-P91给的莫名奇妙

然后参考了知乎回答对群环域的解释

此时第二遍读教材,发现其实教材在讲每一部分的开始都写了为什么要讲.

学习这部分一定要明确目的,在陷入定理的证明时或者公式应用时时刻想想是在干什么

引入多项式构造GF(pn)这一想法真的太神奇了,将整数上的数论定理应用于多项式也真的太神奇了

另,教材P74页的图4.2是有错误的

抽象代数基础

图片来自代数结构入门:群、环、域、向量空间 - 知乎 (zhihu.com)

代数结构入门:群、环、域、向量空间

<G,·>表示一个定义了二元关系·的集合(注意这里·不一定是乘号,可以是所有二元关系的抽象表示)

如果G满足:

A1封闭性:a,bGa·bb

A2结合律:a,bG,a·(b·c)=(a·b)·c

A3单位元:\existeG,aG,e·a=a·e=a

A4逆元:aG,\exista1,a·a1=a1·a=e

这里1不是一定是-1次幂,只是逆元的表示形式

集合G+A1+A2+A3+A4=群G

<Z,+>就是一个群

<N,+>就不是一个群,因为如果定义单位元是0,那么1的逆元就是-1,但是-1不在自然数范围内,满足A1A2A3但是不满足A4的代数系统被称为幺半群

变换群

设A是一非空集合,G是A到A的映射集合,如果G关于运算*构成一个群,则称<G,>是集合A上的一个变换群,简称变换群

置换群

设A是一非空有限集合,则A上的一个变换群就是A的一个置换群,简称置换群

交换群

A5交换律:a,bG,a·b=b·a

群G+A5=交换群G

l

<R,+,×>R是一个有两种二元运算的集合,这两种二元运算分别为加法+和乘法×

已知<R,+>是交换群

如果R再满足

M1乘法封闭性:a,bR,a×bR

M2乘法结合律:a,b,cR,a×(b×c)=(a×b)×c

M3乘法对加法的分配律:a,b,cR,{a×(b+c)=a×b+a×c(a+b)×c=a×c+b×c

注意这里没有写a×(b+c)=(b+c)×a

因为这样写实际上是满足乘法交换律,而满足分配律不一定满足交换律,比如矩阵乘法

矩阵的左右乘结果一般是不一样的,但是矩阵乘法对矩阵加法是有结合律的

则称R为环

交换环

如果环R再满足

M4乘法交换律:a,b,cR,(a×b)×c=a×(b×c)

显然Rn(Q)是环但不是交换环

则称R为交换环

整环

如果交换环R再满足

M5乘法单位元:\existe,aR,e×a=a×e=a

R=S为整数时,e=1

R=Rn(Q),n阶实数矩阵集合,e=E(n)n阶单位矩阵

M6无零因子,:a,bR,a×b=0a=0 or b=0

则称R为整环

怎么理解"无0因子"?

显然Rn(Q)不满足M6,因为两个矩阵A,B乘积是个0矩阵并不能说明A或者B矩阵有至少一个是零矩阵

比如

A=[0 0 00 0 00 0 1]     B=[0 0 10 0 00 0 0] 又如,

Z6={0,1,2,3,4,5},

定义Z6上的乘法ab=(a×b )mod 6

定义Z6上的加法ab=(a+b)mod 6

显然Z6满足A1A5,M1M5

但是<Z6,+,×>不满足无零因子,比如

23=(2×3)mod 6=6mod 6=0

就是说,0这个元素一定也是在集合R中存在的,并且乘法运算结果为0一定和引入这个元素0有关

<R,+,×>为一个整环,如果R再满足

M7乘法逆元:a0R,\exista1R,a×a1=1则称a1为a的乘法逆元

注意乘法逆元也是R中的

定义乘法逆元的作用实际上是可以使用除法,除以一个数等于乘以该数的乘法逆元

比如对于<Z7,+,×>,由拓展欧几里得定理可知,由于模数为7是一个质数,因此0到6都存在Z7上的mod 7意义下的乘法逆元

再比如全体整数就不是任何元素都有乘法逆元,只有1和-1有乘法逆元,任何绝对值大于1的整数其乘法逆元应该是分数,不属于整数.

则称R为域F

有限域GF(p)

符号意义:

GF(p)=<Zp,,>

GF:GaloisField,伽罗华域

p:表示一个正素数

:a,bZp,ab=(a+b) mod p即模p加法

:a,bZp,ab=(a×b) mod p即模屁乘法

为什么一定要求是一个素数?

当N为一个合数的时候ZN={1,2,3,...,N2,N1}不满足M6无零因子,不是整环,因此不是域

为什么不满足M6?

由已知,N是合数,则至少存在nZN,1<n<N,n|N

如果n2=N,则有nn=n×n mod N=0

如果n2!=N,则\existn(1,N),nn=N那么nn=nn mod N=N mod N=0

故选取p为素数,就是为了保证M6无零因子

同时,选取一个素数作为mod值,保证了M7乘法逆元:

aZp,ax=1,即ax1(mod p),显然当p为一个素数时有gcd(a,p)=1由2拓展欧几里得定理即可求出x的值

因此Zp就是一个有限域,用GF(p)表示

Zp上的数论定理

拓展欧几里得定理求乘法逆元

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int exgcd(const int &a, const int &b, int &x, int &y) {//拓展欧几里得算法ax+by=1=gcd(a,b)
if (b == 0) {
x = 1;
y = 0;
return a;
}
int x2, y2;
int d = exgcd(b, a % b, x2, y2);
x = y2;
y = x2 - a / b * y2;
return d;
}

int inverse(const int &a, const int &mod) {//求a在模mod下的逆元
int x, y;
exgcd(a, mod, x, y);
return ((x % mod) + mod) % mod;
}

快速幂

1
2
3
4
5
6
7
8
9
10
11
12

int quick_pow(const int &base, const int &index, const int &mod) {//bash^index(% mod)
if (index == 0)
return 1;
else if (index == 1)
return base % mod;
else if (index % 2) {
return quick_pow(base * base % mod, index >> 1, mod) % mod;
} else {
return base * quick_pow(base * base % mod, index >> 1, mod) % mod;
}
}

多项式算术

为什么突然扯到"多项式算数"呢?

前面我们证明了对于整数集ZN={0,1,2,3,...,N1},只有当|ZN|=N为素数p时,Zp才为一个域

如果想要得到一个元素个数为2n的域,显然Zp做不到.

为什么要得到一个元素个数为2n的域?计算机使用二进制编码,AES加密算法就用到了GF(28)

一个3位二进制数可以表示8中状态,明文和密码就在这八种状态之中

模8乘法 0 1 2 3 4 5 6 7
0 0 0 0 0 0 0 0 0
1 0 1 2 3 4 5 6 7
2 0 2 4 6 0 2 4 6
3 0 3 6 1 4 7 2 5
4 0 4 0 4 0 4 4 3
5 0 5 2 7 4 1 6 3
6 0 6 4 2 4 3 4 2
7 0 7 6 5 3 3 2 1

Z8中的数字乘法,其结果中个数字的出现次数显然是不均匀的,比如1出现了4次,2就出现了8次

而一个理想的密码是不能暴露词频信息的,显然用Z8上的变换进行加密不理想,于是想一种乘法和除法的构造方法, 使得有8个元素的域其乘法或者加法的结果的频率相等

而使用多项式运算就可以解决这个问题,因此引入了多项式运算

首先要研究的是==如何构造一个有8个元素(pn)的域==

==将数的性质拓展到多项式式上==

我们使用的一般是代数基本规则的普通多项式运算

然后拓展到系数在GF(p)中的多项式运算

然后再拓展到系数在GF(p),模一个n次多项式m(x)的多项式运算

最终目标是理解并应用最后一种多项式

普通多项式运算

多项式次数:最高次项的次数

多项式的表示: f(x)=anxn+an1xn1+...+a1x+a0=i=0naixi,an0 如果aiS则称f(x)是系数集S上的多项式,令<A,+,×>表示S上的所有多项式以及加法和乘法二元关系

S=Z表示整数集的时候,显然A是满足A1A5,M1M6,是个整环,

但是不满足乘法逆元,比如x的乘法逆元x1,是一个指数为负的多项式,显然不在A

f(x)=i=0naixig(x)=i=0mbixianbm0,nm 则普通多项式的加法运算 f(x)+g(x)=i=0m(ai+bi)xi+i=m+1naixi 普通多项式乘法 f(x)g(x)=i=0n+mcixici=a0bi+a1bi1+...+aib0

系数在Zp中的多项式运算

当系数集是全体整数的时候,由于系数不都有乘法逆元,因此无法进行多项式除法

当系数集是一个域的时候,系数都有了乘法逆元,可以对多项式引入除法(带余除法)

可以类比整数的除法,求余数用%,求商用/

那么在Zp中的多项式,求余式用%,求商式用/

比如对于Z2上的多项式f(x)=x4+1=(x+1)(x3+x2+x+1),则f(x)/(x+1)=x3+x2+x+1

设系数域为<Zp,,>

Zp上的两个多项式 f(x)=i=0naixig(x)=i=0mbixian,bm0,nm

Zp多项式的四则运算

Zp上的多项式加法(减法类似)为 f(x)+g(x)=i=0m(aibi)xi+i=m+1naixi=i=0m(ai+bi)mod p ×xi+i=m+1naixi

Zp上的多项式乘法为 f(x)g(x)=i=0n+mcixici=(a0bi+a1bi1+...+aib0)mod p Zp上的带余式除法 f(x)=q(x)g(x)+r(x) 意思是f(x)÷g(x)=q(x)...r(x)

Degree(f)表示多项式f的阶,并且Degree(f)=n,Degree(g)=m,则有Degree(q)=nmDegree(r)m1

Zp多项式的欧几里得定理

定义d(x)a(x),b(x)的最大公因式,即d(x)是能够整除a(x),b(x)的所有多项式中次数最高的 gcd(a(x),b(x))=gcd[b(x),a(x)%b(x)]

Zp上多项式再mod n次素多项式

对于Zp上次数高于n-1的多项式f(x),需要mod一个Zp上的n次素多项式m(x),如此限制f(x)的次数在[0,n1]

什么是"素多项式"?Zp上的素多项式m(x)无法被Zp上的任意多项式整除

m(x)的次数为n,则Zp上的多项式mod m(x)都会落在次数小于等于n-1的多项式集F

显然F中的多项式都可以表示为 f(x)F,f(x)=a0+a1x+...+an1xn1,aiZp 那么这样的多项式一共有pn个(系数的乘法原理),即模m(x)构成的剩余类

现在类比Zp,证明F是一个域

显然加减乘封闭且结合律分配律交换律均满足,F容易判定为交换环

由于1也是F中的多项式,因此存在乘法单位元1,

下面证明M6无零因子

由于k阶多项式的k次项系数不为零,假设有两个非零多项式,其最高次项分别为aixi,bjxj

乘积多项式的最高次项为aibjxi+j如果指数i+jn则对m(x)取模,如果系数aibjp则对p取模

显然p是一个素数,aibj=ai×bj是一个合数,合数对素数取模显然不为0

因此任何两个非零多项式乘积一定非零,M6无零因子得证

到此F被证明是整环

无零因子就是GF(23)是域但是Z8不是域的本质原因

下面证明任意F中的非0多项式都在F中有乘法逆元

f(x)g(x)1(mod m(x))

g(x)f(x)+k(x)m(x)=1

m(x)为素因式,有欧几里得定理知上式有解

因此M7乘法逆元得证

因此F是域

FZp的不同

我们在证明Zp是域的时候发现,对于整数集ZN={0,1,2,3,...,N1},只有当|ZN|=N为素数p时,Zp才为一个域

而现在|F|=pn显然当n>1时是一个合数,但是F仍然是一个域

F记作GF(pn)表示伽罗华域

F=GF(pn)上的乘法逆元

f(x)g(x)1(mod m(x))g(x)f(x)+k(x)m(x)=1gcd(f(x),m(x))=1

显然可以将整数上的拓展欧几里得推广到F上

GF(2n)上构造结果分布均匀的二元运算

GF(2n)上的多项式各项的系数要么是0,要么是1,可以用二进制数表示

比如x3+x2+1就可以表示为1101

加法

由于系数要么是0要么是1,即系数要自动对2取模

那么多项式的加法就是二进制数按位异或

比如(x3+x2+x)+(x4+x+1)=x4+x3+x2+2x+1=x4+x3+x2+1

0111010011=11101

乘法

教材上一本正经地写了一堆用字母表示的多项式,看上去头大.

从一个例子入手可能比较容易理解:

考虑AES加密算法使用到的GF(28),取m(x)=x8+x4+x3+x+1为模.

f(x)=x6+x4+x2+x+1

g(x)=x7+x+1

f(x)g(x)=f(x)×g(x)modm(x)

拆分成项

容易想到的是把g(x)按幂次拆分成项然后用f(x)与g(x)的各项相乘之后相加,而相加在"加法"中我们已经认识到可以通过两个多项式异或这种简洁的方式实现,因此我们现在把精力放在f(x)如何和一个xk项相乘上 f(x)×g(x)modm(x)=f(x)×(1+x+x7)modm(x)=f(x)×1modm(x)+f(x)×xmodm(x)+f(x)×x7modm(x) 问题转化为如何求f(x)×xkmodm(x)

f(x)×xkmodm(x)

由于 f(x)×xkmodm(x)={[(f(x)×xmodm(x))×xmodm(x)]×...×xmodm(x)}×xmodm(x) 因此问题又可以转换为怎么跨出求f(x)f(x)×xmodm(x)这第一步

f(x)×xmodm(x)

假设f(x)=a7x7+a6x6+...+a1x+a0表示GF(28)上的任意多项式

x×f(x)=a7x8+a6x7+...+a0x

如果用二进制表示,那么 Misplaced & 在还没有取模时,我们可以发现f(x)x×f(x)只需要将f(x)的二进制表示左移一位,下面考虑如何取模

如果a7=0x×f(x)顶多是一个7次多项式,如果有a6=0则顶多是一个6次多项式,一个七次多项式x×f(x)去mod一个8次多项式m(x)实乃以卵击石,直接被8次多项式劝返

如果a7=1x×f(x)m(x)都是8次多项式,算是旗鼓相当,可以一战

此时x×f(x)可以分成精锐的头部x8与累赘的尾部a6x7+a5x6+...+a0x,

这个尾部对m(x)取模还是被劝返,只留下精锐的头部x8独自抗衡m(x)

那么问题转化为x8m(x)=x8+x4+x3+x+1取模,考虑如何取模?

x8modm(x)

x8形单影只,只能单挑m(x)x8项,无暇处理m(x)的一伙子小弟,

于是x8利用其系数都在GF(2)上,无中生有搬来了一伙子小弟: x8x8+2x7+2x6+...+2x+2(mod2) 此时用x8+2x7+2x6+...+2x+2modm(x)终于可以大干一场了,还得是门当户对地干,次数相同的项单挑

x8x8+2x7+2x6+...+2x+2(mod2)作为被除数,m(x)作为除数,余数即为所求结果

战争一开始,商1之后被除数减去除数得到2x7+2x6+2x5+x4+x3+2x2+x+1x4+x3+x+1(mod2)

立刻发现刚才"精锐的头部"那个x8在和m(x)的8次项的决斗中阵亡了,剩下的小弟都是7次方以下的项,无力与m(x)抗衡,直接作为余数

即刚才的"战争"可以写为: x8x4+x3+x+1modm(x)&mod2m(x)=x8+x4+x3+x+1 突然发现x8modm(x)=m(x)x8=x4+x3+x+1

这是巧合吗?

这是系数mod2的必然结果,并且可以从8次推广到n次:

m(x)为n次多项式 xnmodm(x)=m(x)xn(mod2) x8独自面对m(x),最终壮烈牺牲但是换回x4+x3+x+1颇有"将军百战死,壮士十年归"的感觉

在战争之前我们把"累赘的尾部a6x7+a5x6+...+a0x"留下不参战,原因是他们参战也会被敌人m(x)直接劝返

现在我们知道了精锐的头部x8和累赘的尾部a6x7+a5x6+...+a0x各自参战的结果了,此时可以总结一支部队x×f(x)=x8+a6x7+a5x6+...+a0x参战的结果了: x×f(x)modm(x)=[m(x)x8]+a6x7+a5x6+...+a0x 比如当f(x)=x7+x4+x2+x+1,m(x)=x8+x4+x3+x+1x×f(x)modm(x)=(x8+x5+x3+x2+x)mod(x8+x4+x3+x+1)=[x4+x3+x+1]+[x5+x3+x2+x]=011011101110=110101 到此我们知道x×f(x)modm(x)如何计算了,

那么x2×f(x)modm(x)=x×(x×f(x)modm(x))modm(x)

以此类推可以得到xk×f(x)modm(x)如何计算了

回到求f(x)×g(x)modm(x)

不管你g(x)长什么样,我先预处理出f(x)×xmodx,f(x)×x2modm(x),f(x)×xkmodm(x)等等情况

如果你g(x)=1+x+x2长得很虚,那么 f(x)×g(x)modm(x)=f(x)×(1+x+x2)modm(x)=(f(x)+x×f(x)+x2×f(x))modm(x)=f(x)+x×f(x)modm(x)+x2×f(x)modm(x) 直接利用预处理得出的结果,然后计算加法直接用二进制异或

总结

到此我们构造出了GF(2n),即有2n个元素的伽罗华域

怎么构造出的?由系数在GF(2)上的多项式模一个2n次的素多项式拓展出的

多项式和这2n个数怎么产生联系?每一个多项式都对应一个二进制数

2n个数的加减乘除运算怎么定义的?还是通过多项式的运算得到的

下一步可以向AES加密算法进军了