公钥用于加密,私钥用于解密,私钥负责制作签名,公钥负责验证签名。如果你强行的使用私钥加密,公钥解密,纯粹从技术上考虑,是可行的,私钥加密后的数据,公钥可以解密。但是呢,几乎很少见到有人这样做,python的pycryptodome库就只提供RSA 公钥加密的方法,而没有提供公钥解密的方法。
最近就遇到了需要公钥解密的特殊情况,虽然我对于私钥加密,公钥解密的这种做法感到别扭,但同时也拿不出足够有说服力的证据证明这种做法不安全。在数据加密解密这块,我一直使用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