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)
(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
- 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))