天天看點

藍牙自定開鎖時間--Python3加密函數,傳入明文和秘鑰,傳回密文,這三個都是bytes格式的解密函數,傳入密文和秘鑰,傳回明文,這三個都是bytes格式的

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