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

以下是关于 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 生成 Ansible YAML 文件

    【问题标题】:Generating Ansible YAML file with Python使用 Python 生成 Ansible YAML 文件 【发布时间】:2023-04-05 18:57:02 【问题描述】: 如何使用 Python3 生成 Ansible YAML 剧本,如下所示: email.yml — – name: Send a su…

    Python开发 2023年4月6日
    00
  • Python实现FM算法解析

    下面是关于“Python实现FM算法解析”的完整攻略。 1. FM算法简介 FM(Factorization Machines)算法是一种基于矩阵分解的机器学习算法,主要用于推荐系统中的问题。FM算法可以对高维稀疏数据进行建模,并且可以处理缺失数据和非线性关系。 2. Python实现FM算法 2.1 算法流程 FM算法的流程下: 初始化模型参数,包括隐向量…

    python 2023年5月13日
    00
  • python+selenium的web自动化上传操作的实现

    下面就是关于Python+Selenium的Web自动化上传操作实现的攻略。 1. 前置条件 要实现Web自动化上传操作,首先需要安装和配置好Python与Selenium,并且需要安装好chromedriver的驱动程序。具体安装方法可以参考官方文档。 2. 实现原理 要实现Web自动化上传操作,需要借助Selenium中的send_keys 方法,把需要…

    python 2023年5月19日
    00
  • 详解Python解决抓取内容乱码问题(decode和encode解码)

    在Python中,当我们使用requests或urllib等库抓取网页内容时,有时会遇到乱码问题。这是因为网页的编码格式与我们使用的编码格式不一致。为了解决这个问题,我们需要使用decode和encode方法对网页内容进行解码和编码。 decode方法 decode方法是将字节流解码为字符串的方法。在Python中,我们可以使用decode方法将网页内容从字…

    python 2023年5月15日
    00
  • Python提升Excel效率的5个方法!(实例演示)

    使用Python进行Excel自动化,可以有效地帮助我们提高工作效率和减少出错率。 本文将详细介绍使用Python操作Excel的5种提升工作效率的方法。具体有以下: 5种自动化操作Excel的方法 读取和写入Excel文件 使用Python中的第三方库(如openpyxl、xlrd、xlwt、xlutils等)可以读取和写入Excel文件。比如,我们可以读…

    2023年2月26日
    00
  • Python文件常见操作实例分析【读写、遍历】

    下面是针对“Python文件常见操作实例分析【读写、遍历】”的完整攻略。 1. 文件读取 Python中的文件读取可以使用内置的open()函数打开文件,使用read()等方法读取文件内容。具体步骤如下: 1.1 打开文件 f = open(‘filename.txt’, ‘r’) 其中,’filename.txt’是文件名,’r’表示以只读方式打开文件。 …

    python 2023年6月5日
    00
  • Python实现注册登录功能

    Python实现注册登录功能需要以下步骤: 1. 创建数据库 首先需要创建一个数据库,保存用户的注册信息、登录信息。可以使用MySQL或SQLite等数据库管理系统。 示例代码(使用SQLite数据库): import sqlite3 conn = sqlite3.connect(‘user.db’) c = conn.cursor() c.execute(…

    python 2023年6月13日
    00
  • Python Pandas创建Dataframe数据框的六种方法汇总

    下面我会详细讲解如何利用Python Pandas库创建Dataframe数据框的六种方法,供参考和学习。 前言 Pandas是Python数据处理中最常用的库之一,而Dataframe是Pandas最常用的数据结构之一。Dataframe可以看作二维数据,每个列可以是不同的数据类型等等,非常方便。而本文主要讲解如何使用Python Pandas库来创建Da…

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