Python AES/CBC/pkcs5padding 加解密

本文采用的AES CBC PKCS5padding方式加解密:

注:1. 密钥和IV相同,可以自己定义IV的值;2. 这里加解密接收的数据是字符串 字符串 字符串 ,重要的事情说三遍

3. 当前输出的方式HEX方式,可以使用base64(注掉的那部分)

 

import binascii
import re
from Crypto.Cipher import AES

class AESCBC:
    def __init__(self):
        self.key = '0123456789012345'            #定义key值
        self.mode = AES.MODE_CBC
        self.bs = 16  # block size
        self.PADDING = lambda s: s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)

    def encrypt(self, text):
        generator = AES.new(self.key, self.mode,self.key)    #这里的key 和IV 一样 ,可以按照自己的值定义
        crypt = generator.encrypt(self.PADDING(text))
        # crypted_str = base64.b64encode(crypt)   #输出Base64
        crypted_str =binascii.b2a_hex(crypt)       #输出Hex
        result = crypted_str.decode()
        return result

    def decrypt(self, text):
        generator = AES.new(self.key, self.mode,self.key)
        text += (len(text) % 4) * '='
        # decrpyt_bytes = base64.b64decode(text)           #输出Base64
        decrpyt_bytes = binascii.a2b_hex(text)           #输出Hex
        meg = generator.decrypt(decrpyt_bytes)
        # 去除解码后的非法字符
        try:
            result = re.compile('[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\n\r\t]').sub('', meg.decode())
        except Exception:
            result = '解码失败,请重试!'
        return result


if __name__ == '__main__':
    aes = AESCBC()

    to_encrypt = '123456'
    to_decrypt = '31f45bc15c28b3dffb7886d86ae0136d'

    print("\n加密前:{0}\n加密后:{1}\n".format(to_encrypt,aes.encrypt(to_encrypt)))
    print("解密前:{0}\n解密后:{1}".format(to_decrypt,aes.decrypt(to_decrypt)))

运行结果如下:

加密前:123456
加密后:31f45bc15c28b3dffb7886d86ae0136d

解密前:31f45bc15c28b3dffb7886d86ae0136d
解密后:123456

### PythonAES-CBC-PKCS5Padding 实现 为了在Python中实现AES加密算法的CBC模式并采用PKCS5填充,可以利用`pycryptodome`库来完成这一操作。下面提供了一个完整的例子,展示了如何进行数据的加密和解密。 #### 安装依赖包 首先需要安装 `pycryptodome` 库,可以通过pip命令轻松安装: ```bash pip install pycryptodome ``` #### 数据准备与处理函数定义 对于输入的数据,在执行加密之前应当确保其长度为区块大小(通常是16字节)的整数倍。如果不足,则需按照指定的方式补充至合适长度;而在解密之后也需要去除这些额外添加的部分以恢复原始消息[^2]。 #### 加密过程 创建一个用于加密的方法如下所示: ```python from Crypto.Cipher import AES import base64 def pad(text, block_size=16): """根据PKCS5标准对文本进行补位""" text_length = len(text) amount_to_pad = block_size - (text_length % block_size) if amount_to_pad == 0: amount_to_pad = block_size padding = chr(amount_to_pad) * amount_to_pad return str.encode(text + padding) def encrypt(plain_text, key, iv): cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv) encrypted_bytes = cipher.encrypt(pad(plain_text)) return base64.b64encode(encrypted_bytes).decode(&#39;utf-8&#39;) ``` 此部分实现了基于给定秘钥key以及初始化向量IV下的字符串加密功能,并返回经过Base64编码后的结果以便于传输或存储。 #### 解密过程 相应地,这里也给出了解码的过程: ```python def unpad(padded_text): unpadder = ord(padded_text[-1]) if unpadder < 1 or unpadder > 32: pass return padded_text[:-unpadder] def decrypt(ciphered_base64, key, iv): raw_cipher_data = base64.b64decode(ciphered_base64) cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv) decrypted_bytes = cipher.decrypt(raw_cipher_data) return unpad(decrypted_bytes.decode()) ``` 上述代码片段完成了接收已编码的信息作为参数传入,通过逆运算还原成最初的明文形式。 #### 测试实例 最后附上一段简单的测试程序验证以上两个主要逻辑单元的功能是否正常工作: ```python if __name__ == "__main__": secret_key = b&#39;your_secret_key_&#39; init_vector = b&#39;initializationVe&#39; original_message = "你好世界" encoded_msg = encrypt(original_message, secret_key, init_vector) print(f"Encrypted message: {encoded_msg}") decoded_msg = decrypt(encoded_msg, secret_key, init_vector) print(f"Decoded message :{decoded_msg}") ``` 这段脚本会输出加密前后的信息对比,从而直观展示整个流程的效果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值