Python中的RSA加密与解密
from Crypto.PublicKey import RSA
# 1. 生成 RSA 密钥对 (2048位)
rsa_key = RSA.generate(2048)
# 导出公钥
public_key = rsa_key.publickey().exportKey()
print(public_key)
print(public_key.decode())
# 检查public_key的类型
print(f"数据类型: {type(public_key)}")
# print(f"数据类型: {type(public_key.decode())}")
# 导出私钥
private_key = rsa_key.exportKey()
print(private_key.decode())
print(f"数据类型: {type(private_key)}")
print(f"数据类型: {type(private_key.decode())}")
注意:要使用pycryptodome加密库
public_key = rsa_key.publickey().exportKey()
这个方法会从私钥对象中提取出对应的公钥部分,返回一个新的 rsa.PublicKey 对象,而.exportKey()是 rsa 库中 PublicKey 对象的方法,它将公钥序列化为字节串(bytes),默认情况下,它导出为 PEM 格式(即以 -----BEGIN PUBLIC KEY----- 开头的文本块)。
这里面就有个疑问了,既然导出的是PEM格式的字节串,为什么print(public_key)打出来的是如下:
b'-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAonzP4mAvdelxAOawQ5mJ\nFqe1NLj0rVkn0mFG3Cn8WAsIoIWO07JIZQ7Ig8+nmlZbb+FXs6Anjrc5cTNRpjDo\naH1sEiIo8OjOT2nDGBaWyhvt6/by3SmVkEHJc/qaUgqKlEMEQ6h32i8PD3yDcRb1\nWDn0X34Au5s0tdJCi5M/3kIHwWrFSO5lSCHvbddb5Upov28wBKB17qApqYS9MTo4\ns6cG72t8tC6Svp0pNSDNFTnRPs/oUgKeCxqG2MB4MmBWWkuMz06llnXnRvRzVuJU\nupVw6nsDAeeu1DOcilmaGpqC6njIG2BwENNx3mVdTPDeK5d3IeKRblbdV4BbQHgn\nvwIDAQAB\n-----END PUBLIC KEY-----'
以b'开头,类似字符串的可见格式。
from Crypto.PublicKey import RSA
# 1. 生成 RSA 密钥对 (2048位)
rsa_key = RSA.generate(2048)
# 导出公钥
public_key = rsa_key.publickey().exportKey(format='DER')
print(public_key)
加入format = 'DER',输出的就是字节了,如:b'0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xad\x882\xa3\x8e~\xc5\x8d\n\x9e\x03M\xa6\xe8\x9d\xae\xd3\x94\x96\xbb)
因为 exportKey() 的默认格式就是 PEM,而 PEM 格式本质上是经过 Base64 编码的文本字符串,所以它可以被安全地解码为 UTF-8。
Base64 编码的密钥数据(将二进制数据转换成了仅包含 A-Z, a-z, 0-9, +, / 的文本),因为 Base64 编码产生的字符完全在 ASCII/UTF-8 的合法范围内,Python 可以毫无障碍地将这些字节转换为字符串。
综合上述,第一段代码的输出结果及验证结果如下所示:


浙公网安备 33010602011771号