Loading [MathJax]/jax/output/CommonHTML/jax.js

密码学笔记(1)——数论准备知识

  最近因为毕业论文的需要开始阅读冯登国老师的《密码学原理与实践》(第三版),一边读一边做自己的读书笔记,加深对密码学的理解。

  在密码学中可以看到大量的数论知识,这些都是抽象代数课程的一部分内容,有时间我会再以另外一个分类的形式叙述抽象代数的内容。在这里只叙述密码学中应用到的内容及其扩充。

一、一些基本概念

Def1 (群)设G是一个非空集合,若在G上定义一个二元运算" · ",它满足

(1) 结合律:对任何 abcG(ab)c=a(bc),则称G是一个半群,记作 (G,) ,若 (G,)还满足

(2) 存在单位元 eG ,使得对任何 aGea=ae=a 

(3) 对任何 aG ,有 a1G ,使得 a1a=aa1=e ,则称 (G,) 是一个

如果半群中也有单位元,则称为幺半群

 

Def2 (交换群)如果群 (G,) 满足交换律:对任何 abGab=ba ,则称G为交换群或者Abel群

 

Def3 (环)设R是一个非空集合,如果在R中有两种运算 + 满足一下条件:

(1) R是加法Abel群乘法半群

(2) a(bc)=(ab)c

(3) (a+b)c=ac+bca(b+c)=ab+ac 对任何 abcR 成立。

(4) 存在 eR ,使得 ea=ae=a 对任何 aR 成立,e称为R中的单位元(或幺元)

则称R为一个

PS:在许多抽象代数课本中,第(4)条不是环定义所必须的,不过在密码学讨论的环中一般都是包含有单位元的环。

 

Def4 (模m剩余类环)集合 {0,1,,m1} 与运算加法(+)和乘法(×)定义为模m剩余类环,记为Zm

 

Thm5aZm ,对任意的 bZm ,同余方程 axb(modm) 有唯一解 xZm 的充分必要条件是 gcd(a,m)=1

证明:假设 gcd(a,m)1,那么设 gcd(a,m)=d>1 ,那么同余方程 ax0(modm) 至少有两个解,分别为x=0x=m/d ,矛盾。

假设 gcd(a,m)=1,如果存在 x1x2 使得ax1ax2(modm)

那么有a(x1x2)0(modm)

于是ma(x1x2)

根据整除的基本属性,由于gcd(a,m)=1,即 m(x1x2),这就意味着 x1x2(modm),于是同余方程的解是唯一的。

 

Def6 (欧拉函数)a1m2且均为整数,如果 gcd(a,m)=1,则称a与m互素,在 Zm中所有与m互素的数的个数使用 ϕ(m)来表示,称为欧拉函数

 

Thm7 (欧拉函数的一种计算公式)假定 ni=1piei这里pi均为素数且互不相同,ei>0,1 in。则ϕ(m)=ni=1(pieipiei1)

 

Def8 (乘法逆)aZm,若存在aZm,使得aaaa1(modm),则a称为a在Zm上的乘法逆,将其记为a1modm。在m是固定的情形下,也可将其简记为a1

  以上基本是书本第一章介绍的数论知识,下面根据此介绍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,0i+,则r0=r1q1+r2r2<q1r1=r2q2+r3r3<q2r2=r3q3+r4r4<q3r3=r4q4+r5r5<q4rn2=qn1rn1+rnrn<qn1rn1=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(rn2,rn1)=gcd(rn1,rn)=rn

证明:

  令gcd(a,b)=d,那么有d|a 以及 d|b,由a=bq1+r1,可知abq1=r1,那么得到d|r1,又因为d|b,即有d为b和r1的公约数,接下来要证明的是dbr1的最大公约数。

  假设存在gcd(b,r1)=d>d,那么由于dd都是公约数,有d=dhh>1,那么由a=bq1+r1就容易得到d|a,所以d也是ab的公约数,显然这与d=gcd(a,b)矛盾,这就说明dd

  如果d<d,这与d|r1d|b矛盾,于是只能够d=d

  同理可一直这样子证到最后一步,当能整除时,最大公约数当然是待比较的两个数中较小的那个数。

  到这里为止,由于Euclidean算法能计算出最大公因子,它可以用来判断一个非负整数b<n是否有模n的乘法逆,如果求出来最大公约数为1,说明b与n互素,否则说明b与n有公因子。不过还存在一个问题是,当b与n互素的时候,还是没有办法求出b1modn,因此下一步我们要想办法求出乘法逆,这就是接下来要介绍的扩展Euclidean算法,先讨论它的数学理论,那就是著名的Bezout等式。

Thm11 (Bezout定理的数学版本)ab0且为整数,则gcd(a,b)=c1a+c2b,其中c1c2为常数。

证明:回忆辗转相除法的求解过程,我们令gcd(a,b)=rn,在倒数第二步的时候有rn2=rn1qn1+rn求解rnrn=rn2rn1qn1=rn2(rn3rn2qn2)qn1=(1+qn2qn1)rn2qn1rn3=(1+qn2qn1)(rn4rn3qn3)qn1rn3=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的定义,那么对于0im,有ri=sir0+tir1,其中定义序列siti如下si={1i=00i=1si2qi1si1i2 ti={0i=01i=1ti2qi1ti1i2

证明:

  只需要对i用归纳法证明即可,当i=0i=1时命题显然成立,假设命题对于i=k1i=k2k2时成立,我们需要证明命题对于i=k时成立,由归纳假设有rk2=sk2r0+tk2r1rk1=sk1r0+tk1r1现在计算rk=rk2qk1rk1=sk2r0+tk2r1qk1(sk1r0+tk1r1)=(sk2qk1sk1)r0+(tk2qk1tk1)r1=skr0+tkr1

  因此由归纳法可知,命题对于所有整数i0是正确的。

  有了这个定理,我们就理解了这个迭代系数是怎么设置的了,也就明白了整个扩展Euclidean算法的流程了,有了这个算法,我们就可以求b1modm了,来看下面的一个定理。

Thm12 假设gcd(r0,r1)=1,则r11(modr0)=tn(modr0),其中tn如前面定义。

证明:

  由Thm11',可以得到1=gcd(r0,r1)=snr0+tnr1两边模r0约化等式就可以得到tnr11(modr0)得证。

  最后要说的是,在扩展Euclidean算法中,如果只为了求b1modm,可以将所有的si过程全部去掉,只留下求ti的过程。

三、中国剩余定理

  中国剩余定理是求解特定的同余方程组的方法。考虑m1,,mr为两两互素的正整数,假定a1,,ar为整数,考虑如下的同余方程组xa1(modm1)xa2(modm2)xa3(modm3)xar(modmr)中国剩余定理断言这个方程组有模M=m1×m2×m3××mr的唯一解。

Thm13 (中国剩余定理)假定m1,,mr为两两互素的正整数,a1,,ar为整数,那么同余方程组xai(modmi)(1ir)有模M=m1×m2××mr的唯一解,此解由下列式子给出:x=ri=1aiMiyi(modM)其中Mi=M/mi,且yi=M1imodmi1ir

证明:

  如上述定义,设1ir,则有Mi=M/mi,那么有gcd(Mi,mi)=1  

  再由前面Thm12可知yi的定义是合理的,因此可以得到Miyi1(modmi)aiMiyiai(modmi) 

  注意到Mi的构造,可以知道当ij时,有aiMiyi0(modmj)

  现在,定义一个函数ρ:Zm1×Zm2××ZmrZM如下:ρ(a1,a2,,ar)=ri=1aiMiyi(modM)

  于是很容易得到这个函数ρ(a1,a2,,ar)ai(modmi)

  因此这个函数就是我们需要的中国剩余定理的解。

  对于证明唯一性,需要考虑它的反函数χ:ZMZm1×Zm2××Zmr

  这个函数是从基数为M的定义域到基数为M的值域的映射,很显然这是一个单射,通过计数可以验证它是一个满射,因此它是一个双射,再由离散数学相关定理可知道它的反函数也是一个双射,证毕。

 四、其他有用的结果

Def14 (元素和群的阶数)对于一个有限群G,定义元素gG的阶数为使得gm=1的最小正整数m,定义群的阶数为群的所有元素个数。

 

Thm15  (Lagrange定理)假定G是一个阶为n的乘法群,且gG,那么g的阶整除n。

证明:这个证明需要较多的抽象代数知识,故先略去。

 

Thm16 定义ZnZn中所有与n互素的全体元素的集合,如果bZn,那么bϕ(n)1(modn),其中ϕ(n)为欧拉函数

证明:这是因为Zn是阶为ϕ(n)的乘法群。

 

Thm17  (Fermat小定理)假定p是一个素数,且bZp,那么bpb(modp)

证明:如果p是一个素数,那么欧拉函数ϕ(p)=p1,且bZp,因此gcd(b,p)=1,由Thm16可知bϕ(p)1(modp),即bp11(modp),两边再同乘一个b即证。

 

Def18 (模p的本原元素)如果一个元素b具有模p的阶等于p-1,即对于所有的1ip2,均有bi1(modp),且bp11(modp)

 

Thm19 假定p是一个素数且b是一个模p的本原元素,任一元素βZp可以写成唯一的形式β=bi,其中0ip2,且β的阶为p1gcd(p1,i)

证明:

  利用抽象代数的知识可知道任何一个有限循环群可以写成生成元的幂次的形式,且最高幂次+1就是群的阶,因此这个定理的前半部分是非常显然的。

  后半部分通过计算得βp1gcd(p1,i)=bi(p1)gcd(p1,i)

  那么令k=igcd(p1,i)N,于是就有βp1gcd(p1,i)=bk(p1)=b(p1)k=1k=1

PS:模p的本原元素的个数为ϕ(p1)

  有了Thm19,我们可以迅速的确定某个素数的本原元素个数,但是如果还需要计算它们的具体值,还需要根据定义验证所有的幂次值,这在素数非常大的情况下是很难的,有没有什么更快的方法呢?

Thm20 假定p>2是一个素数,且bZp,那么当b是一个模p的本原元素当且仅当bp1q1(modp)对于所有满足q(p1)的素数q都成立。

证明:

  充分性显然,下面来证必要性。

  假定bZp不是模p的本原元素。令d为b的阶,由Lagrange定理有d(p1)

  因为b不是本原的,所以有d<p1,于是有p1d是一个大于1的整数,取q为p1d的素因子(即除了1和q以外没有),那么有d是p1q的一个因子,从而有bd1(modp)dp1q于是bp1q1(modp),证毕。

  下一篇文章我打算会一边更新我在读的RSA密码体制内容,一边更新以前读过的一些概率论和熵的知识。

posted @   JCChan  阅读(1620)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示