[toc] ECB模式介紹 電碼本模式(Electronic Codebook Book (ECB) 這種模式是將整個明文分成若幹段相同的小段,然後對每一小段進行加密。 pkcs5padding和pkcs7padding的區別 pkcs5padding和pkcs7padding都是用來填充數據的一種 ...
目錄
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])]
pad / unpad
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))
運行效果
可點擊這裡線上加解密,驗證一下
註意事項
- 選擇安裝pycryptodemo而不是pycrypto(安裝pycrypto在python的某些版本會報錯)
- 加密中文需要加密的是位元組碼而不是字元串(encode一下)
- pad函數中計算長度的時候計算的也是轉換成位元組碼後的長度而不是字元串的長度
- 註意Linux下的換行符是\n,Windows下的換行符是\r\n(跨平臺傳輸加密後的文件,在寫入時需要註意)