Python crypto模块实现RSA 加密解密

1 概述

RSA加密算法是一种非对称加密算法。RSA 是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。RSA就是他们三人姓氏开头字母拼在一起组成的 。

RSA加密解密,需要一对秘钥,一个是私钥,一个是公钥。使用公钥加密后,可以用私钥来解密,但使用私钥加密的数据,不能用公钥解密,只能用公钥验证加密后的数据是否被篡改。

2 openssl工具生成RSA公钥私钥

2.1 生成私钥

openssl genrsa -out rsa_private_key.pem 1024

2.2 生成公钥

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

生成的内容类似下面的字符串

-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCgh1mzJaDj2nxRhNa0lT6TZKE5ucGqHqgSVKKX5mQLnp1v3HtW
gytGTWQizCoLE5qxLWJk9rBDBl14ay9B6zpkFmxv32Dvc1591tRTzp4LA32tbABy
DOsLhr3MoeEsTOkFd9OIfdxRpjJqFaLcFxyHuun9UIYzPrrk38CMoRQMxwIDAQAB
AoGAQaC0Kkpi6WREWOtu/6rYR1fnlfr8Uvlvivbw9hrpodp50OaZwfekNHylSJih
Q6ADKRY92LsFupEam4Vub4ukdereweVVSxJvwNAV5MH4JlLGU9rWA4gBSFDh+8/g
gcJ+g9bnG0XYSulaBvGaCibXHb3O1ZjcZ6QZvqdJD9azmwkCQQDRxNwEbpTRwm5o
Xpbv1mYSa/H1zFJu/j03W3l02UOf+goXCuihbCT0rBXi6kS5pkXlJveVBLQHv25M
FWKXvARVAkEAw+hcY6AX7DbzH1IjabdU4h6TztqLWxxMppjKMOXDhGPhhNpzsKS3
6Mo2ZBJIrti7dTwAJVWFcIu99cAsg3CIqwJARcvIoTjiD4EwF04Rzq95uvtrwKtB
amjxmW+4U+bOl3Ys0Unx6XQAP+DaT2w/fb4TV5HFozGzbTiGzI35Bh+rGQJAKYen
lkMI7z1S2s/py+5eYzUCNnaj1iOwqBx5uFXs1bLqyuQYZFj217WORDaQC+jMDHU0
vrVbfVlSYrdjeFWx0wJAUH26P+L4cu4mBEX1alE4OGGS/LK/N3soDeW2VL8FMkru
GnKuJAnbW6G0PE/TH7AFNAFaZrTYgeGrUH0C96aXZw==
-----END RSA PRIVATE KEY-----

3 使用 Crypto 库

Crypto库的安装比较费心,因为有好几种库可以安装,功能几乎一样,最终都叫Crypto,不同系统下可安装的库的名称还不一致,但总结下来,下面的安装方法在任何平台都可用

3.1 安装库

pip install pycryptodome

3.2 生成私钥和公钥

from Crypto import Random
from Crypto.PublicKey import RSA
 
 
random_generator = Random.new().read
rsa = RSA.generate(2048, random_generator)
# 生成私钥
private_key = rsa.exportKey()
print(private_key.decode('utf-8'))
# 生成公钥
public_key = rsa.publickey().exportKey()
print(public_key.decode('utf-8'))

with open('rsa_private_key.pem', 'wb')as f:
    f.write(prsa_public_key.pem)
    
with open('rsa_public_key.pem', 'wb')as f:
    f.write(public_key)

生成的秘钥,需要写入到文件中,这样便于保存,毕竟,公钥是需要交给其他人使用,你自己手里同时拿着私钥和公钥是没有意义的,和你进行数据交互的人需要公钥来验证数据是否安全。

3.3 公钥加密,私钥解密

使用公钥加密的数据,可以用私钥进行解密


import base64
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_signature
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher

def get_key(key_file):
    with open(key_file) as f:
        data = f.read()
        key = RSA.importKey(data)

    return key

def encrypt_data(msg):
    public_key = get_key('rsa_public_key.pem')
    cipher = PKCS1_cipher.new(public_key)
    encrypt_text = base64.b64encode(cipher.encrypt(bytes(msg.encode("utf8"))))
    return encrypt_text.decode('utf-8')


def decrypt_data(encrypt_msg):
    private_key = get_key('rsa_private_key.pem')
    cipher = PKCS1_cipher.new(private_key)
    back_text = cipher.decrypt(base64.b64decode(encrypt_msg), 0)
    return back_text.decode('utf-8')

def test_encrypt_decrypt():
    msg = "coolpython.net"
    encrypt_text = encrypt_data(msg)
    decrypt_text = decrypt_data(encrypt_text)
    print(msg == decrypt_text)

test_encrypt_decrypt()     # True

公钥加密的数据,只有私钥才可以解密

3.4 私钥制作签名,公钥验证签名

使用私钥生成签名,并没有对数据进行加密,另一方在获取数据后,可以利用签名进行验证,如果数据传输的过程中被篡改了,那么签名验证就会失败。你可能已经想到了一种可能性,原始数据被篡改了,签名也同时被篡改了,这样验证就通过了。如果这种情况真的发生了,就说明篡改数据的人已经获取了私钥并利用私钥对篡改后的数据生成新的签名,否则,绝没有可能在没有私钥的情况下准确的篡改签名还能通过验证。如果篡改者能够获取私钥这种高度机密的信息,那么,防篡改已经没有意义了,因为人家已经彻底攻破了你的系统。


import base64
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_signature
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher

def get_key(key_file):
    with open(key_file) as f:
        data = f.read()
        key = RSA.importKey(data)

    return key

def rsa_private_sign(data):
    private_key = get_key('rsa_private_key.pem')
    signer = PKCS1_signature.new(private_key)
    digest = SHA.new()
    digest.update(data.encode("utf8"))
    sign = signer.sign(digest)
    signature = base64.b64encode(sign)
    signature = signature.decode('utf-8')
    return signature


def rsa_public_check_sign(text, sign):
    publick_key = get_key('rsa_public_key.pem')
    verifier = PKCS1_signature.new(publick_key)
    digest = SHA.new()
    digest.update(text.encode("utf8"))
    return verifier.verify(digest, base64.b64decode(sign))


def test_sign():
    msg = 'coolpython.net'
    sign = rsa_private_sign(msg)
    print(rsa_public_check_sign(msg, sign))    # True

if __name__ == '__main__':
    test_sign()

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,以下是一份使用 Python 实现 RSA 加密解密的示例代码: ``` import rsa # RSA加密 def rsa_encrypt(plaintext, pub_key): # 加密 ciphertext = rsa.encrypt(plaintext.encode(), pub_key) # 返回密文 return ciphertext # RSA解密 def rsa_decrypt(ciphertext, pri_key): # 解密 plaintext = rsa.decrypt(ciphertext, pri_key).decode() # 返回明文 return plaintext # 生成公钥、私钥 (pub_key, pri_key) = rsa.newkeys(512) # 待加密的明文 plaintext = "RSA encryption test" # 调用RSA加密函数,进行加密 ciphertext = rsa_encrypt(plaintext, pub_key) # 调用RSA解密函数,进行解密 decrypted_plaintext = rsa_decrypt(ciphertext, pri_key) # 输出结果 print("待加密的明文:", plaintext) print("加密后的密文:", ciphertext) print("解密后的明文:", decrypted_plaintext) ``` 注意:本代码仅供参考,实际使用中可能需要对代码进行一定的修改。 ### 回答2: RSA加密是一种非对称加密算法,通过生成一对公钥和私钥来实现加密和解密的过程。以下是一个用Python实现RSA加密解密的示例代码: ```python import rsa # 生成RSA公私钥对 (pubkey, privkey) = rsa.newkeys(2048) # 明文 message = "Hello, World!" # 加密 crypto = rsa.encrypt(message.encode(), pubkey) # 解密 plain = rsa.decrypt(crypto, privkey).decode() print("加密后的密文:", crypto) print("解密后的明文:", plain) ``` 首先,我们导入了Pythonrsa模块。然后,使用`rsa.newkeys(2048)`生成了一个2048位的RSA公私钥对。接下来,我们定义了一个明文字符串`message`。 使用`rsa.encrypt(message.encode(), pubkey)`进行加密。我们将明文进行编码并调用`rsa.encrypt()`方法来加密数据,其中`pubkey`是生成的公钥。 使用`rsa.decrypt(crypto, privkey).decode()`进行解密。我们调用`rsa.decrypt()`方法来解密加密后的数据,其中`crypto`是加密后的密文,`privkey`是生成的私钥。最后,我们将解密后的数据进行解码并打印出来。 以上代码简要演示了Python如何使用RSA加密解密数据。请注意,此示例仅用于介绍RSA加密的基本原理,实际应用中还需要进行更多的安全性验证和异常处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kobe_OKOK_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值