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
"""
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
"""
相关文章推荐
- 使用python实现rsa算法代码
- python简洁代码实现快速排序
- Python 25行代码实现的RSA算法详解
- 使用python实现rsa算法代码
- 代码非常简洁且兼容多浏览器的拖动层实现代码
- Python中的文件和目录操作实现代码
- Python 文件操作实现代码
- Python 文件操作实现代码
- Run As(运行方式) 的几种代码实现方式(Python和C#)
- D-Bus入门(四)——QTDBUS代码,实现ofono代码下的python测试文件activite-context的功能
- 代码非常简洁且兼容多浏览器的拖动层实现代码
- Python代码实现Java本地化资源字符串的检查,防止出现空指针异常
- Python,代码可以再简洁
- python中将阿拉伯数字转换成中文的实现代码
- 假导出Excel功能实现,按CSV格式快速导出功能代码参考(追求代码追求简洁复用)浙江杭州
- .net3.5下使用LINQ递归算法实现简洁代码
- 简洁的一个实现网页全屏代码
- PAMIE- Python实现IE自动化的模块(附 网易注册代码)
- 最近在研究enigma2的代码,那叫个庞大,C/C++写中间件,上层应用全部用python实现,可以学习一下plugin的实现机制了.