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

[toc]python

ECB模式介紹

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

pkcs5padding和pkcs7padding的區別

pkcs5padding和pkcs7padding都是用來填充數據的一種模式。在ECB中,數據是分塊加密的。若是須要加密的數據的字節碼的長度不是塊大小的整數倍就須要填充。 使用PKCS5,填充時: 要填充7個字節,那麼填入的值就是0×7; 若是隻填充1個字節,那麼填入的值就是0×1; 剛好8個字節時還要補8個字節的0×08 正是這種即便剛好是8個字節也須要再補充字節的規定,能夠讓解密的數據很肯定無誤的移除多餘的字節。 PKCS7和PKCS5的區別是數據塊的大小;dom

  • 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))

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

注意事項

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