AES注意事項:
1) 確保都使用AES_128 + ECB;
2) 確保明文填充都使用的是Pkcs7;
3) 加密key在AES_128長度必須是16, 24, 或者 32 字節(bytes);如果不夠長必須填充,過長必須截取,建議直接md5;
4) 加密向量iv與加密key有同樣的約定,但在ECB可以忽略該值(用不到)。
5) 注意加密結果建議都使用base64編碼。
只有以上都保持一樣,各個語言里最終加密的密文才能保持一致,否則會出現:
1) 每次加密的密文不一樣,但是能解密;(iv隨機生成導致的)
2) 不同語言加密出來的密文不一致。
需要先安裝:
pip install pycrypto
pip install Crypto
代碼:
# -*- 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): #cipher = AES.new(key, AES.MODE_ECB,b'0000000000000000') #第三個參數是加密向量iv,ECB模式不需要 cipher = AES.new(key, AES.MODE_ECB) 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): cipher = AES.new(key, AES.MODE_ECB) # 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" res = AESUtil.encryt("123456", key) print(res) print(AESUtil.decrypt(res, key))
mdSm0RmB+xAKrTah3DG31A== 123456
摘抄鏈接:
https://segmentfault.com/a/1190000009558962
