Python实现RSA加密算法

RSA介绍

RSA加密算法是由美国麻省理工学院的3名密码学者Rivest、Shamir、Adleman提出的一种基于大合数因式分解困难性的公共弄开密钥密码。由于它的安全、易懂,因此已成为目前应用最广的公开密钥密码

加密过程

  1. 随机选择两个大素数p和q,p和q都保密
  2. 计算n=pq,将n公开
  3. 计算 φ(n) =(p-1) * (q-1),r=φ(n),r和φ(n)保密
  4. 随机选取一个正整数e,1
  5. 根据ed≡1 mod r ,(≡表示模同余运算),计算出d,将d,保密。(n,d)就构成了用户私钥
  6. 加密运算:C=M^e mod n
  7. 解密运算:M=C^e mod n

RSA参数选择
为确保RSA密码安全,必须认真选择RSA密码参数

  1. p和q要足够大,n才足够大,才能对抗因式分解
  2. p和q应为强素数
  3. p和q的差要大,即|p-q|要大

以下是用python3.X实习的rsa加密算法,可以参考一下

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Hac

import math
import random


#生成素数数组

def prime_array():
    arraya = []
    for i in range(2,2000):
        x = prime(i,2)
        if x:
            arraya.append(i)
    return arraya


#判断是否为素数
def prime(n,test_divisor):
    if math.sqrt(n) < test_divisor:
        return True
    if n % test_divisor == 0:
        return False
    else:
        return prime(n,test_divisor+1)


#互质e
def co_prime(r):
    while True:
        e = random.choice(range(2000))
        if r < e:
            x =gcd(e,r)
        else:
            x = gcd(r,e)
        if x == 1:
            break
    return e


#最大公约数
def gcd(a,b):
    if b == 0:
        return a
    else:
        return gcd(b,a % b)

#ed mod r =1
def find_d(e,r):
    for d in range(10000000):
        x = (e*d) % r
        if x == 1:
            return d

#生成公钥私钥的基本条件
def test():
    a = prime_array()
    print("前2000个素数:",a)
    p = random.choice(a)
    q = random.choice(a)
    print("随机抽取两个素数p&q,p=",p,"q=",q)
    n = p*q
    r = (p-1)*(q-1)#fy
    e = co_prime(r)
    print("根据互质得到e=",e)
    d = find_d(e,r)
    print("求到模逆元d,d=",d)
    pbvk=(n,e,d)
    return pbvk

#生成public key & private key
def generate_pbk_pvk(a,zx):
    pbk = (a[0],a[1])
    pvk = (a[0],a[2])
    print("pbk:",pbk,"pvk;",pvk)
    if zx == 0:
        return pbk
    if zx == 1:
        return pvk

#加密
def encryption(mw,ned):
# 密文b = 明文a的e次方 模 n,ned为公钥
#mw为明文a,ned【1】是e,ned【0】是n
     B = pow(mw,ned[1]) % ned[0]
     return B

#解密
def decode(mw,ned):
    C = pow(mw,ned[1]) % ned[0]
    return C

if __name__=='__main__':
    pbvk = test()
    pbk = generate_pbk_pvk(pbvk, 0) #公钥 if 0 return pbk if 1 return pvk
    A = int(input("请输入明文(需小于%d): " % pbk[0]))
    while A >= pbk[0]:
        A = int(input("明文大于%d,请重新输入:" % pbk[0]))
        if not A >= pbk[0]:
            break
    B = encryption(A,pbk) #加密
    print("生成的密文是: ", B)
    pvk = generate_pbk_pvk(pbvk, 1) #私钥
    C = decode(B,pvk) #解密
    print("解密后的明文是  : ", C)
    if A==C:
        print("加密前的明文和解密后的明文一样")
    else:
        print("加密前的明文和解密后的明文不一样")

这个代码只是最基础的,只能实现一些数字加密与解密,代码参考熊與猫v如果有什么不足还请大佬们指教

你可能感兴趣的:(Python实现RSA加密算法)