【python编程】windows中Python3.8利用M2Crypto实现RSA公私钥双向加解密

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!

完整示例代码及相关库安装文件下载地址


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: Python RSA 密和解密文件的基本流程如下: 1. 使用 RSA 库生成公和私。 2. 使用公对文件进行密。 3. 使用私密后的文件进行解密。 示例代码: ``` from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP # 生成公和私 key = RSA.generate(2048) private_key = key.export_key() public_key = key.publickey().export_key() # 使用公密文件 with open("original_file.txt", "rb") as f: original_data = f.read() cipher = PKCS1_OAEP.new(RSA.import_key(public_key)) encrypted_data = cipher.encrypt(original_data) with open("encrypted_file.bin", "wb") as f: f.write(encrypted_data) # 使用私解密文件 with open("encrypted_file.bin", "rb") as f: encrypted_data = f.read() cipher = PKCS1_OAEP.new(RSA.import_key(private_key)) decrypted_data = cipher.decrypt(encrypted_data) with open("decrypted_file.txt", "wb") as f: f.write(decrypted_data) ``` 请注意,上面的代码仅用于示例目的,实际应用需要注意密的安全存储。 ### 回答2: RSA密算法是一种非对称密算法,它使用一对相互关联的公和私进行解密。公用于密数据,而私用于解密数据。 在使用Python进行RSA解密文件时,我们首先需要生成一对公私。可以使用`rsa`库的`newkeys()`函数来生成密对。例如,以下代码将生成一对2048位的公私: ``` from rsa import newkeys # 生成一对公私 (pub_key, priv_key) = newkeys(2048) ``` 接下来,我们可以使用公私进行文件的解密操作。以下是一个使用RSA解密文件的示例代码: ``` from rsa import encrypt, decrypt # 密文件 def encrypt_file(file_path, output_path, pub_key): with open(file_path, 'rb') as file: data = file.read() enc_data = encrypt(data, pub_key) with open(output_path, 'wb') as output_file: output_file.write(enc_data) # 解密文件 def decrypt_file(file_path, output_path, priv_key): with open(file_path, 'rb') as file: enc_data = file.read() dec_data = decrypt(enc_data, priv_key) with open(output_path, 'wb') as output_file: output_file.write(dec_data) ``` 在使用以上代码时,需要指定待密的文件路径、密后的文件输出路径以及公私。可以通过`pub_key.save_pkcs1()`和`priv_key.save_pkcs1()`方法将密保存到文件以便后续使用。 需要注意的是,RSA密算法会对数据进行分块解密,因此对于较大的文件,可能需要分块密再拼接。另外,RSA密算法的运算耗时较长,因此在实际使用可能需要将其用在对安全性要求较高的场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空worker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值