【Crypto】
關於用python進行信息的加密,類似的解決方案有很多比如用base64編碼進行encode,再或者是hashlib來進行hash。但是還缺少一種明明場景很簡單的解決方案,就是把利用一個秘鑰,把一段明文加密然后用同一個秘鑰可以把密文解密的這么一個簡單的對稱加密。
不信python會沒有好的解決方案,就去網上找了一下。找到了利用Crypto這個模塊來進行的。雖然安全性上python加密肯定不如靜態語言加密的好,不過好歹有了一招比較像樣的“防君子”之手段。
■ 使用
Crypto不是Python自帶的模塊,需要安裝pip install pycrypto。另外在程序中還要用到binascii這個模塊。這個模塊在2.7中似乎已經是自帶的了。
from Crypto.Cipher import AES from binascii import a2b_hex,b2a_hex class Cryptor: #創立一個加密解密用的類 def __init__(self,key): self.key = self.modifyLength(key) self.mode = AES.MODE_CBC def modifyLength(self,s): length = len(s) if length %16 == 0: add = 0 else: add = 16 - ( length % 16 ) return s + '\0' * add def encrypt(self,text): text = self.modifyLength(text) cryptor = AES.new(self.key,self.mode,b'0000000000000000') rawText = cryptor.encrypt(text) return b2a_hex(rawText)[0] def decrypt(self,text): text = self.modifyLength(text) cryptor = AES.new(self.key,self.mode,b'0000000000000000') plain_text = cryptor.decrypt(a2b_hex(text)) return plain_text.rsplit('\0')[0]
上面這個類定義了四個方法,第二個方法modifyLength是將傳入的字符串進行位數判斷,如果不是16的整數倍則用'\0'(即空字符)補全到16的倍數位數比如32位64位等等。這些是AES加密要求的,它要求秘鑰、被加密的字符串等位數都要是16位的整數倍的個數。
key自然是創建這個類對象時用的秘鑰了,兩個方法encrypt和decrypt分別用於加密和解密。加密后的數據是16進制的數據,如果直接用一些編碼格式去編碼解碼的話可能會存在編解碼失敗的情況,如果想要避免,則可以在加密階段的密文先做一個十六進制轉二進制的處理,在這里用的就是binascii.b2a_hex方法。解密的時候同樣記得調用a2b_hex這個方法。另外還需要注意的是解密后的內容要去除末尾的空字符(因用這個類加密時,原來的明文可能被末尾的空字符補充過)
