1.说明

AES(Advanced Encryption Standard) ,翻译为高级加密标准算法,是一种对称密钥加密算法。AES在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。

AES加密过程大概是,明文被划分为若干个块,然后每个块使用密钥进行加密,最终生成密文

密钥长度:128位、192位和256位,即16、24、32个字符

加密模式:ECB、CBC、CFB、OFB、CTR、OPENPGP、CCM、EAX、SIV、GCM、OCB

2.案例代码

Python实现AES的库也有好几个,但是建议使用pycryptodome,这个库一直在维护更新,而且兼容更多Python版本以及系统平台。因为pycryptodome不是 内置库,所以需要安装一下

pip install pycryptodome

因为AES的加密模式有很多,所以这里只以CBC模式进行演示

CBC模式除了密钥(key),还需要一个偏移量(iv),偏移量的值也是需要16个字符

from binascii import b2a_hex, a2b_hex
from Crypto.Cipher import AES


class AesCbcEncryption:
    encoding = "utf-8"
    __iv = b'1111111111111111'
    key_len = 16

    @classmethod
    def encrypt(cls, clear_msg: str, key: str, iv: str = None):
        key = key.encode(cls.encoding)
        mode = AES.MODE_CBC
        bytes_len_mod = len(clear_msg.encode('utf-8')) % cls.key_len
        fill_count = cls.key_len - bytes_len_mod if bytes_len_mod else 0
        clear_msg = clear_msg + ('\0' * fill_count)
        en_iv = iv if iv else cls.__iv
        cryptos = AES.new(key, mode, en_iv)
        cipher_text = cryptos.encrypt(clear_msg.encode(cls.encoding))
        return b2a_hex(cipher_text).decode()

    @classmethod
    def decrypt(cls, encrypted_msg: str, key: str, iv: str = None):
        key = key.encode(cls.encoding)
        mode = AES.MODE_CBC
        de_iv = iv if iv else cls.__iv
        cryptos = AES.new(key, mode, de_iv)
        plain_text = cryptos.decrypt(a2b_hex(encrypted_msg))
        return plain_text.strip(b'\0').decode(cls.encoding)


if __name__ == '__main__':
    test_key = "0123456789abcdef12345678"  # len: 16, 24, 32
    message = "hello world"
    e = AesCbcEncryption.encrypt(message, test_key)
    d = AesCbcEncryption.decrypt(e, test_key)
    print("encrypted:", e)
    print("decrypted:", d)

虽然AES对称加密比较方便,但是还是不够安全,如果你希望使用对称加密,也可以参考一下之前的文章

【python】使用pycryptodome完成RSA非对称加密解密、签名验签

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐