python实现AES和RSA加解密的方法

yizhihongxing

以下是关于 Python 实现 AES 和 RSA 加解密的完整攻略:

什么是 AES 和 RSA 加解密

AES(Advanced Encryption Standard,高级加密标准)和 RSA(Rivest–Shamir–Adleman)都是常用的加密算法。其中,AES 是对称加密算法,加密和解密使用同一个密钥,而 RSA 是非对称加密算法,加密和解密使用不同的密钥。

Python 实现 AES 加解密

Python 可以使用 PyCrypto 库来实现 AES 加解密。下面是一个简单的例子:

from Crypto.Cipher import AES
import base64

def aes_encrypt(text, key):
    bs = AES.block_size
    pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
    cipher = AES.new(key, AES.MODE_ECB)
    encrypted_text = cipher.encrypt(pad(text)).hex()
    return encrypted_text

def aes_decrypt(encrypted_text, key):
    bs = AES.block_size
    unpad = lambda s: s[0:-ord(s[-1])]
    encrypted_text = bytes.fromhex(encrypted_text)
    cipher = AES.new(key, AES.MODE_ECB)
    decrypted_text = unpad(cipher.decrypt(encrypted_text)).decode()
    return decrypted_text

key = b'mysecretpassword'
text = 'Hello World'

encrypted_text = aes_encrypt(text, key)
print('Encrypted Text:', encrypted_text)

decrypted_text = aes_decrypt(encrypted_text, key)
print('Decrypted Text:', decrypted_text)

这个例子中,我们使用了 ECB 模式和 PKCS7 填充方式。在实际使用中,我们需要根据具体的需求选择不同的模式和填充方式。

Python 实现 RSA 加解密

Python 可以使用 PyCrypto 库来实现 RSA 加解密。下面是一个简单的例子:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64

def rsa_encrypt(text, public_key):
    key = RSA.importKey(public_key)
    cipher = PKCS1_v1_5.new(key)
    encrypted_text = cipher.encrypt(text.encode())
    return base64.b64encode(encrypted_text).decode()

def rsa_decrypt(encrypted_text, private_key):
    key = RSA.importKey(private_key)
    cipher = PKCS1_v1_5.new(key)
    encrypted_text = base64.b64decode(encrypted_text)
    decrypted_text = cipher.decrypt(encrypted_text, None).decode()
    return decrypted_text

public_key_str = '''
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+L4WAhPBPa/U6CkLQljcz5k66
YLv9ZuGv+bcV6CGjG6B99RNaXOj8lw4hfDEG8O+qWC/5fr1jv86m5lG941xZ939x
GcJhBOxikYpb91cmw4rowVTHv0HKm0XPBhNSNUkQJz9QFdV0+KFsDtg1PPUzgu5v
7h9ZCUSsSd/v/qWAAwIDAQAB
-----END PUBLIC KEY-----
'''

private_key_str = '''
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC+L4WAhPBPa/U6CkLQljcz5k66YLv9ZuGv+bcV6CGjG6B99RNa
XOj8lw4hfDEG8O+qWC/5fr1jv86m5lG941xZ939xGcJhBOxikYpb91cmw4rowVTH
v0HKm0XPBhNSNUkQJz9QFdV0+KFsDtg1PPUzgu5v7h9ZCUSsSd/v/qWAAwIDAQAB
AoGAbTBNq3VqBkdZgXz29ct6hTv+rAgp6027WqelONxXq8TJW4tYYBBqXdJ8ru6X
sk2jyL7mZ3TilqK4aBlkCQStoJXAVfc/fko8hSgJzmvJb2PzK3WMT4fBUqlg5ie9
H26GeZ6fVz4bNi5ewrWkyyBdv80KBcfgJ8w2lV+JjxLnp8ECQQDyBGqc7k8k8wfb
6mA+J4bMiBC+RVXqhJsgY4HvufGteXRvF57dY9NygOqDCz4CpP2VFe1wRplLeKXk
SeGJU4RHAkEAywg6f6AcMGCjd/AAN/Fg+kS1sF9mXOpiJNw4R3jOM/p4Nogp/bx+
KyFRjQsGnCKCPs7Usf7S7+LsU3U3g65fDQJAPyoKrmfIc95nD5LDoSsi2vBEXg4L
j1urI7Lop9J7gVxkgfqncZi1Qa7QxZLqmH8AR4I0mwoNDww0re+uM+nHvQJAbUwH
69E/VWJzMxEHptpKvtNsdj/yXXlZ+R5luMgpkWjXZtjiT7+qOBsYmI1d2V6Rr752
/NbxLZQC3XJXanJ2RQJAT++9snMuzqMkT3adgJKdoS55KPaal7hnyu9fm0l5eB4P
685PiP32qMsySeQfzV4FBt4EkLBIf5KzKZV9wgw4Mg==
-----END RSA PRIVATE KEY-----
'''

public_key = public_key_str.encode()
private_key = private_key_str.encode()

text = 'Hello World'

encrypted_text = rsa_encrypt(text, public_key)
print('Encrypted Text:', encrypted_text)

decrypted_text = rsa_decrypt(encrypted_text, private_key)
print('Decrypted Text:', decrypted_text)

这个例子中,我们使用了 PKCS1_v1_5 填充方式,其他的填充方式还有 OAEP,可以根据具体需求选择。

示例

这里再给出一个 AES 和 RSA 一起使用的例子,通过 AES 加密文本,然后使用 RSA 加密 AES 密钥,最后把加密后的密钥和密文一起发送过去。接收方使用私钥解密 AES 密钥,然后再使用 AES 解密密文。

from Crypto.Cipher import AES, PKCS1_v1_5
from Crypto.PublicKey import RSA
import base64

def aes_encrypt(text, key):
    bs = AES.block_size
    pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
    cipher = AES.new(key, AES.MODE_ECB)
    encrypted_text = cipher.encrypt(pad(text)).hex()
    return encrypted_text

def aes_decrypt(encrypted_text, key):
    bs = AES.block_size
    unpad = lambda s: s[0:-ord(s[-1])]
    encrypted_text = bytes.fromhex(encrypted_text)
    cipher = AES.new(key, AES.MODE_ECB)
    decrypted_text = unpad(cipher.decrypt(encrypted_text)).decode()
    return decrypted_text

def rsa_encrypt(text, public_key):
    key = RSA.importKey(public_key)
    cipher = PKCS1_v1_5.new(key)
    encrypted_text = cipher.encrypt(text.encode())
    return base64.b64encode(encrypted_text).decode()

def rsa_decrypt(encrypted_text, private_key):
    key = RSA.importKey(private_key)
    cipher = PKCS1_v1_5.new(key)
    encrypted_text = base64.b64decode(encrypted_text)
    decrypted_text = cipher.decrypt(encrypted_text, None).decode()
    return decrypted_text

public_key_str = '''
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+L4WAhPBPa/U6CkLQljcz5k66
YLv9ZuGv+bcV6CGjG6B99RNaXOj8lw4hfDEG8O+qWC/5fr1jv86m5lG941xZ939x
GcJhBOxikYpb91cmw4rowVTHv0HKm0XPBhNSNUkQJz9QFdV0+KFsDtg1PPUzgu5v
7h9ZCUSsSd/v/qWAAwIDAQAB
-----END PUBLIC KEY-----
'''

private_key_str = '''
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC+L4WAhPBPa/U6CkLQljcz5k66YLv9ZuGv+bcV6CGjG6B99RNa
XOj8lw4hfDEG8O+qWC/5fr1jv86m5lG941xZ939xGcJhBOxikYpb91cmw4rowVTH
v0HKm0XPBhNSNUkQJz9QFdV0+KFsDtg1PPUzgu5v7h9ZCUSsSd/v/qWAAwIDAQAB
AoGAbTBNq3VqBkdZgXz29ct6hTv+rAgp6027WqelONxXq8TJW4tYYBBqXdJ8ru6X
sk2jyL7mZ3TilqK4aBlkCQStoJXAVfc/fko8hSgJzmvJb2PzK3WMT4fBUqlg5ie9
H26GeZ6fVz4bNi5ewrWkyyBdv80KBcfgJ8w2lV+JjxLnp8ECQQDyBGqc7k8k8wfb
6mA+J4bMiBC+RVXqhJsgY4HvufGteXRvF57dY9NygOqDCz4CpP2VFe1wRplLeKXk
SeGJU4RHAkEAywg6f6AcMGCjd/AAN/Fg+kS1sF9mXOpiJNw4R3jOM/p4Nogp/bx+
KyFRjQsGnCKCPs7Usf7S7+LsU3U3g65fDQJAPyoKrmfIc95nD5LDoSsi2vBEXg4L
j1urI7Lop9J7gVxkgfqncZi1Qa7QxZLqmH8AR4I0mwoNDww0re+uM+nHvQJAbUwH
69E/VWJzMxEHptpKvtNsdj/yXXlZ+R5luMgpkWjXZtjiT7+qOBsYmI1d2V6Rr752
/NbxLZQC3XJXanJ2RQJAT++9snMuzqMkT3adgJKdoS55KPaal7hnyu9fm0l5eB4P
685PiP32qMsySeQfzV4FBt4EkLBIf5KzKZV9wgw4Mg==
-----END RSA PRIVATE KEY-----
'''

public_key = public_key_str.encode()
private_key = private_key_str.encode()

text = 'Hello World'
key = b'mysecretpassword'

encrypted_key = rsa_encrypt(key.decode(), public_key)
encrypted_text = aes_encrypt(text, key)

# send encrypted_key and encrypted_text to the receiver

decrypted_key = rsa_decrypt(encrypted_key, private_key)
decrypted_text = aes_decrypt(encrypted_text, decrypted_key.encode())

print('Original Text:', text)
print('Decrypted Text:', decrypted_text)

这个例子中,我们先使用 AES 加密了文本,然后使用 RSA 加密了 AES 密钥。接收方先使用私钥解密了 AES 密钥,然后再使用 AES 解密了文本。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现AES和RSA加解密的方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • python实现图像最近邻插值

    实现图像最近邻插值可以通过以下步骤: 步骤1:导入所需库和图片 首先需要导入所需库和图片,其中 cv2 和 numpy 库需要安装。可以通过pip安装:pip install opencv-python numpy。 import cv2 import numpy as np # 加载图片 img = cv2.imread(‘image.png’) 步骤2:…

    python 2023年5月18日
    00
  • 对python中基于tcp协议的通信(数据传输)实例讲解

    下面是详细讲解“对python中基于tcp协议的通信(数据传输)实例讲解”的完整攻略。 一、TCP协议简介 TCP协议是TCP/IP协议族中的一种重要协议,它是一种可靠的、面向连接的、基于字节流的传输协议。TCP协议在网络通信中广泛应用,比如HTTP、FTP、SMTP等广泛应用的协议都是基于TCP协议的。 二、Python中的TCP通信 Python标准库中…

    python 2023年6月3日
    00
  • Python:替换列表中的 \n \r \t,不包括以 \n\n 开头并以 \n\r\n\t 结尾的列表

    【问题标题】:Python: replace \n \r \t in a list excluding those starting \n\n and ends with \n\r\n\tPython:替换列表中的 \n \r \t,不包括以 \n\n 开头并以 \n\r\n\t 结尾的列表 【发布时间】:2023-04-03 00:32:01 【问题描述】…

    Python开发 2023年4月8日
    00
  • python实现逻辑回归的方法示例

    下面是“python实现逻辑回归的方法示例”的完整攻略。 1. 什么是逻辑回归 逻辑回归是一种用来预测二分类问题的机器学习算法,它的输出是一个0到1之间的概率值,表示结果为正类的概率大小。 2. 逻辑回归的 Python 实现 2.1 准备数据 逻辑回归算法首先需要准备数据。我们可以使用已有的数据集,或者自己创建数据。 以下是创建数据集的示例代码: impo…

    python 2023年5月19日
    00
  • Python 数据可视化pyecharts的使用详解

    Python 数据可视化pyecharts的使用详解 1. 简介 pyecharts是Python中基于Echarts JavaScript可视化框架的一个图表库,旨在用于数据可视化。它支持多种图表类型和交互式数据表现,可以轻松地生成美观、交互式、可应用于web网页的图表,使数据的可视化处理变得更加简洁高效。 2. 安装 在开始使用前,需要先安装pyecha…

    python 2023年5月20日
    00
  • Python中使用第三方库xlutils来追加写入Excel文件示例

    下面就为您讲解如何使用第三方库xlutils来追加写入Excel文件。 1. 安装第三方库 在使用xlutils库之前,我们需要先进行安装,安装方式如下: pip install xlutils 2. 导入模块 在开始编写代码之前,我们需要导入xlutils中对应的模块。 import xlrd from xlutils.copy import copy x…

    python 2023年5月13日
    00
  • python regex库实例用法总结

    Python regex库实例用法总结 什么是正则表达式? 正则表达式(Regular Expression) 是用来匹配字符串中字符组合的一种方式。正则表达式是对字符串操作的一种逻辑公式,就是处理字符串的一种方式。正则表达式也称作正规表示法、正规表示式、正规表达式、规则表达式、常规表示法(英文Regular Expression)。 在Python中,可以…

    python 2023年6月3日
    00
  • PYTHON绘制雷达图代码实例

    PYTHON绘制雷达图代码实例 什么是雷达图? 雷达图,又称为蜘蛛网图、极坐标图,是用于展示多维度数据的图表类型。雷达图通常由多个包围在同一圆心的“蛛网线”组成,并在这些线的交点上描绘出数据点,从而形成一个多边形。 绘制雷达图代码 在PYTHON中,我们可以使用matplotlib库来绘制雷达图。下面给出一个完整的绘制雷达图的代码实例: import mat…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部