本文主要是講解AES加密算法中的ECB模式的加密解密的Python3.7實現。具體AES加密算法的原理這裏不作過多介紹,想了解的能夠參考文末的參考連接。html
主要解決了兩個問題:python
在爬蟲項目中遇到,某些網站的帳號、密碼採用了AES的ECB模式進行了加密。算法
# 加密前的數據 123456asd # 加密後的數據 3cfeba82c31b6635e8fb085e04529e74 # 密鑰 8NONwyJtHesysWpM
使用在線AES加密解密、AES在線加密解密,進行嘗試。測試
通過測試發現,在AES
加密的ECB模式
,填充爲pkcs7padding
,數據塊爲128位
,輸出格式爲hex
時,獲得本身想要的結果。網站
(這裏能夠能夠根據密文的格式進行判斷輸出的格式,通常密文以==結尾的輸出格式爲base64,不然爲hex格式)加密
pip 安裝 pycrypto模塊,拋以下錯誤:spa
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\cl.exe' failed with exit status 2
解決方法:.net
詳見python3.7安裝pycrypto。3d
在網上博客中直接copy來的代碼,可能會拋以下錯誤。code
TypeError: Object type <class 'str'> cannot be passed to C code
換個博客,發現依舊是這個錯誤。
錯誤緣由:
以前版本的代碼並不適用於Python3.7。須要進行修改。
修改後的代碼:
import base64 from Crypto.Cipher import AES import binascii def add_to_16(text): while len(text) % 16 != 0: text += '\0' return text def encrypt(data, password): if isinstance(password, str): password = password.encode('utf8') bs = AES.block_size pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs) cipher = AES.new(password, AES.MODE_ECB) data = cipher.encrypt(pad(data).encode('utf8')) encrypt_data = binascii.b2a_hex(data) # 輸出hex # encrypt_data = base64.b64encode(data) # 取消註釋,輸出Base64格式 return encrypt_data.decode('utf8') def decrypt(decrData, password): if isinstance(password, str): password = password.encode('utf8') cipher = AES.new(password, AES.MODE_ECB) plain_text = cipher.decrypt(binascii.a2b_hex(decrData)) return plain_text.decode('utf8').rstrip('\0') if __name__ == '__main__': data = '123456asd' # 待加密數據 password = '8NONwyJtHesysWpM' # 16,24,32位長的密碼(密鑰) password = add_to_16(password) encrypt_data = encrypt(data, password) print('加密前數據:{}\n======================='.format(data)) print('加密後的數據:', encrypt_data) decrypt_data = decrypt(encrypt_data, password) print('解密後的數據:{}'.format(decrypt_data))
AES ECB PKCS5/PKCS7 加解密 python實現 支持中文
python3.7 利用Crypto進行AES解密&加密文件
關注公衆號西加加先生
一塊兒玩轉Python。
原文出處:https://www.cnblogs.com/ghostlee/p/12185223.html