【python】使用pycryptodome完成AES加密解密
Python实现AES的库也有好几个,但是建议使用pycryptodome,这个库一直在维护更新,而且兼容更多Python版本以及系统平台。,翻译为高级加密标准算法,是一种对称密钥加密算法。虽然AES对称加密比较方便,但是还是不够安全,如果你希望使用对称加密,也可以参考一下之前的文章。AES加密过程大概是,明文被划分为若干个块,然后每个块使用密钥进行加密,最终生成密文。CBC模式除了密钥(key)
·
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对称加密比较方便,但是还是不够安全,如果你希望使用对称加密,也可以参考一下之前的文章
更多推荐
已为社区贡献4条内容
所有评论(0)