RSA 加密算法 - Python版

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

code

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值