AES加密方式有五種:ECB, CBC, CTR, CFB, OFBpython
從安全性角度推薦CBC加密方法,本文介紹了CBC,ECB兩種加密方法的python實現算法
python 在 Windows下使用AES時要安裝的是pycryptodome 模塊 pip install pycryptodome 安全
python 在 Linux下使用AES時要安裝的是pycrypto模塊 pip install pycrypto dom
CBC加密須要一個十六位的key(密鑰)和一個十六位iv(偏移量)加密
加密時,明文首先與IV異或,而後將結果進行塊加密,獲得的輸出就是密文,同時本次的輸出密文做爲下一個塊加密的IV。 url
解密時,先將密文的第一個塊進行塊解密,而後將結果與IV異或,就能獲得明文,同時,本次解密的輸入密文做爲下一個塊解密的IV。 spa
3. 代碼:3d
# -*- coding=utf-8-*- from Crypto.Cipher import AES import os from Crypto import Random import base64 """ aes加密算法 padding : PKCS7 """ class AESUtil: __BLOCK_SIZE_16 = BLOCK_SIZE_16 = AES.block_size @staticmethod def encryt(str, key, iv): cipher = AES.new(key, AES.MODE_CBC,iv) x = AESUtil.__BLOCK_SIZE_16 - (len(str) % AESUtil.__BLOCK_SIZE_16) if x != 0: str = str + chr(x)*x msg = cipher.encrypt(str) # msg = base64.urlsafe_b64encode(msg).replace('=', '') msg = base64.b64encode(msg) return msg @staticmethod def decrypt(enStr, key, iv): cipher = AES.new(key, AES.MODE_CBC, iv) # enStr += (len(enStr) % 4)*"=" # decryptByts = base64.urlsafe_b64decode(enStr) decryptByts = base64.b64decode(enStr) msg = cipher.decrypt(decryptByts) paddingLen = ord(msg[len(msg)-1]) return msg[0:-paddingLen] if __name__ == "__main__": key = "1234567812345678" iv = "1234567812345678" res = AESUtil.encryt("123456", key, iv) print res # 2eDiseYiSX62qk/WS/ZDmg== print AESUtil.decrypt(res, key, iv) # 123456