您的位置:首页 > 编程语言 > Python开发

PYTHON实现RSA算法之简洁代码

2014-07-22 17:21 423 查看
写在前面 

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)这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了再来, 计算 n = pqm, n 这两个数便是 public key

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

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

 

二、RSA 的安全性

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

def is_ET_Prime(ee,tt):
while tt!=0:
a=ee
ee=tt
tt=a%tt
if ee==1:
return True
else:
return False

def get_publickey(k,t):
d=0
while ((d*k)%t!=1):
d+=1
return d

def 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
"""

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息