Python標准庫 - Crypto庫


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM