from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
強制輸入明文增加到16位元組的倍數,在末尾補'0'
def add_to_16(text):
text = str(text, 'ISO-8859-1')
if len(text.encode('ISO-8859-1')) % 16:
add = 16 - (len(text.encode('ISO-8859-1')) % 16)
else:
add = 0
text = text + ('\0' * add)
return text.encode('ISO-8859-1')
加密函數,傳入明文和秘鑰,傳回密文,這三個都是bytes格式的
def encrypt(text, key):
mode = AES.MODE_ECB
text = add_to_16(text)
cryptos = AES.new(key, mode)
cipher_text = cryptos.encrypt(text)
return cipher_text
解密函數,傳入密文和秘鑰,傳回明文,這三個都是bytes格式的
def decrypt(text, key):
mode = AES.MODE_ECB
cryptor = AES.new(key, mode)
plain_text = cryptor.decrypt(text)
return plain_text
if name == '__main__':
# 需要加密的明文。下面列印的傳回值第一個為實際的bytes明文資料,第二個其實實際将bytes轉成了16進制字元串以便于檢視分析,但實際已經不是原來的數了,勿用b2a_hex的第二個資料給小程式,小程式接收的應該是第一個!
# 初始值
encData = []
encSum = 0x00
# 流水号
encData.append(0x00)
encSum += 0x00
encData.append(0x01) # 流水号
encSum += 0x01
encData.append(0x4F) # 藍牙指令
encSum += 0x4F
for i in range(3):
encData.append(0xEE)
encSum += 0xEE
# ---------------------自定義時間
# 10分鐘
encData.append(0x02)
encSum += 0x02
encData.append(0x58)
encSum += 0x58
# 5分鐘
# encData.append(0x01)
# encSum += 0x01
# encData.append(0x2C)
# encSum += 0x2C
# ---------------------自定義時間
# 資料段
for i in range(6):
encData.append(0xEE)
encSum += 0xEE
# 校驗和
encData.append(int(encSum / 256))
encData.append(encSum % 256)
# 明文list轉為bytes類型
encBytes = bytes(encData)
print("明文為:", encBytes)
print("明文為:", b2a_hex(encBytes))
# 秘鑰,字元串格式的轉為bytes格式,實際需要傳入的應是bytes格式
key = 'I637S01KYHH00000'.encode('ISO-8859-1')
# 将明文的bytes類型傳入,加密。傳回值同上,第一個為實際的bytes格式密文
enc = encrypt(encBytes, key)
print("加密後:", enc)
print("加密後:", b2a_hex(enc), len(enc))
# 解密,将bytes類型密文傳入,傳回值即為最後的bytes類型明文,同上
dec = decrypt(enc, key)
print("解密後:", dec)
print("解密後:", b2a_hex(dec))