RSA算法的Python实现(模幂运算——原始算法)

数字硬件安全 同时被 2 个专栏收录
22 篇文章 3 订阅
37 篇文章 3 订阅

参考文章:
RSA的基本原理就不做赘述,详细的可以去查一查,主要介绍使用python来计算RSA算法

设p、q为质数
n = p*q
fn = (p-1)*(q-1)
要满足: 1 < e < fn , 且 e 与 fn 互质
满足: e*d%fn = 1 (d>1) 
e 为公钥 , d 为私钥
把e 和 n 发给 客户端
m 为明文 
c = m^e%n
c 为密文
在把 c 发给服务器
m = c^d%n
最后得到 m

# coding=utf-8
import random

num_list = list()

#判断x是否为素数,是返回True
def isPNs(x):
    for j in range(2,x):
        if (x % j == 0):
            return False
    return True

#将10000以内的素数,放进列表中
def isPN():
    for i in range(3,10001):
        if (isPNs(i)):
            num_list.append(i)
    print ("已完成10000以内质数运算(1/6)")

def returnED(fn):
    fnPn = list()       #将fnPn的所有因子放入列表中
    for i in range(2,int(fn/2)+1):
        if(fn%i==0):
            fnPn.append(i)
    fnPn.append(fn/2)
    print ("已完成fn所有因子运算(2/6)",'leng=',len(fnPn))

    
    for i in range(random.randint(0,fn-1),1,-1):
    #for i in range(fn - 1, 1, -1): #此算法直接取离fn最近的互质的数作为e
        flag = True        
        #判断j和fn的所有质因子是否互质,否则标志为False
        for j in range(len(fnPn)):
            if(i%fnPn[j] == 0):
                flag = False
                break
            
        if(flag):
            print ("已完成e运算(3/6), i=",i)
            j = 1
            while True:
                if(i*j%fn == 1):
                    print ("已完成d运算(4/6), j=",j)
                    return i,j
                j += 1

def disp():
    isPN()
    num1 = len(num_list)/2-1
    p = num_list[random.randint(0,int((len(num_list))/2-1))]
    q = num_list[random.randint(0,int((len(num_list))/2-1)) + int(len(num_list)/2)]
    n = p*q
    fn = (p-1)*(q-1)
    e,d = returnED(fn)
    m = int(input('请输入你要加密传输的数字:'))   # 明文
    c = m**e%n # 密文,m的e次方幂
    print ("已完成c运算(5/6), c=",c) 
    m = c**d%n  # 通过c解出来的 明文
    print ("已完成m运算(6/6)")
    print ("p =",p,",q =",q,",n =",n,",fn =",fn,",e =",e,",d =",d,",c =",c,",m =",m)
    
def main():
    disp()

if __name__ == '__main__':
    main()

RSA算法原理
Python实现RSA加密算法

  • 1
    点赞
  • 0
    评论
  • 7
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值