python中可以使用利用rsa、pycryptodome和m2crypto等第三方库实现RSA非对称加解密。
但是rsa和pycryptodome库只能实现公钥加密+私钥解密、私钥签名+公钥验证,只有m2crypto可以实现公钥加密+私钥解密、私钥加密+公钥解密。
笔者通过百度、bing、360等各种引擎搜索发现:
- 要么是在linux或macOS环境中配置m2crypto;(✘)
- 要么是在windows下的python2环境中配置m2crypto;(✘)
- 要么是多年前的帖子,建议通过pip install --egg M2CryptoWin64下载安装,经验证,该命令在windows 64位操作系统 python3环境下已失效。(✘)
总之网络上充斥大量不符合要求或过时的无用信息。
本文介绍一下笔者的成功操作,并给出示例代码和相关文件
一.开发环境
1. 操作系统:windows10 64位专业版
2. python:3.8 下载地址
3. M2Crypto:0.35.2 (下载地址见文末)
安装步骤:
第一步:先安装python3.8
第二步:双击M2Crypto.exe安装文件进行安装,该程序会自动安装在python3.8安装目录下的“\Lib\site-packages\”文件夹中
二.python代码
1.生成公私钥对
# 生成公私钥对
def generate_PriPubKeypair(self):
pk = RSA.gen_key(1024, m2.RSA_F4, lambda x: None)
private = pk.as_pem(None)
pu = BIO.MemoryBuffer()
pk.save_pub_key_bio(pu)
public = pu.read()
return private, public
2.私钥加密+公钥解密
# 利用私钥加密
def encrypt_by_privatekey(self, msg):
bytes_16_msg = msg.encode('utf-8')
bytes_16_encrypted = self.rsa_pri.private_encrypt(bytes_16_msg, RSA.pkcs1_padding)
str_64_encrypted = b64encode(bytes_16_encrypted).decode()
return str_64_encrypted
# 利用公钥解密
def decrypt_by_publickey(self, msg):
bytes_16_encrypted = b64decode(msg.encode())
bytes_16_decrypted = self.rsa_pub.public_decrypt(bytes_16_encrypted, RSA.pkcs1_padding)
str_decrypted = bytes_16_decrypted.decode('utf-8')
return str_decrypted
3.公钥加密+私钥解密
# 利用公钥加密
def encrypt_by_publickey(self, msg):
bytes_16_msg = msg.encode('utf-8')
bytes_16_encrypted = self.rsa_pub.public_encrypt(bytes_16_msg, RSA.pkcs1_padding)
str_64_encrypted = b64encode(bytes_16_encrypted).decode()
return str_64_encrypted
# 利用私钥解密
def decrypt_by_privatekey(self, msg):
bytes_16_encrypted = b64decode(msg.encode())
bytes_16_decrypted = self.rsa_pri.private_decrypt(bytes_16_encrypted, RSA.pkcs1_padding)
str_decrypted = bytes_16_decrypted.decode('utf-8')
return str_decrypted
4.运行测试
if __name__=='__main__':
demo=M2Crypto_Demo()
ori_msg="人生苦短,我用python!"
# 私钥加密+公钥解密
print('1-私钥加密+公钥解密')
print(demo.encrypt_by_privatekey(ori_msg))
print(demo.decrypt_by_publickey(demo.encrypt_by_privatekey(ori_msg)))
print('-'*100)
# 公钥加密+私钥解密
print('2-公钥加密+私钥解密')
print(demo.encrypt_by_publickey(ori_msg))
print(demo.decrypt_by_privatekey(demo.encrypt_by_publickey(ori_msg)))
6.输出结果
1-私钥加密+公钥解密
rMkeunv7kx2Xl9L/uhVToqzxOD5a/gkmWzye04CAIvVMl9BUk1+QP/YvS0asB6SHaatrRiU6ZRipR8QXaSLwohmvEyaFl1pO2SmDvOA9jmdeadIxUMsx0nFrkS6spoSJPWjPD9D336HoGEHij5q5rX6kEHWh8p1Nl6lCANEg3Io=
人生苦短,我用python!
----------------------------------------------------------------------------------------------------
2-公钥加密+私钥解密
aWlNw+mTOIMmYNDqWCry+xPpbHBLgGJTYlvJANyWpo4ij2uqUpGJQ8jkdUYZxXeGW8GhIUGHNM1S0YlueBVuke0liv955wH2hzPhfIp9ZgoMFRVDNxL1u6uWD9asNkOEMZ15fmCSuUltxUFN3kkhX03X2oz5HL68rgHtguFRAnM=
人生苦短,我用python!
完整示例代码及相关库安装文件:下载地址