python3 BASE64AES加密模式ECB/CBC

该博客展示了如何使用Python的`Crypto.Cipher.AES`库实现AES加密(ECB和CBC模式),并提供了加密和解密的示例代码。通过设置不同模式和初始化向量IV,演示了加密过程并给出了加密和解密后的密文和明文结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为需要对接第三方api,第三方也没有加密/解密demo只能空手撸一下

源码如下:

# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import base64


class aescrypt():
    # 初始化对象
    def __init__(self, key, model, iv, encode_):
        self.encode_ = encode_
        self.model = {'ECB': AES.MODE_ECB, 'CBC': AES.MODE_CBC}[model]
        self.key = self.add_16(key)
        # CBC加密需要初始化向量IV,必须是16位,ECB模式不需要。
        self.iv = iv.encode()
        if model == 'ECB':
            self.aes = AES.new(self.key, self.model)
        elif model == 'CBC':
            self.aes = AES.new(self.key, self.model, self.iv)

    # 秘钥长度必须为16、24、32,目前16位足够
    def add_16(self, par):
        par = par.encode(self.encode_)
        while len(par) % 16 != 0:
            par += b'\x00'
        return par

    # 加密
    def aesencrypt(self, text):
        text = self.add_16(text)
        self.encrypt_text = self.aes.encrypt(text)
        return base64.encodebytes(self.encrypt_text).decode().strip()

    # 解密
    def aesdecrypt(self, text):
        ''' 两种解密方式不通用 '''
        if self.model == AES.MODE_CBC:
            self.aes = AES.new(self.key, self.model, self.iv)
            text = base64.decodebytes(text.encode(self.encode_))
            self.decrypt_text = self.aes.decrypt(text)
            return self.decrypt_text.decode(self.encode_).strip('\0')
        elif self.model == AES.MODE_ECB:
            text = base64.decodebytes(text.encode(self.encode_))
            self.decrypt_text = self.aes.decrypt(text)
            return self.decrypt_text.decode(self.encode_).strip('\0')


if __name__ == '__main__':
    key = '0123456789123456'  # 秘钥
    text = '姓名'#请求的文本
    # ECB
    pattern_ecb = aescrypt(key, 'ECB', '', 'utf8')#第一个参数为秘钥 第二参数为加密模式 第三个空 第四个你懂不解析
    en_text = pattern_ecb.aesencrypt(text)#text就是你要加密的内容
    print('ECB加密模式密文:', en_text)
    data = pattern_ecb.aesdecrypt(en_text)
    print('ECB加密模式明文:', data)

    # CBC  需要初始化向量IV
    IV = key[0:16] #偏移量 16 位!!
    pattern_cbc = aescrypt(key, 'CBC', IV, 'utf8') #第一个参数为秘钥 第二参数为加密模式 第三个为偏移量 第四个你懂得不解释
    cbc_text = pattern_cbc.aesencrypt(text)#text就是你要加密的内容
    print('CBC加密模式密文:', cbc_text)
    cbc_data = pattern_cbc.aesdecrypt(cbc_text)
    print('CBC加密模式密文:', cbc_data)

'''  
	两种加密模式的输出为以下的结果

	ECB加密模式密文:  oYn5Tj9A1NwIUNTtZu2b3w==
	ECB加密模式明文: 姓名

	CBC加密模式密文: eKCd3LH71eb+kv/UqczWHQ==
	CBC加密模式密文: 姓名
'''

可以根据自己的业务再进行写自己的逻辑

### Python AES ECB 模式加密示例 在 Python 中可以使用 `pycryptodome` 库来实现 AESECB 模式加密。以下是具体的代码示例以及说明: #### 安装依赖库 首先需要安装 `pycryptodome` 库,可以通过 pip 命令完成安装: ```bash pip install pycryptodome ``` #### 示例代码 下面是一个完整的 Python 脚本,用于演示如何通过 AESECB 模式对数据进行加密。 ```python from Crypto.Cipher import AES import base64 def pad(text): """填充函数""" while len(text) % 16 != 0: text += b'\0' return text # 密钥长度必须为16 (AES-128), 24 (AES-192), 或 32 (AES-256) Bytes 长度. key = b'sixteen byte key' # 使用固定的密钥作为示例 [^2] data_to_encrypt = 'This is a secret message'.encode('utf-8') # 待加密的数据 # 创建AES对象并初始化ECB模式实例 aes = AES.new(key, AES.MODE_ECB) # 对明文进行填充处理以满足AES分组大小的要求 padded_data = pad(data_to_encrypt) # 执行加密操作 encrypted_text = aes.encrypt(padded_data) print("原始数据:", data_to_encrypt.decode('utf-8')) print("加密后的数据(十六进制):", base64.b64encode(encrypted_text).decode('utf-8')) # 解密过程(可选) decrypted_padded_data = aes.decrypt(encrypted_text) original_message = decrypted_padded_data.rstrip(b'\0').decode('utf-8') print("解密后的数据:", original_message) ``` 上述脚本实现了以下几个功能: 1. **定义了一个简单的填充方法**:由于 AES 是一种块密码算法,输入的明文长度必须是 16 字节的倍数。如果不足,则需对其进行补全。 2. **创建 AES 实例**:利用指定的密钥和 ECB 模式初始化 AES 加密器。 3. **执行加密与解密**:分别展示了如何对消息进行加密和解密的过程。 #### 关键点解释 - **密钥管理**:AES 支持三种不同的密钥长度——128 位、192 位 和 256 位。这些对应于实际使用的字节数分别是 16、24 和 32 字节。因此,在设置密钥时需要注意其长度匹配要求[^3]。 - **填充机制**:为了使任意长度的消息都能被正确加密,通常会采用某种形式的填充策略。这里简单地向末尾追加零直到达到合适的尺寸为止;然而更专业的做法可能涉及 PKCS7 等标准填充方案。 #### 注意事项 尽管 ECB 模式的实现较为简便,但它存在安全性缺陷,比如相同的明文会产生完全一致的密文,这可能导致潜在的信息泄露风险。出于安全考虑,推荐尽可能选用其他更为健壮的工作模式CBC 或 GCM 来替代它[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值