使用cryptography進行AES的cbc模式加密
cryptography 是一個python加密庫
cryptography is a package designed to expose cryptographic primitives and recipes to Python developers. 文檔 cryptography.io
以前使用過很多不同的加密庫,但pyhton界貌似沒有一個統一的庫。
但需要用到RSA加密時用到一個庫,需要AES時又要裝另一個庫,這對於庫的使用和項目管理變得很不友好!
直到有一天發現了伯樂在線的一篇文章,決定了以後加密就用cryptography這個庫了
Cryptography:用於加密的Python庫
但是由於對加密這塊內容的了解不深,在看 cryptography 文檔的時候 比較痛苦。因為 cryptography更像是一個提供了基礎的加密相關的封裝。具體的一些使用需要你多研究他的文檔,以及對加密演算法的了解。
AES的cbc模式加密
在需要實現AES在cbc模式下的加密時折騰了點時間,下面貼出實現代碼。
import osnnfrom cryptography.hazmat.primitives import paddingnfrom cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modesnfrom cryptography.hazmat.backends import default_backendnnnclass AESCrypto(object):nn AES_CBC_KEY = os.urandom(32)n AES_CBC_IV = os.urandom(16)nn @classmethodn def encrypt(cls, data, mode=cbc):n func_name = {}_encrypt.format(mode)n func = getattr(cls, func_name)n return func(data)nn @classmethodn def decrypt(cls, data, mode=cbc):n func_name = {}_decrypt.format(mode)n func = getattr(cls, func_name)n return func(data)nn @staticmethodn def pkcs7_padding(data):n if not isinstance(data, bytes):n data = data.encode()nn padder = padding.PKCS7(algorithms.AES.block_size).padder()nn padded_data = padder.update(data) + padder.finalize()nn return padded_datann @classmethodn def cbc_encrypt(cls, data):n if not isinstance(data, bytes):n data = data.encode()nn cipher = Cipher(algorithms.AES(cls.AES_CBC_KEY),n modes.CBC(cls.AES_CBC_IV),n backend=default_backend())n encryptor = cipher.encryptor()nn padded_data = encryptor.update(cls.pkcs7_padding(data))nn return padded_datann @classmethodn def cbc_decrypt(cls, data):n if not isinstance(data, bytes):n data = data.encode()nn cipher = Cipher(algorithms.AES(cls.AES_CBC_KEY),n modes.CBC(cls.AES_CBC_IV),n backend=default_backend())n decryptor = cipher.decryptor()nn uppaded_data = cls.pkcs7_unpadding(decryptor.update(data))nn uppaded_data = uppaded_data.decode()n return uppaded_datann @staticmethodn def pkcs7_unpadding(padded_data):n unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()n data = unpadder.update(padded_data)nn try:n uppadded_data = data + unpadder.finalize()n except ValueError:n raise Exception(無效的加密信息!)n else:n return uppadded_datan
執行完美!
代碼已放在我的github項目中了
GitHub - istommao/cryptokit
- 以後會在需要RSA時 實現出相應代碼,對加密這塊今後會寫相關的學習筆記 歡迎交流互相學習! cryptography使用RSA加密篇 使用cryptography進行RSA加密
推薦閱讀:
※適合多方通訊(例如群聊)的加密體制有哪些?
※開啟 Passcode 的 iOS 設備,數據是硬體加密不可獲取破譯的嗎?