pip install rsa
rsaUtil.py
import base64
import random
import rsa
# https://stuvel.eu/python-rsa-doc/usage.html#generating-keys
class Key(object):
def __init__(self, pub_key: rsa.key.PublicKey, pri_key: rsa.key.PrivateKey):
self.pubKey = pub_key
self.priKey = pri_key
class RsaKeyData(object):
def __init__(self, n: int, e: int, d: int, p: int, q: int):
self.n = n
self.e = e
self.d = d
self.p = p
self.q = q
def get_key():
(pub_key, pri_key) = rsa.newkeys(512)
key1 = Key(pub_key, pri_key)
return key1
def get_key_data():
return get_key_data_by_size(512)
def get_key_data_by_size(key_size: int):
(pubkey, priKey) = rsa.newkeys(key_size)
return RsaKeyData(priKey.n, priKey.e, priKey.d, priKey.p, priKey.q)
def encrypt(pub_key: rsa.key.PublicKey, data: bytes) -> bytes:
encrypt_res = rsa.encrypt(data, pub_key)
return encrypt_res
def decrypt(priv_key: rsa.key.PrivateKey, data: bytes) -> bytes:
content = rsa.decrypt(data, priv_key)
return content
def test(pub_key: rsa.key.PublicKey, pri_key: rsa.key.PrivateKey):
data = '你好世界 Hello world'.encode('utf-8')
encrypt_data = encrypt(pub_key, data)
# print(encrypt_data.hex())
print(base64.encodebytes(encrypt_data).decode().replace('\n', ''))
decrypt_data = decrypt(pri_key, encrypt_data)
print(decrypt_data.decode('utf-8'))
def rsa_test1():
key1 = get_key()
print(key1.pubKey)
print(key1.priKey)
test(key1.pubKey, key1.priKey)
def rsa_test_key():
(pubkeyO, priKeyO) = rsa.newkeys(512)
pubkeydata = pubkeyO.save_pkcs1()
print(pubkeydata.hex())
pubkey = rsa.PublicKey.load_pkcs1(pubkeydata)
prikeydata = priKeyO.save_pkcs1()
print(prikeydata.hex())
privkey = rsa.PrivateKey.load_pkcs1(prikeydata)
test(pubkey, privkey)
def rsa_test2():
key_data = get_key_data_by_size(1024)
pub_key = rsa.key.PublicKey(key_data.n, key_data.e)
# print(key_data.p, key_data.q)
p, q = getpq(key_data.n, key_data.e, key_data.d)
# print(p, q)
pri_key = rsa.key.PrivateKey(key_data.n, key_data.e, key_data.d, p, q)
print(pub_key)
print(pri_key)
test(pub_key, pri_key)
def getpq(n: int, e: int, d: int):
p = 1
q = 1
while p == 1 and q == 1:
k = d * e - 1
g = random.randint(0, n)
while p == 1 and q == 1 and k % 2 == 0:
k //= 2
y = pow(g, k, n)
if y != 1 and gcd(y - 1, n) > 1:
p = gcd(y - 1, n)
q = n // p
return p, q
def gcd(a: int, b: int):
if a < b:
a, b = b, a
while b != 0:
temp = a % b
a = b
b = temp
return a
main.py
from rsaUtil import *
def main():
print('Hello world')
rsa_test2()
if __name__ == '__main__':
main()