[python]rsa加密算法的一个简单实现

最近一个多月在学习python,先看这个教程学了语法,然后看这个博客学习了简单的爬虫,以及简单的正则表达式。写了爬虫爬了百度贴吧的帖子,以及学校系统的个人成绩。

本文在看了《为什么自然数中存在无穷多个素数》后,觉得可以写个简单的RSA算法来练习下python。参考维基百科对这个算法的描述,就可以写出这个代码。

程序结构

  1. gen_prime_num(max_num) ,产生max_num以内的素数
  2. gen_rsa_key() ,产生公钥和私钥
  3. encrypt(pub_key,origal) ,用公钥对原文进行加密
  4. decrypt(pri_key,encry) , 用私钥对密文进行解密

程序运行

[python]rsa加密算法的一个简单实现_第1张图片
首先程序产生一定范围的素数,具体范围可以在代码里面自行设置。然后用户随机选择两个素数,当然也可以用random函数随机选择。
然后产生了public key和private key。然后输入要加密的字符串。最后显示密文,和解密后的字符串。可以看出,密文和原文一致。

问题总结

  1. 素数的选择不能太小,因为RSA算法规定,被加密的原文数值应该小于两个素数的乘积N。素数太小,加密容易被破解。素数太大的话,用python运行有点慢。
  2. 产生密钥的过程中要计算一个模逆元素,在本程序中用了遍历的方法寻找。其实可以用专门的算法来求,维基百科里面提供了个求法。
  3. 对用户的输入检测,以及要加密的原文范围没有进行更多的测试。

源代码

# -*- coding:utf-8 -*-

#---------------------------------------  
#   程序:RSA  
#   版本:1.0  
#   作者:cqz
#   日期:2014-07-30  
#   语言:Python 2.7  
#   功能:产生密钥,加密,解密  
#--------------------------------------- 

import math
import random

def gen_prime_num(max_num):
    prime_num=[]
    for i in xrange(2,max_num):
        temp=0
        sqrt_max_num=int(math.sqrt(i))+1
        for j in xrange(2,sqrt_max_num):
            if i%j==0:
                temp=j
                break
        if temp==0:
            prime_num.append(i)

    return prime_num

def gen_rsa_key():
    prime=gen_prime_num(500)
    print prime[-80:-1]
	
    while 1:
        prime_str=raw_input("\n please choose two prime number from above: ").split(",")
        p,q=[int(x) for x in prime_str]
        if (p in prime) and (q in prime):
            break
        else:
            print "the number you enter is not prime number."
    
    N=p*q
    r=(p-1)*(q-1)
    r_prime=gen_prime_num(r)
    r_len=len(r_prime)
    e=r_prime[int(random.uniform(0,r_len))]
    d=0
    for n in xrange(2,r):
        if (e*n)%r==1:
            d=n
            break
    
    return ((N,e),(N,d))

def encrypt(pub_key,origal):
    N,e=pub_key
    return (origal**e)%N

def decrypt(pri_key,encry):
    N,d=pri_key
    return (encry**d)%N

if __name__=='__main__':
    pub_key,pri_key=gen_rsa_key()
    print " public  key ",pub_key
    print " private key",pri_key    
    
    origal_text=raw_input("\n please input the origal text: ")
    encrypt_text=[encrypt(pub_key,ord(x)) for x in origal_text]
    decrypt_text=[chr(decrypt(pri_key,x)) for x in encrypt_text]
    
    encrypt_show=",".join([str(x) for x in encrypt_text])   
    decrypt_show="".join(decrypt_text)
    print " encrypt text: ",encrypt_show
    print " decrypt text: ",decrypt_show


你可能感兴趣的:([python]rsa加密算法的一个简单实现)