rsa加密算法

来源:互联网 发布:淘宝上买精密管犯法么 编辑:程序博客网 时间:2024/06/05 18:49
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。
RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。
RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。
RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表:


现在开始正式讲解RSA加密算法。
算法描述:
(1)选择一对不同的、足够大的素数p,q。
(2)计算n=pq。
(3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。
(4)找一个与f(n)互质的数e,且1<e<f(n)。
(5)计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)
这里要解释一下,≡是数论中表示同余的符号。公式中,≡符号的左边必须和符号右边同余,也就是两边模运算结果相同。显而易见,不管f(n)取什么值,符号右边1 mod f(n)的结果都等于1;符号的左边d与e的乘积做模运算后的结果也必须等于1。这就需要计算出d的值,让这个同余等式能够成立。
(6)公钥KU=(e,n),私钥KR=(d,n)。
(7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:
(8)解密过程为:



我根据这个写了几个小程序:

1.产生一对公钥和私钥

#coding=utf-8"""此代码的作用是产生一段rsa加密的公钥和私钥公钥 KU=(e,n)私钥KR=(d,n)附rsa密钥产生过程:(由于只是示例,我们采用小质数进行演示)1.产生 素数p,q2.n=p*q3.f(n)=(p-1)*(q-1)4.找一个与f(n)互质的数e ,1<e<f(n)5.d   de= 1(mod f(n))    此处部位等号  而是同余号  表示  de 和 1 对f(n) 的 余数相同   也可以白哦是为d=e-1 mod f(n)  依然是同余6.输出公钥 私钥"""import random#此处采用小质数global primerprimer=[3, 5, 7, 11, 13, 17]def PQ():    length=len(primer)    while True:        a=random.randint(0,length-1)        b=random.randint(0,length-1)        if a!=b:            return primer[a],primer[b]def isPrime(num):    for i in range(2,num):        if num %i ==0:            return False    return Trueif __name__ == '__main__':    p,q=PQ()    #p,q=3,11    print "p,q =",p,q        n=p*q    print "n=",n        fn=(p-1)*(q-1)    print "fn=",fn            #Get e    SeqE=[]    for i in range(2,fn):        if isPrime(i):            SeqE.append(i)    i=random.randint(0,len(SeqE)-1)    print SeqE    e=SeqE[i]    print "e=",e        #e=3            for d in range(2,1000):        if (d*e)%fn==1:            print "d=",d            flag=1            break    else:        flag=0        print "Can't find d"     if flag:        print "KU=(%d,%d)" % (e,n)        print "KR=(%d,%d)" % (d,n)            

运行结果如下:

p,q = 3 11n= 33fn= 20[2, 3, 5, 7, 11, 13, 17, 19]e= 3d= 7KU=(3,33)KR=(7,33)

加密程序:

#coding=utf-8import sysfrom optparse import OptionParserdef RSAencrypt(e,n,str):    """              加密公式 c=M的e次方  (mod n)  前面不是等号 是同余号    """    print "e=%d,n=%d.str=%s" %(e,n,str)    res=[]    for i in str:        #a~~~z  对应   1~~26        t=((ord(i)-96)**e)%n        print t,        res.append(chr(t+96))    print ""    return "".join(res)    if __name__ == '__main__':    parser = OptionParser()         parser.add_option("-e", dest="e",type="int",help="e")    parser.add_option("-n",dest="n",type="int",help="n")    parser.add_option("-s","--str",dest="str",type="string",help="str")        (options, args) = parser.parse_args()         print u"只加密小写字母a~~~z"    if options.e and options.n and options.str:        EncryptedStr=RSAencrypt(e=options.e,n=options.n,str=options.str)        print "EncryptedStr=",EncryptedStr    else:        print "Usage Errors!"                    


解密程序如下:

#coding=utf-8import sysfrom optparse import OptionParserdef deciphering(d,n,str):    """    解密公式   m=c的d地方 (mod n)   不是等号  是同余哦     """    print "d=%d,n=%d,str=%s" %(d,n,str)    res=[]    for i in str:        #a~~~z  对应   1~~26        t=((ord(i)-96)**d)%n        print t,        res.append(chr(t+96))    print ""    return "".join(res)        if __name__ == '__main__':    parser = OptionParser()         parser.add_option("-d", dest="d",type="int",help="d")    parser.add_option("-n",dest="n",type="int",help="n")    parser.add_option("-s","--str",dest="str",type="string",help="str")        (options, args) = parser.parse_args()         print u"只解密小写字母a~~~z"    if options.d and options.n and options.str:        decipheringStr=deciphering(d=options.d,n=options.n,str=options.str)        print "decipheringStr=",decipheringStr    else:        print "Usage Errors!"                



因为是小程序  有局限性  无论是素数还是范围都是比较小的 只能适合来学习~~~~~


你看,它的原理就可以这么简单地解释!
当然,实际运用要比这复杂得多,由于RSA算法的公钥私钥的长度(模长度)要到1024位甚至2048位才能保证安全,因此,p、q、e的选取、公钥私钥的生成,加密解密模指数运算都有一定的计算程序,需要仰仗计算机高速完成。

最后简单谈谈RSA的安全性

首先,我们来探讨为什么RSA密码难于破解?

在RSA密码应用中,公钥KU是被公开的,即e和n的数值可以被第三方窃听者得到。破解RSA密码的问题就是从已知的e和n的数值(n等于pq),想法求出d的数值,这样就可以得到私钥来破解密文。从上文中的公式:d ≡e-1 (mod((p-1)(q-1)))或de≡1 (mod((p-1)(q-1))) 我们可以看出。密码破解的实质问题是:从Pq的数值,去求出(p-1)和(q-1)。换句话说,只要求出p和q的值,我们就能求出d的值而得到私钥。
当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。比如当pq大到1024位时,迄今为止还没有人能够利用任何计算工具去完成分解因子的任务。因此,RSA从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何。
此外,RSA的缺点还有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。因此,使用RSA只能加密少量数据,大量的数据加密还要靠对称密码算法。






0 0
原创粉丝点击