费马小定理——从素数判定到RSA公钥加密体制

来源:互联网 发布:新标准韩国语软件 编辑:程序博客网 时间:2024/04/29 03:26
费马小定理——从素数判定到RSA公钥加密体制
       看了费马小定理的一些应用和推广,颇受启发。我来简单说说吧。 
1.费马小定理是啥呢? 
        设p为质数,则对于每个与p互质的整数a,a^(p-1)被p除的余数为1,即a^(p-1)≡1(mod p) . 
        (“a≡b(mod c)”为同余符号,这是高斯发明的,表示a和b除以c得到的余数相同,也就是a mod c = b mod c)比如:7为质数,3与7互质,3^(7-1)=729,729 mod 7=1. 
        费马小定理曾被欧拉证明,证明过程也不复杂,不过我们先不用管它,来看看这个“小定理”有什么“大用处”。 
2.怎样进行素数判定? 
        公元前3世纪,欧几里得证明了:每个大于1的整数都可以唯一地分解成有限个素数的乘积(不计因子的次序)。对于任意一个整数n,如果本身就是素数,则分解完毕,否则要找到n的一个素因子p,然后再分解n/p。所以首先要考虑的第一件事是:是否有好的算法来判定n是不是素数?这就是素数判定问题。 
        我们以前学过的从2到sqrt(n)的试除法是指数级的(这里的复杂度要按照n的二进制形式位数N来算,由于n=2^N,所以sqrt(n)可认为(sqrt(2))^N)。2002年,三维印度数学家找到了素数判定的多项式算法,复杂度为O((logn)^6),说明素数判定是一个比较容易的问题。 
        下面说一种应用费马小定理的算法,可以“几乎”正确的判定素数。 
        1)根据费马小定理的逆否命题,如果a^(p-1)mod p<>1,则p一定是合数 
        2)费马小定理的逆命题是这样的:“如果p是一个正整数,存在一个与p互质的整数a,使得a^(p-1)≡1(mod p),p就是个质数。”那么它成立吗?它不成立,但是几乎成立!如果取a=2,那么在小于10,000的p中,只有22个p会产生错误!(这个合数p装得像素数似的,所以我们把这样的p叫做伪素数。) 
        如果我们选取许多a来试验p,那么正确率又会大增。在小于100,000,000的整数中,只有512个p对于所有的a来说都是伪素数。 
        如此我们就有思路了:随机取一些a,计算a^(p-1) mod p。如果有一个计算结果不是1,就可以确定p是合数,返回False;否则就几乎肯定p是素数,返回True。 
        至于计算过程,有很多方法,一种比较高效的算法是这样的: 
        p-1二进制可表示为一个奇数m后面加n个0,即p-1 = m*2^n。所以a^(p-1) =(a^m)^(2^n) ,因此只要把a^m平方n次(每次平方后要mod p)即可算出a^(p-1) mod p。由于1的任意次方都等于1,所以在计算过程中,每平方一次,如果中间结果为1,则以后每次平方结果也为1,此时退出循环即可。 
        大致计算过程如下: 
       1)通过p-1进行位运算求出mn 
       2)x = a^m mod n 
       3)For i = 2 To n 
         x = sqr(x) 
         If x = 1 Then Break 
       4)If x<>1 Then Return False 
         Else Return True 
        在2..n-1中随机选取一些a执行上述过程即可,选取的a的个数可视情况而定,尽量多一点以提高准确率。 
3.RSA公钥加密体制简介 
        信息的加解密我们平常都接触过,每种密码都有加密方法(以下简称E)和解密方法(以下简称D)。比如,任意一个数字x,取E为E(x)=x+3,那么原码3的密码即为6。如果我们知道了E,就很容易得出D(x)=x-3,也就是E的逆运算(即D(E(x))=x)。有时候我们可能会选取一些数字作为密钥(有加密密钥e和解密密钥d),比如E(x)=x*e,同样地,我们很容易可以得出D(x)=x*d(d=1/e)。这样的加解密方法太不安全了,只要有了加密密钥,解密方法就被轻易破解。 
        RSA公钥体制是一种公开加密密钥的加密体制,但是我们无法(在我们有生之年)通过加密密钥得到解密密钥。神奇吧?怎么回事呢? 
        这是利用了上文提到的整数分解! 
        大数分解难题:对于一个很大的整数n,要分解出所有的质因数,人们至今没找到多项式算法。具体点,分解一个100位数大概需要几分钟,而分解一个200位数通常需要几万年 
        下面就来看看RSA公钥是咋弄的。 
       1)随机选取两个大约100位的不同的素数(我们已经知道,这个可以在多项式时间内解决),分别为pq,把n=pq公开,但是pq保密 
       2)m=(p-1)(q-1),去两个正整数ed,使得ed1(mod m) 
       3)加密过程:每个信息x0..n-1中的一个数字表示,y表示密码,则y=E(x)=x^e mod n 
       4)解密过程:每个密码y也是0..n-1中的一个数字,则x=D(y)=x^d mod n 
        大家可以找两个小一点的素数试试! 
        加密解密相当于x^(ed) mod n,下面来证明一下x^(ed)≡x (mod n)。(证明过程用到一点同余算术,不过都很好理解) 
        证明: 
            因为ed≡1(mod (p-1)(q-1)),所以可将ed表示为(p-1)(q-1)N+1,其中N为正整数 
            根据费马小定理x^p-1≡1(mod p),因此x^(ed)=x^((p-1)(q-1)N+1)=x·(x^((p-1))^((q-1)N)≡x·1≡x(mod p) 
            同理可证x^(ed)≡x(mod q) 
            我们可以得到x^(ed)-x同时被素数p和q整除,所以x^(ed)-x被n=pq整除 
            即x^(ed) ≡x (mod n),证毕。 
        由于D(E(x))= x^(ed)≡x (mod n),E(D(x))= x^(de)≡x (mod n),所以E和D是互逆运算。每个用户都有一个加密密钥ei和一个解密密钥di,其中ei公开的,di保密,作为自己的私钥。另外,因为E和D是互逆运算,用户可以用自己的D先对x进行运算,作为自己的“签名”(其他人可以用此用户公开的E运算来使之恢复),然后再用对方的E进行加密。 
        分解一个200位整数n来求p和q是很难的,所以RSA公钥体制很安全。那么,一共有多少对{ei, di}可供用户使用呢?结论表明,{ei, di}总共有φ(m)对。φ(m)表示1..m中与m互质的数的个数,称作欧拉函数,如φ(6)=2(即1..6中与6互质的数有1和5两个)。欧拉函数有固定的计算方法,这里就不介绍了。 

   RSA公钥方案目前已在通信中广泛使用。像这样,许多数学知识可以应用到信息学中,应用到生活中,对我们有很重要的意义。
转自http://blog.163.com/wangenze_black@126/blog/static/11071051520095211117540/
原创粉丝点击