文章目录
- AES加解密
- 1. 什么是AES
- 2. AES 相关特性
- 2.1 填充模式
- 2.2 加解密模式
- 2.3 明文和密文长度关系
- 3. AES在线计算工具
- 4. python实现AES加解密算法源码
AES加解密
1. 什么是AES
-
高级加密标准
(英语:Advanced Encryption Standard,缩写:AES
),是一种区块加密标准,简而言之就是一种十分安全,基本无法破解的加密算法。
2. AES 相关特性
- 要学会正确使用AES算法加解密,只需要弄懂如下几个特性即可:
2.1 填充模式
- AES加密是
对称加密
,支持长度有 128, 192, 256 bit 共3种, 分别表示密钥的长度为16byte, 24byte和 32byte。 - AES的加密方式会将明文拆分成不同的块进行加密,例如一个256 位的数据用128的密钥加密,则分成 :
明文1(128位) 明文2(128位)
,加密后:密文1(128位) 密文2(128位)
- 如果明文长度不是16byte的整数倍,则需要对明文进行填充,填充方法及说明见下表:
填充方法 | 说明 |
NoPadding | 不进行填充,要求明文必须要是16个字节的整数倍 |
PKCS5Padding(默认) | 明文的末尾进行填充,填充的数据是和16个字节相差的数量 |
ISO10126Padding | 明文的末尾进行填充,和16个字节相差的数量填写在最后,其余字节填充随机数 |
2.2 加解密模式
-
模式
是需要制定AES对明文进行加密时使用的模式(这里并不涉及具体的加密方法,只是加密步骤上的不同模式,在加解密时同样需要相同的模式,否则无法成功) - 一共提供了
五种模式
,模式的基本原理是近似的,但是细节上会有一些变化
模式 | 说明 |
ECB模式(默认) | 电码本模式:根据密钥的位数,将数据分成不同的块进行加密,加密完成后,再将加密后的数据拼接起来 |
CBC模式 | 密码分组链接模式 :引入了初始向量概念,该向量必须和密钥长度相等的数据,在第一次加密前,会使用初始化向量与第一块数据做异或运算,生成的新数据再进行加密,加密第二块之前,会拿第一块的密文数据与第二块明文进行异或运算后再进行加密 |
CFB模式 | 密码反馈模式 |
OFB模式 | 输出反馈模式 |
CTR模式 | 计算器模式 |
2.3 明文和密文长度关系
- 由于填充模式不同,加密后明文和密文的长度有所不同,其长度关系见下表:
3. AES在线计算工具
4. python实现AES加解密算法源码
- python有用于计算AES加解密的模块,使用前需要先安装该模块:
pip install pycryptodome
(window系统,python3.8版本) - 源码如下:
"""
计算AES加解密的python程序
加密模式:AES 128 默认填充 CBC模式
"""
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
class AesCrypter(object):
def __init__(self, key , iv):
self.key = key
self.iv = iv
def encrypt(self, data):
data = data.encode()
data = self.pkcs7padding(data) # 判断长度,若不够进行填充
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
encrypted = cipher.encrypt(data)
return b2a_hex(encrypted) # 转成hex格式返回
def decrypt(self, data):
data = a2b_hex(data)
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
decrypted = cipher.decrypt(data)
decrypted = self.pkcs7unpadding(decrypted)
return decrypted
def pkcs7padding(self, data):
bs = AES.block_size
padding = bs - len(data) % bs
padding_text = chr(padding) * padding
return data + padding_text.encode('utf-8')
def pkcs7unpadding(self, data):
lengt = len(data)
unpadding = data[lengt - 1]
return data[0:lengt-unpadding]
if __name__ == '__main__':
AES_KEY = '1234567812345678' # 16 byte的加解密密钥
AES_IV = '1234567812345678' # 16 byte的偏移向量
aes = AesCrypter(AES_KEY, AES_IV)
encrypted = aes.encrypt('1') # 加密
print (str.format("%s %d"%(encrypted, len(encrypted))))
plain = aes.decrypt(encrypted) # 解密
print (plain, len(plain))
感谢阅读 若有错误 敬请见谅 !!!