python rsa 公钥解密

1. 公钥加密,私钥解密

公钥用于加密,私钥用于解密,私钥负责制作签名,公钥负责验证签名。如果你强行的使用私钥加密,公钥解密,纯粹从技术上考虑,是可行的,私钥加密后的数据,公钥可以解密。但是呢,几乎很少见到有人这样做,python的pycryptodome库就只提供RSA 公钥加密的方法,而没有提供公钥解密的方法。

2. 公钥解密

最近就遇到了需要公钥解密的特殊情况,虽然我对于私钥加密,公钥解密的这种做法感到别扭,但同时也拿不出足够有说服力的证据证明这种做法不安全。在数据加密解密这块,我一直使用pycryptodome,但它并没有提供RSA 公钥解密的方法,在网上苦苦寻找了好久,又不停的实验了好久,终于让我找到了python 使用RSA 公钥解密的方法。

想要使用RSA 公钥解密,需要安装rsa这个库,我使用的版本是3.3,这样python2和3都可以使用。

所使用的公钥,是通过openssl 生成的, 下面是实例代码

import rsa
import binascii
import sys
from rsa import transform, core

PY3 = sys.version_info.major == 3
public_key = '你的公钥'
pem_public_key = "-----BEGIN PUBLIC KEY-----\n" + public_key + "\n-----END PUBLIC KEY-----"


def rsa_decrypt(encrypt_text):
    if PY3:
        b_pem_public_key = pem_public_key.encode('utf-8')
        key = rsa.PublicKey.load_pkcs1_openssl_pem(b_pem_public_key)
    else:
        key = rsa.PublicKey.load_pkcs1_openssl_pem(pem_public_key)

    d = key.e
    n = key.n
    encrypt_text = binascii.a2b_hex(encrypt_text)
    num = transform.bytes2int(encrypt_text)
    decrypto = core.decrypt_int(num, d, n)
    out = transform.int2bytes(decrypto)
    sep_idx = out.index(b"\x00", 2)
    out = out[sep_idx + 1:]
    return out.decode('utf-8')


encrypt_text = '加密后的密文'
print(rsa_decrypt(encrypt_text))

不论是私钥加密,还是公钥加密,加密后得到的都是bytes类型的数据,或是转为base64字符串,或是转成16进制字符串,那么在解密时,相应的也要反向转换一次,我的代码里,假设encrypt_text是经过16进制转换的字符串,因此需要使用a2b_hex转换为types数据。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案