PYTHON实现RSA算法之简洁代码

来源:互联网 发布:mac launchpad 是什么 编辑:程序博客网 时间:2024/05/21 12:41


写在前面 

RSA算法,在现代密码学中真的是算得上么么哒了。它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir Leonard Adleman

 

一.算法简介(写得浅显易懂,基础理论请自己查询~

1. 三个数, p, q, r, 其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数p, q, r 这三个数便是 private key

2. 找出 m, 使得 rm == 1 mod (p-1)(q-1)这个 一定存在因为 与 (p-1)(q-1) 互质用辗转相除法就可以得到了再来计算 n = pqm, n 这两个数便是 public key

3. 加密过程是,  a看成是一个大整数假设 a < n如果 a >= n 的话就将 表成 进位 (s <= n, 通常取 s = 2^t), 即进行分组~则每一位数均小於 n, 然後分段编码接下来计算 b == a^m mod n, (0 <= b < n), b 就是编码後的数据。

4.解密过程呢,和加密算法一样,只是用到的密钥不同而已,若加密为公钥,这这一步就用私钥~

 

二、RSA 的安全性

RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解 RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前, RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解多个十进制位的大素数。因此,模数必须选大一些,因具体适用情况而定。

 

三、RSA的速度

由于进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。(这就是为什么要使用HASH,详情见我的文章—— 

HASH之于信息安全领域加解密算法

 

四.PYTHON语言实现

#! E:/新建文件夹/python# -*- coding: cp936 -*-def isPrime(number):     import math     i=2     sqrtnum=(int)(math.sqrt(number))     for i in range(2,sqrtnum+1):         if number%i==0:             return False         i=i+1     return Truedef is_ET_Prime(ee,tt):    while tt!=0:        a=ee        ee=tt        tt=a%tt    if ee==1:        return True    else:        return Falsedef get_publickey(k,t):    d=0    while ((d*k)%t!=1):        d+=1    return ddef encryption(plain,d,n):        re=(plain**d)%n        return re    if __name__=="__main__":    print "~"*70    Flag =False    while True:        p=int(raw_input("please input a prime p:"))        q=int(raw_input("please input a prime q:"))        if ( isPrime(p)and isPrime(q)):             break        else:             print "p or q is not prime!"             continue         print "p=",p,"q=",q        n=q*p    t=(q-1)*(p-1)    print "n=",n,"t=",t    print "~"*70    Flag==False    while Flag==False:        e=int(raw_input("please input a private key:"))        Flag=is_ET_Prime(e,t)        if Flag==False:            print "e is not prime with the t!"    print "the private key e=",e    d=get_publickey(e,t)    print "the public key d=",d    plain=int(raw_input("please input the plain you want to entrypted:"))    encry=encryption(plain,d,n)    print "plain",plain,"is encrypted as",encry    plain1=encryption(encry,e,n)    print "encrypt",encry,"is decrypted as",plain1    """        Flag==False       while Flag==False:        q=int(raw_input("please input a prime q:"))        if q==p:             continue        Flag=isPrime(q)         if Flag==False:            print "q is not a prime"    print "q=",q"""                        


0 0