AES ECB PKCS5/PKCS7 加解密 python實現 支持中文


[toc]

ECB模式介紹

電碼本模式(Electronic Codebook Book (ECB) 這種模式是將整個明文分成若干段相同的小段,然后對每一小段進行加密。 在這里插入圖片描述

pkcs5padding和pkcs7padding的區別

pkcs5padding和pkcs7padding都是用來填充數據的一種模式。在ECB中,數據是分塊加密的。如果需要加密的數據的字節碼的長度不是塊大小的整數倍就需要填充。 使用PKCS5,填充時: 要填充7個字節,那么填入的值就是0×7; 如果只填充1個字節,那么填入的值就是0×1; 恰好8個字節時還要補8個字節的0×08 正是這種即使恰好是8個字節也需要再補充字節的規定,可以讓解密的數據很確定無誤的移除多余的字節。 PKCS7和PKCS5的區別是數據塊的大小;

  • PKCS5填充塊的大小為8bytes(64位)
  • PKCS7填充塊的大小可以在1-255bytes之間。

因為AES並沒有64位的塊, 如果采用PKCS5, 那么實質上就是采用PKCS7

python實現

安裝所需要的包

pip install pycryptodome

python代碼

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


class EncryptDate:
    def __init__(self, key):
        self.key = key  # 初始化密鑰
        self.length = AES.block_size  # 初始化數據塊大小
        self.aes = AES.new(self.key, AES.MODE_ECB)  # 初始化AES,ECB模式的實例
        # 截斷函數,去除填充的字符
        self.unpad = lambda date: date[0:-ord(date[-1])]      

    def pad(self, text):
        """
        #填充函數,使被加密數據的字節碼長度是block_size的整數倍
        """
        count = len(text.encode('utf-8'))
        add = self.length - (count % self.length)
        entext = text + (chr(add) * add)
        return entext

    def encrypt(self, encrData):  # 加密函數
        res = self.aes.encrypt(self.pad(encrData).encode("utf8"))
        msg = str(base64.b64encode(res), encoding="utf8")
        return msg

    def decrypt(self, decrData):  # 解密函數
        res = base64.decodebytes(decrData.encode("utf8"))
        msg = self.aes.decrypt(res).decode("utf8")
        return self.unpad(msg)


eg = EncryptDate("iiiioooojjjjpppp")  # 這里密鑰的長度必須是16的倍數
res = eg.encrypt("中文測試!")
print(res)
print(eg.decrypt(res))

運行效果 在這里插入圖片描述 可點擊這里在線加解密,驗證一下 在這里插入圖片描述

注意事項

  1. 選擇安裝pycryptodome而不是pycrypto(安裝pycrypto在python的某些版本會報錯)
  2. 加密中文需要加密的是字節碼而不是字符串(encode一下)
  3. pad函數中計算長度的時候計算的也是轉換成字節碼后的長度而不是字符串的長度
  4. 注意Linux下的換行符是\n,Windows下的換行符是\r\n(跨平台傳輸加密后的文件,在寫入時需要注意)


免責聲明!

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



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