密码学笔记(1)——数论准备知识
最近因为毕业论文的需要开始阅读冯登国老师的《密码学原理与实践》(第三版),一边读一边做自己的读书笔记,加深对密码学的理解。
在密码学中可以看到大量的数论知识,这些都是抽象代数课程的一部分内容,有时间我会再以另外一个分类的形式叙述抽象代数的内容。在这里只叙述密码学中应用到的内容及其扩充。
一、一些基本概念
Def1 (群)设G是一个非空集合,若在G上定义一个二元运算" · ",它满足
(1) 结合律:对任何 a,b,c∈G,有(a⋅b)⋅c=a⋅(b⋅c),则称G是一个半群,记作 (G,⋅) ,若 (G,⋅)还满足
(2) 存在单位元 e∈G ,使得对任何 a∈G 有 e⋅a=a⋅e=a
(3) 对任何 a∈G ,有 a−1∈G ,使得 a−1⋅a=a⋅a−1=e ,则称 (G,⋅) 是一个群。
如果半群中也有单位元,则称为幺半群。
Def2 (交换群)如果群 (G,⋅) 满足交换律:对任何 a,b∈G 有 a⋅b=b⋅a ,则称G为交换群或者Abel群。
Def3 (环)设R是一个非空集合,如果在R中有两种运算 +,⋅ 满足一下条件:
(1) R是加法Abel群和乘法半群。
(2) a⋅(b⋅c)=(a⋅b)⋅c
(3) (a+b)⋅c=a⋅c+b⋅c 和 a⋅(b+c)=a⋅b+a⋅c 对任何 a,b,c∈R 成立。
(4) 存在 e∈R ,使得 e⋅a=a⋅e=a 对任何 a∈R 成立,e称为R中的单位元(或幺元)
则称R为一个环。
PS:在许多抽象代数课本中,第(4)条不是环定义所必须的,不过在密码学讨论的环中一般都是包含有单位元的环。
Def4 (模m剩余类环)集合 {0,1,…,m−1} 与运算加法(+)和乘法(×)定义为模m剩余类环,记为Zm 。
Thm5 设 a∈Zm ,对任意的 b∈Zm ,同余方程 ax≡b(modm) 有唯一解 x∈Zm 的充分必要条件是 gcd(a,m)=1。
证明:假设 gcd(a,m)≠1,那么设 gcd(a,m)=d>1 ,那么同余方程 ax≡0(modm) 至少有两个解,分别为x=0 和x=m/d ,矛盾。
假设 gcd(a,m)=1,如果存在 x1,x2 使得ax1≡ax2(modm)
那么有a(x1−x2)≡0(modm)
于是m∣a(x1−x2)
根据整除的基本属性,由于gcd(a,m)=1,即 m∣(x1−x2),这就意味着 x1≡x2(modm),于是同余方程的解是唯一的。
Def6 (欧拉函数)设 a≥1,m≥2且均为整数,如果 gcd(a,m)=1,则称a与m互素,在 Zm中所有与m互素的数的个数使用 ϕ(m)来表示,称为欧拉函数。
Thm7 (欧拉函数的一种计算公式)假定 n∏i=1piei这里pi均为素数且互不相同,ei>0,1≤ i≤n。则ϕ(m)=n∏i=1(piei−piei−1)
Def8 (乘法逆)设a∈Zm,若存在a′∈Zm,使得aa′≡a′a≡1(modm),则a′称为a在Zm上的乘法逆,将其记为a−1modm。在m是固定的情形下,也可将其简记为a−1。
以上基本是书本第一章介绍的数论知识,下面根据此介绍Euclidean算法和中国剩余定理,该内容在书上的第五章。
二、Euclidean算法
Euclidean算法又称为辗转相除法,是求给定两个非负整数的最大公约数(用gcd(a,b)表示),其中最为本质的是来源于多项式环中的带余除法,可以总结为如下的定理。
Thm9 (带余除法)设R为一个交换环(即对乘法可交换),f(x),g(x)∈R[x],若g(x)≠0且它的首项系数是R中的乘法可逆元,则存在唯一的一对多项式q(x),r(x)∈R[x],使得
(1)f(x)=g(x)q(x)+r(x);
(2)deg(r)<deg(g);
此时q(x)称为商,r(x)称为余式。
算法的主要步骤是令两个数中较大的数作为被除数,较小的数作为除数做带余除法,得到余数,除数和余数继续做带余除法,直到某一项中余数为0,那么商为最大公约数,换言之,是如下的一个过程。
令这两个数为a,b,且a>b,取商序列为qi,余数序列为ri,其中r0=a,r1=b,0≤i≤+∞,则r0=r1q1+r2,r2<q1r1=r2q2+r3,r3<q2r2=r3q3+r4,r4<q3r3=r4q4+r5,r5<q4……rn−2=qn−1rn−1+rn,rn<qn−1rn−1=qnrn
于是最大公约数即为rn,写成代码版本就是
1 2 3 4 5 6 7 8 | #include <algorithm> // std::swap for c++ before c++11 #include <utility> // std::swap for c++ since c++11 int gcd( int a, int b) { if (a < b) std::swap(a, b); return b == 0 ? a : gcd(b, a % b); } |
但是这里有一个问题存留就是,怎么证明算法过程是对的,也就是,为什么这么做可以求得最大公约数,需要一个严格的数学证明。
Thm10 在上述Euclidean算法中,有如下结论 gcd(a,b)=gcd(b,r1)=gcd(r1,r2)=gcd(r2,r3)=……=gcd(rn−2,rn−1)=gcd(rn−1,rn)=rn
证明:
令gcd(a,b)=d,那么有d|a 以及 d|b,由a=bq1+r1,可知a−bq1=r1,那么得到d|r1,又因为d|b,即有d为b和r1的公约数,接下来要证明的是d是b和r1的最大公约数。
假设存在gcd(b,r1)=d′>d,那么由于d和d′都是公约数,有d′=dh,h>1,那么由a=bq1+r1就容易得到d′|a,所以d′也是a和b的公约数,显然这与d=gcd(a,b)矛盾,这就说明d′≤d。
如果d′<d,这与d|r1,d|b矛盾,于是只能够d′=d。
同理可一直这样子证到最后一步,当能整除时,最大公约数当然是待比较的两个数中较小的那个数。
到这里为止,由于Euclidean算法能计算出最大公因子,它可以用来判断一个非负整数b<n是否有模n的乘法逆,如果求出来最大公约数为1,说明b与n互素,否则说明b与n有公因子。不过还存在一个问题是,当b与n互素的时候,还是没有办法求出b−1modn,因此下一步我们要想办法求出乘法逆,这就是接下来要介绍的扩展Euclidean算法,先讨论它的数学理论,那就是著名的Bezout等式。
Thm11 (Bezout定理的数学版本)设a,b≥0且为整数,则gcd(a,b)=c1a+c2b,其中c1和c2为常数。
证明:回忆辗转相除法的求解过程,我们令gcd(a,b)=rn,在倒数第二步的时候有rn−2=rn−1qn−1+rn求解rn得rn=rn−2−rn−1qn−1=rn−2−(rn−3−rn−2qn−2)qn−1=(1+qn−2qn−1)rn−2−qn−1rn−3=(1+qn−2qn−1)(rn−4−rn−3qn−3)−qn−1rn−3……=ua+vb
证明过程其实也就是将辗转相除法倒回去计算,不断的递归消去ri,从而得到原来a和b的一个线性组合。下一步考虑的是如何使用计算机实现扩展的Euclidean算法,课本上给出伪代码的形式,我将其转化为C++的代码求解。
1 #include <iostream> 2 using namespace std; 3 4 void Extended_Euclidean_Algorithm(int a, int b) 5 { 6 int a0 = a; 7 int b0 = b; 8 int t0 = 1; 9 int t = 0; 10 int s0 = 0; 11 int s = 1; 12 int q = a0 / b0; 13 int r = a0 - q*b0; 14 int temp = 0; 15 while (r > 0) 16 { 17 //迭代系数t 18 temp = t0 - q*t; 19 t0 = t; 20 t = temp; 21 //迭代系数s 22 temp = s0 - q*s; 23 s0 = s; 24 s = temp; 25 //求最大公约数 26 a0 = b0; 27 b0 = r; 28 q = a0 / b0; 29 r = a0 - q*b0; 30 } 31 r = b0; 32 cout << "最大公约数为:" << r << endl; 33 cout << "s的值为:" << s << endl; 34 cout << "t的值为:" << t << endl; 35 cout << "sa+tb=" << s*a + t*b << endl; 36 } 37 38 int main() 39 { 40 int a, b; 41 cin >> a >> b; 42 Extended_Euclidean_Algorithm(a, b); 43 system("pause"); 44 return 0; 45 }
这里面最难理解的是两个迭代系数为什么要如此进行求解,为此我们需要如下一个定理。
Thm11' (Bezout定理的计算机版本)给定ri为Euclidean算法中ri的定义,那么对于0≤i≤m,有ri=sir0+tir1,其中定义序列si和ti如下si={1i=00i=1si−2−qi−1si−1i≥2 ti={0i=01i=1ti−2−qi−1ti−1i≥2
证明:
只需要对i用归纳法证明即可,当i=0和i=1时命题显然成立,假设命题对于i=k−1和i=k−2,k≥2时成立,我们需要证明命题对于i=k时成立,由归纳假设有rk−2=sk−2r0+tk−2r1和rk−1=sk−1r0+tk−1r1现在计算rk=rk−2−qk−1rk−1=sk−2r0+tk−2r1−qk−1(sk−1r0+tk−1r1)=(sk−2−qk−1sk−1)r0+(tk−2−qk−1tk−1)r1=skr0+tkr1
因此由归纳法可知,命题对于所有整数i≥0是正确的。
有了这个定理,我们就理解了这个迭代系数是怎么设置的了,也就明白了整个扩展Euclidean算法的流程了,有了这个算法,我们就可以求b−1modm了,来看下面的一个定理。
Thm12 假设gcd(r0,r1)=1,则r−11(modr0)=tn(modr0),其中tn如前面定义。
证明:
由Thm11',可以得到1=gcd(r0,r1)=snr0+tnr1两边模r0约化等式就可以得到tnr1≡1(modr0)得证。
最后要说的是,在扩展Euclidean算法中,如果只为了求b−1modm,可以将所有的si过程全部去掉,只留下求ti的过程。
三、中国剩余定理
中国剩余定理是求解特定的同余方程组的方法。考虑m1,…,mr为两两互素的正整数,假定a1,…,ar为整数,考虑如下的同余方程组x≡a1(modm1)x≡a2(modm2)x≡a3(modm3)……x≡ar(modmr)中国剩余定理断言这个方程组有模M=m1×m2×m3×…×mr的唯一解。
Thm13 (中国剩余定理)假定m1,…,mr为两两互素的正整数,a1,…,ar为整数,那么同余方程组x≡ai(modmi)(1≤i≤r)有模M=m1×m2×…×mr的唯一解,此解由下列式子给出:x=r∑i=1aiMiyi(modM)其中Mi=M/mi,且yi=M−1imodmi,1≤i≤r。
证明:
如上述定义,设1≤i≤r,则有Mi=M/mi,那么有gcd(Mi,mi)=1
再由前面Thm12可知yi的定义是合理的,因此可以得到Miyi≡1(modmi)aiMiyi≡ai(modmi)
注意到Mi的构造,可以知道当i≠j时,有aiMiyi≡0(modmj)
现在,定义一个函数ρ:Zm1×Zm2×…×Zmr⟶ZM如下:ρ(a1,a2,…,ar)=r∑i=1aiMiyi(modM)
于是很容易得到这个函数ρ(a1,a2,…,ar)≡ai(modmi)
因此这个函数就是我们需要的中国剩余定理的解。
对于证明唯一性,需要考虑它的反函数χ:ZM⟶Zm1×Zm2×……×Zmr
这个函数是从基数为M的定义域到基数为M的值域的映射,很显然这是一个单射,通过计数可以验证它是一个满射,因此它是一个双射,再由离散数学相关定理可知道它的反函数也是一个双射,证毕。
四、其他有用的结果
Def14 (元素和群的阶数)对于一个有限群G,定义元素g∈G的阶数为使得gm=1的最小正整数m,定义群的阶数为群的所有元素个数。
Thm15 (Lagrange定理)假定G是一个阶为n的乘法群,且g∈G,那么g的阶整除n。
证明:这个证明需要较多的抽象代数知识,故先略去。
Thm16 定义Z⋆n为Zn中所有与n互素的全体元素的集合,如果b∈Z⋆n,那么bϕ(n)≡1(modn),其中ϕ(n)为欧拉函数
证明:这是因为Z⋆n是阶为ϕ(n)的乘法群。
Thm17 (Fermat小定理)假定p是一个素数,且b∈Zp,那么bp≡b(modp)
证明:如果p是一个素数,那么欧拉函数ϕ(p)=p−1,且b∈Zp,因此gcd(b,p)=1,由Thm16可知bϕ(p)≡1(modp),即bp−1≡1(modp),两边再同乘一个b即证。
Def18 (模p的本原元素)如果一个元素b具有模p的阶等于p-1,即对于所有的1≤i≤p−2,均有bi≠1(modp),且bp−1≡1(modp)。
Thm19 假定p是一个素数且b是一个模p的本原元素,任一元素β∈Z⋆p可以写成唯一的形式β=bi,其中0≤i≤p−2,且β的阶为p−1gcd(p−1,i)
证明:
利用抽象代数的知识可知道任何一个有限循环群可以写成生成元的幂次的形式,且最高幂次+1就是群的阶,因此这个定理的前半部分是非常显然的。
后半部分通过计算得βp−1gcd(p−1,i)=bi(p−1)gcd(p−1,i)
那么令k=igcd(p−1,i)∈N,于是就有βp−1gcd(p−1,i)=bk(p−1)=b(p−1)k=1k=1
PS:模p的本原元素的个数为ϕ(p−1)
有了Thm19,我们可以迅速的确定某个素数的本原元素个数,但是如果还需要计算它们的具体值,还需要根据定义验证所有的幂次值,这在素数非常大的情况下是很难的,有没有什么更快的方法呢?
Thm20 假定p>2是一个素数,且b∈Z⋆p,那么当b是一个模p的本原元素当且仅当bp−1q≠1(modp)对于所有满足q∣(p−1)的素数q都成立。
证明:
充分性显然,下面来证必要性。
假定b∈Z⋆p不是模p的本原元素。令d为b的阶,由Lagrange定理有d∣(p−1)。
因为b不是本原的,所以有d<p−1,于是有p−1d是一个大于1的整数,取q为p−1d的素因子(即除了1和q以外没有),那么有d是p−1q的一个因子,从而有bd≡1(modp)且d∣p−1q于是bp−1q≡1(modp),证毕。
下一篇文章我打算会一边更新我在读的RSA密码体制内容,一边更新以前读过的一些概率论和熵的知识。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步