1 问题描述
使用python的M2Crypto模块实现rsa的加密和解密,需要提前准备好M2Crypto的安装包,也可以使用pip install M2Crypto --force命令进行安装。
2 实现
以下脚本会生成公钥和私钥文件
# -*- coding: utf-8 -*-
from M2Crypto import RSA, BIO
rsa = RSA.gen_key(2048, 65537)
# 保存公钥到文件
bio_pub = BIO.MemoryBuffer()
rsa.save_pub_key_bio(bio_pub)
with open('rsa_pub.pem', 'wb') as f:
f.write(bio_pub.read())
# 保存私钥到文件
bio_pri = BIO.MemoryBuffer()
rsa.save_key_bio(bio_pri, None)
with open('rsa_pri.pem', 'wb') as f:
f.write(bio_pri.read())
- 加密
# 读取公钥文件
with open('rsa_pub.pem', 'rb') as f:
pub_key = f.read()
# 注:也可以执行用字符串表示pub_key,如下:
# pub_key = """
# -----BEGIN PUBLIC KEY-----
# MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyAqaCNKH1Qkw4f+dcE8e
# 16zLpeZhtg7UPpmhd0qu+CycW9ldj0lh/hmlYpHK6tAdKfjuNLI83iPlluyVA2Sz
# KNNwkZD9rA5pTMbdfEYDjWqH3X/Lwq8NrFsRJdP2anEUSmpHShjhjkROY9fLQlON
# KTsWz+HleqQ4A7ftQ3L1pKpPuK1SQ1cNXDSUHXEn6Qm59jWk733T4yje/xWz4meb
# 6iRuf15ssOvODrzFULBhkxTSecDwf6RDNzxTppba6Vcp6z9owXKGN5mckfqXbOfj
# yOvwmoMZntBKjmNxRF7SHvb9ARG7e7pqWPRRiVVFkp/SBeS+4Xi+dGRgMsitPD3z
# UQIDAQAB
# -----END PUBLIC KEY-----
# """
# 创建 RSA 实例
rsa = RSA.load_pub_key_bio(BIO.MemoryBuffer(pub_key))
# 加密数据
data = 'Hello, World!'
ciphertext = rsa.public_encrypt(data, RSA.pkcs1_padding)
# 打印加密结果
print(base64.b64encode(ciphertext))
# 结果:scT5W5KDutzyyYpfw4gNQL8VEWVOdBo1b1oTFWf36pRZIfpUz+VlxCymHnuGnsAn+JvIz3nc+sodpSXRKgO8SSKvzo0cjPxqcIBDBLviPhJNkhlSWSYN985dPs2XPGtxIcMSYdbT64fg6Z0MWHBxV6NoYtTeS/fG0zKRgavaxt52RS6+KHjt9OhJf65AnlrykJXWx71IsIkDqGgPzMeGfJI9aeRn27YhTorGmbMFm0dp65jaGB/nf+/6ibZcBQi044kTjpHP4mElrDjQFSN5RfSX6gmtORctzQi5mZ/4O3NF7aNqckP5pwxIIjRjxUjM83lHJH2sbHNI0/sdqnSrlw==
- 解密
with open('rsa_pri.pem', 'rb') as f:
pri_key = f.read()
# 创建 RSA 实例
rsa = RSA.load_key_bio(BIO.MemoryBuffer(pri_key))
# 解密数据
ciphertext = base64.b64decode('scT5W5KDutzyyYpfw4gNQL8VEWVOdBo1b1oTFWf36pRZIfpUz+VlxCymHnuGnsAn+JvIz3nc+sodpSXRKgO8SSKvzo0cjPxqcIBDBLviPhJNkhlSWSYN985dPs2XPGtxIcMSYdbT64fg6Z0MWHBxV6NoYtTeS/fG0zKRgavaxt52RS6+KHjt9OhJf65AnlrykJXWx71IsIkDqGgPzMeGfJI9aeRn27YhTorGmbMFm0dp65jaGB/nf+/6ibZcBQi044kTjpHP4mElrDjQFSN5RfSX6gmtORctzQi5mZ/4O3NF7aNqckP5pwxIIjRjxUjM83lHJH2sbHNI0/sdqnSrlw==') # 将你的加密数据替换为 Base64 编码的密文
plaintext = rsa.private_decrypt(ciphertext, RSA.pkcs1_padding)
# 打印解密结果
print(plaintext) # 输出:Hello, World!
注意:加密和解密的算法和padding必须保持一致,否则无法解密