#---AES加密解密(原文和密鑰均支持中文,密鑰長度為1~30)!!!!!!!!!!!!!!!!! """ AES加密主要有ECB、CBC、CFB等幾種模式。CBC模式中還有一個偏移量參數(shù)IV。 AES加密有AES-128、AES-192和AES-256三種, 分別對應(yīng)三種密鑰長度128位(16字節(jié))、192位(24字節(jié))和256位(32字節(jié))。 密鑰越長,安全性越高,加密和解密時間也會更長。一般默認(rèn)是128位,其安全性完全夠用。 """ from Crypto.Cipher import AES import base64 BLOCK_SIZE = 16 # Bytes # 填充方法 pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \ chr(BLOCK_SIZE - len(s) % BLOCK_SIZE).encode('utf8') # 去除填充方法 unpad = lambda s: s[:-ord(s[len(s) - 1:])] def Aes_ECB_Encrypt(data,key): # ECB模式的加密函數(shù),data為明文,key為密鑰 key = pad(key.encode('utf8')) data = pad(data.encode('utf8')) # 將傳入的字符串轉(zhuǎn)為字節(jié)字符串 然后進(jìn)行填充至16字節(jié)的整數(shù)倍 aes = AES.new(key,AES.MODE_ECB) #創(chuàng)建加密對象 #encrypt AES加密 B64encode為base64轉(zhuǎn)二進(jìn)制編碼 result = base64.b64encode(aes.encrypt(data)) return result.decode('utf8') # 以字符串的形式返回 def Aes_CBC_Encrypt(data,key,iv): # CBC模式的加密函數(shù),data為明文,key為密鑰,iv為偏移量 key = pad(key.encode('utf8')) data = pad(data.encode('utf8')) # 補(bǔ)位 aes = AES.new(key,AES.MODE_CBC,iv.encode('utf8')) #創(chuàng)建加密對象 #encrypt AES加密 B64encode為base64轉(zhuǎn)二進(jìn)制編碼 result = base64.b64encode(aes.encrypt(data)) return result.decode('utf8') # 以字符串的形式返回 def Aes_ECB_Decrypt(data,key): # ECB模式的解密函數(shù),data為密文,key為密鑰 key = pad(key.encode('utf8')) data = data.encode('utf8') aes = AES.new(key,AES.MODE_ECB) # 創(chuàng)建解密對象 #decrypt AES解密 B64decode為base64 轉(zhuǎn)碼 result = aes.decrypt(base64.b64decode(data)) result = unpad(result) # 除去補(bǔ)16字節(jié)的多余字符 return result.decode('utf8') # 以字符串的形式返回 def Aes_CBC_Decrypt(data,key,iv): # CBC模式的解密函數(shù),data為密文,key為密鑰 key = pad(key.encode('utf8')) data = data.encode('utf8') aes = AES.new(key,AES.MODE_CBC,iv.encode('utf8')) # 創(chuàng)建解密對象 #decrypt AES解密 B64decode為base64 轉(zhuǎn)碼 result = aes.decrypt(base64.b64decode(data)) result = unpad(result) # 除去補(bǔ)16字節(jié)的多余字符 return result.decode('utf8') # 以字符串的形式返回 if __name__ == '__main__': #---原文,包含中文支持!?。?! text = 'hello-----中文------ world' #---密鑰,字節(jié)總數(shù)最大為30,包含中文支持(單個漢字為3字節(jié))!?。?/p> pswd = '密鑰密鑰密鑰5密鑰2鑰' #---CBC模式偏移量,必須為16字節(jié)(不支持中文)!?。?/p> iv = 'yu304-jx@163.com' if len(pswd.encode('utf8')) >30: print("密鑰字節(jié)總數(shù)=",len(pswd.encode('utf8'))," , 超過最大值30?。?!") #exit else : entext = Aes_ECB_Encrypt(text,pswd) detext = Aes_ECB_Decrypt(entext,pswd) entextc = Aes_CBC_Encrypt(text,pswd,iv) detextc = Aes_CBC_Decrypt(entextc,pswd,iv) print("加密密鑰=",pswd," , 密鑰字節(jié)總數(shù)=",len(pswd.encode('utf8')),"\n") print("加密前長度:{}, 加密前字符串為:{}\n加密后長度:{}, ECB加密后字符串:{}\n解密后長度:{}, 解密后字符串:{}\n".format(len(text),text,len(entext),entext,len(detext),detext)) print("加密前長度:{}, 加密前字符串為:{}\n加密后長度:{}, CBC加密后字符串:{}\n解密后長度:{}, 解密后字符串:{}".format(len(text),text,len(entextc),entextc,len(detextc),detextc)) # Ref:https://blog.csdn.net/dxhklck/article/details/128200165 |
|