【Python实现AES加密】 -- 2019-08-12 12:41:45
原文: http://106.13.73.98/__/204/
AES(Advanced Encryption Standard)高级加密标准,在密码学中又被称为 Rijndael 加密法,是美国联邦*采用的一种区块加密标准。这个标准用来替代原先的 DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,AES由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,AES已经成为对称密钥加密中最流行的算法之一。
AES在软件及硬件上都能快速地进行加密解密,相对来说较易于实作,且只需要很少的存储器。作为一个新的加密标准,目前正在被部署应用到更广大的范围。
__特点__
1. 抵抗所有已知的攻击
2. 在多个平台上速度快,编码紧凑
3. 设计简单
__原理__
![在这里插入图片描述](http://106.13.73.98/media/ai/2019-05/958162f6-80ef-4de5-8e36-c40db09562e4.png)
AES为分组密码,分组密码就是把明文分成一组一组的,没组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。一般常用的128位。
__基本用法__
```python
import binascii
from Cryptodome.Cipher import AES
from Cryptodome import Random
# 准备要加密的数据
data = "数据库的密码是:123456"
# 秘钥-Key,秘钥的长度必须为 16(AES-128)、24(AES-192)、32(AES-256)
key = b'0' * 16
# 1. 生成长度等于AES块大小的不可重复的秘钥向量
iv = Random.new().read(AES.block_size)
# 2. 使用 key 和 iv 初始化AES对象
cipher = AES.new(key, AES.MODE_CFB, iv)
# 3. 加密的明文长度必须为16的倍数,如果长度不为16的倍数,则需要补充为16的倍数
# data += (16 - len(data) % 16) * '='
# 书上是这么说的,但我这里实测都没问题的
# 4. 加密数据
cipher_data = cipher.encrypt(data.encode())
print(binascii.b2a_hex(cipher_data)) # b'9b5e93ee68df40be7bd7bc08fa8ef21430ab6801cb4f7bf002e51a1bf7d6'
# 5. 生成新的AES对象,该AES对象用于解密
decrypt = AES.new(key, AES.MODE_CFB, iv)
# 6. 解密数据
decrypt_data = decrypt.decrypt(cipher_data)
print(decrypt_data.decode()) # 数据库的密码是:123456
# 注意:
# AES对象加密数据后不可再调用解密方法
# 一个AES对象只可解密一条数据
```
原文: http://106.13.73.98/__/204/