【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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM