【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!

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


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Node.js 的 crypto 是一个内置模块,用于提供加密和解密功能。它支持各种加密算法和操作,包括哈希函数、对称加密和非对称加密。你可以使用 crypto 模块来实现数据的加密、解密、签名和验证等操作。 要使用 crypto 模块,你需要在你的代码引入它,例如: ```javascript const crypto = require('crypto'); ``` 一些常见的 crypto 操作包括: 1. 哈希函数:crypto 模块提供了多个哈希函数,如 MD5、SHA-1、SHA-256 等。你可以使用这些函数对数据进行哈希处理,生成唯一的摘要。例如: ```javascript const hash = crypto.createHash('sha256'); hash.update('Hello, world!'); const digest = hash.digest('hex'); console.log(digest); // 输出生成的摘要 ``` 2. 对称加密:crypto 模块支持对称加密算法,如 AES、DES、3DES 等。你可以使用这些算法对数据进行加密和解密。例如: ```javascript const cipher = crypto.createCipher('aes192', 'password'); let encrypted = cipher.update('Hello, world!', 'utf8', 'hex'); encrypted += cipher.final('hex'); console.log(encrypted); // 输出加密后的数据 const decipher = crypto.createDecipher('aes192', 'password'); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); console.log(decrypted); // 输出解密后的数据 ``` 3. 非对称加密:crypto 模块还支持非对称加密算法,如 RSA。你可以使用这些算法生成钥和私钥,进行加密和解密。例如: ```javascript const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 4096, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' } }); console.log(publicKey); // 输出生成的钥 console.log(privateKey); // 输出生成的私钥 const encrypted = crypto.publicEncrypt(publicKey, Buffer.from('Hello, world!')); console.log(encrypted.toString('base64')); // 输出加密后的数据 const decrypted = crypto.privateDecrypt(privateKey, encrypted); console.log(decrypted.toString('utf8')); // 输出解密后的数据 ``` 这只是 crypto 模块的一小部分功能,你可以查阅 Node.js 文档以获取更详细的信息和使用方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

时空worker

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

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

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

打赏作者

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

抵扣说明:

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

余额充值