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日

相关文章

  • python3中sys.argv的实例用法

    我来为您详细讲解一下“python3中sys.argv的实例用法”的完整攻略。 什么是sys.argv sys.argv是python的sys模块中的一个参数,用于获取命令行参数列表。在Python中,我们可以在程序中通过命令行传递参数,而sys.argv就是用来处理这些命令行参数的。其中,sys.argv[0]代表程序名称,sys.argv[1:]表示传递…

    python 2023年6月2日
    00
  • python实现多层感知器MLP(基于双月数据集)

    下面是“python实现多层感知器MLP(基于双月数据集)”的完整攻略。 1. 简介 多层感知器(MLP)是一种常见的神经网络模型,其可以用于分类和回归问题。在本次攻略中,我们将利用Python编写代码来实现一个MLP模型,并使用一个双月形状的数据集进行测试。 2. 准备工作 在编写代码之前,我们需要先安装一些Python库。这里推荐使用Anaconda来进…

    python 2023年6月3日
    00
  • python生成随机mac地址的方法

    生成随机的MAC地址是一种经常会用到的需求,可以用Python轻松实现。下面是详细的攻略: 生成随机MAC地址的方案 在Python中,可以通过生成随机数的方式制定一个MAC地址。MAC地址由6个十六进制数字组成,每两个数字之间用冒号隔开。 下面是一些可以用来生成随机MAC地址的方法: 方法1:使用Python的random库 import random #…

    python 2023年6月3日
    00
  • Python保存MongoDB上的文件到本地的方法

    下面是Python保存MongoDB上的文件到本地的方法的完整实例教程,包含两个示例: 环境配置 首先需要安装pymongo和gridfs库,可以使用pip进行安装: pip install pymongo pip install gridfs 示例1:保存一张图片文件 这个示例展示了如何从MongoDB中读取一个图片文件,并将其保存到本地。首先,假设Mon…

    python 2023年5月13日
    00
  • Python 3.x踩坑实战汇总

    当我们在使用Python3.x进行开发时,有时会遇到一些坑点,导致程序无法正常运行。本文将细讲解Python3.x踩坑实战汇总的完整攻略,包括字符串编码问题、print函数问题、文件读写问题等。 字符串编码问题 在Python3中,字符串默认使用Unicode编码,但是在读取文件或者网络传输数据时,需要编码问题。如果不指定编码方式,会导致乱码问题。 以下是一…

    python 2023年5月13日
    00
  • python输出当前目录下index.html文件路径的方法

    要输出当前目录下index.html文件路径,可以使用Python的os库和glob库。以下是两个示例,可以输出当前目录下index.html文件路径的方法: 示例1:使用os库和glob库输出当前目录下index.html文件路径 步骤1:导入必要的库 在使用os库和glob库输出当前目录下index.html文件路径之前,我们需要先导入必要的库。以下是需…

    python 2023年5月15日
    00
  • 详解Python中的分组函数groupby和itertools)

    当我们需要进行数据处理时,常常需要按照某些规则将数据分组,对于Python来说,有两个非常好用的工具——groupby函数和itertools.groupby函数,它们分别来自于Python自带的itertools和collections模块,用于根据一个关键字对迭代器进行分组。 一、 groupby函数 1.1 函数介绍 groupby函数是Python自…

    python 2023年5月14日
    00
  • Android EventBus粘性事件实现机制探究

    Android EventBus粘性事件实现机制探究 什么是EventBus粘性事件? 在使用EventBus时,除了普通的事件外,还有一种特殊的事件——粘性事件。 所谓的粘性事件,是指在post一个事件时,如果当前并没有订阅者,那么这个事件会被保存下来(以队列的形式),等这个订阅者再次订阅时,这个事件会再次被发送出去,这就是EventBus的粘性事件实现机…

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