rsa算法代码_RSA的Python3实现

python3安装gmpy2

(1)下载wheel下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

gmpy2-2.0.8-cp37-cp37m-win_amd64.whl

(2)pip3 install 文件路径
pip3 install gmpy2

(3)

e5a776deb8124a04eb5a5261272a2620.png

(4)gmpy2用法

n= gmpy2.mpz(1999999)

gmpy2.is_prime(n)

gmpy2.next_prime(n)

gmpy2.powmod(M,e,n) 幂取模

gmpy2.gcd(a,b)

gmpy2.gcdext(a,b) 扩展欧几里得算法

gmpy2.iroot(x,n) x开n次根

d = gmpy2.invert(e,n) 求逆元,de = 1 mod n

  1. RSA原理

参考《密码编码学与网络安全——原理与实践》

2. 实现方法

(1) 直接调用rsa库,利用(pubkey, privkey) = rsa.newkeys(512, poolsize=8)产生公私钥,利用crypto = rsa.encrypt(message, pubkey)和message = rsa.decrypt(crypto, privkey)加解密数据

(2)调用gmpy库,利用gmpy2.next_prime(n)产生两个大素数p和q,再利用gmpy2.invert(e, n)即可得到公钥和私钥,最后利用gmpy2.powmod(M, e, n)可实现加密以及解密。

(3)直接实现,难点在于实现扩展欧几里得算法以及快速模幂算法,要理解其原理。

3. 源代码

'''
RSA加密

p,q 500位

方法1 直接调用rsa库
方法2 调用gmpy库
方法3 直接编写
/***20201127***/
'''
import time
import random
import gmpy2

# 产生x位素数
def _get_p(x):
    n = random.randint(10**x,9*10**x)
    if not gmpy2.is_prime(n):
        n = gmpy2.next_prime(n)
    return n

print("当前时间:"+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
# 求最大公约数 
# Euclid 算法
def _gcd(a, b):
    if b == 0:
        return a
    else:
        return gcd(b, a % b)
    
# 扩展的Euclid算法
# ax + by = 1 = gcd(a, b) 
# ay + b(x−⌊a/b⌋×y) = a×* + b×*

def _gcd2(a, b):   
    if b == 0:         
        return 1, 0, a     
    else:         
        x, y, q = _gcd2(b, a % b)        
        x, y = y, (x - (a // b) * y)         
        return x, y, q

# 快速求幂 & 取模
def _fast_exp_mod(b, e, m):
    result = 1
    while e != 0:
        if (e&1) == 1:
            result = (result * b) % m
        e >>= 1
        b = (b*b) % m
    return result

# 生成公钥和私钥
def _getkey(p, q):
    n = p*q
    fai = (p-1)*(q-1)
    e = 65537
    x, y, q = _gcd2(e, fai)
    if x < 0 :
        x = x + fai
    d = x
    return  (n, e), (n, d)

def _getkey2(p, q):
    n = p*q
    fai = (p-1)*(q-1)
    e = 65537
    d = gmpy2.invert(e,fai)

    return (n, e),(n, d)
    
    
 # 加密信息    
def _enc(m, pubkey):
    n = pubkey[0]
    e = pubkey[1]
    
    #c = _fast_exp_mod(m, e, n)
    c = gmpy2.powmod(m,e,n)
    return c

# 解密信息
def _dec(c, privkey):
    n = privkey[0]
    d = privkey[1]
    
    #m = _fast_exp_mod(c, d, n)
    m = gmpy2.powmod(c,d,n)
    return m
 
    
if __name__ == "__main__":
    p = _get_p(500)
    q = _get_p(500)
    pubkey, privkey = _getkey2(p, q)
    m = 135620532045761028874519896765764416637997218983980438907459156366663406664656441068595521782504862606619086653659240596696402402223658759344712239254003849389312124894878052511782288923057497865141807540335743969274339825020706092092911760603349055915956098776876832482301157928322339296445443990454267563768
    print('加密前明文')
    print(m)
    
    c = _enc(m, pubkey)
    print('加密后密文')
    print(c)

    d = _dec(c, privkey)
    print('解密后明文')
    print(d)

import rsa

(pubkey, privkey) = rsa.newkeys(512, poolsize=8)

message = 'hello Bob!'.encode('utf8')

# 加密数据
crypto = rsa.encrypt(message, pubkey)

# 解密数据
message = rsa.decrypt(crypto, privkey)

modulus = pubkey.n
exponent = pubkey.e

key = rsa.PublicKey(modulus, exponent)

print(key)

print(pubkey)

print(type(modulus))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值