【Python】Crypto模块_AES/CBC/PKCS5Padding 加解密

AES/CBC/PKCS5Padding

引用包

import base64
from Crypto.Cipher import AES

 

加解密

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

class AESCipher:
    '''
    AES/CBC/PKCS5Padding
    '''
    def __init__(self):
        # 秘钥:必须是16位字节或者24位字节或者32位字节(因为python3的字符串是unicode编码,需要 encode才可以转换成字节型数据)
        self.key = "YWJjZGVmYWJjZGVmMTIzNA=="
        self.key = base64.b64decode(self.key)
        # 偏移量--必须16字节
        self.iv = "MTIzNGFiY2RlZmFiY2RlZg=="
        self.iv = base64.b64decode(self.iv)

    def aes_cbc_encrypt(self, text):
        """
        AES/CBC/PKCS5Padding 加密
        """
        BLOCK_SIZE = AES.block_size
        # 需要加密的文件,不足BLOCK_SIZE的补位(text可能是含中文,而中文字符utf-8编码占3个位置,gbk是2,所以需要以len(text.encode()),而不是len(text)计算补码)
        text = text + (BLOCK_SIZE - len(text.encode()) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(text.encode()) % BLOCK_SIZE)
        # # base64解密
        # key = base64.b64decode(self.key)
        # iv = base64.b64decode(self.iv)
        # 创建一个aes对象 key 秘钥 mdoe 定义模式 iv#偏移量--必须16字节
        cipher = AES.new(key=self.key, mode=AES.MODE_CBC, IV=self.iv)
        # 利用AES对象进行加密
        encrypted_text = cipher.encrypt(text.encode())

        return base64.b64encode(encrypted_text).decode('utf-8')

    def aes_cbc_decrypt(self, encrypted_text):
        """
        AES/CBC/PKCS5Padding 解密
        """
        # 需要解密的文件
        encrypted_text = base64.b64decode(encrypted_text)
        # # base64解密
        # key = base64.b64decode(self.key)
        # iv = base64.b64decode(self.iv)
        # cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)

        # 创建一个aes对象 key 秘钥 mdoe 定义模式 iv#偏移量--必须16字节
        cipher = AES.new(key=self.key, mode=AES.MODE_CBC, IV=self.iv)
        # 利用AES对象进行解密
        decrypted_text = cipher.decrypt(encrypted_text)
        # 去除补位
        dec_res = decrypted_text[:-ord(decrypted_text[len(decrypted_text) - 1:])]

        return dec_res.decode()

if __name__ == "__main__":
    # 加密
    msg = " AES/CBC/PKCS5Padding 加密msg 巴拉巴拉balabala "
    jiami = AESCipher().aes_cbc_encrypt(msg)
    logs.debug(jiami)

    # 解密
    jiemi = AESCipher().aes_cbc_decrypt(jiami)
    logs.debug(jiemi)

 运行结果:

  

 

 

 

 

 

  

 

 

 

 

拓展


 

加密数据补位写法

# 方法一

# 不足BLOCK_SIZE的补位(s可能是含中文,而中文字符utf-8编码占3个位置,gbk是2,所以需要以len(s.encode()),而不是len(s)计算补码)
pad = lambda s: s + (BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE)

####################################################################################################################

# 方法二
def pad(data):
    length = BLOCK_SIZE - (len(data) % BLOCK_SIZE)
    #return data + (chr(length) * length).encode()
    return data.encode(encoding='utf-8') + (chr(length)*length).encode(encoding='utf-8')
 

 

 

去除补位写法

# 方法一

# 去除补位 unpad = lambda s: s[:-ord(s[len(s) - 1:])] ########################################################################################################## # 方法二 def unpad(data): return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]

 

 

 

lambda 匿名函数https://www.cnblogs.com/phoenixy/p/15796559.html

 

 
posted @ 2022-01-13 10:34  Phoenixy  阅读(1458)  评论(0编辑  收藏  举报