若已熟悉流程,可直接跳至最后
1. AES加密是什么
AES是一种对称加密(加密和解密用的同一种秘钥)
在进行js逆向时,我们经常会遇到请求参数加密 / 响应数据加密,其中有些网站的数据加密就是通过AES这种加密形式来做的。
2. Python中如何使用AES
2.1 安装模块
pip install pycryptodome
2.2 使用流程(加密)
生成秘钥
AES中所支持的秘钥格式:
- 128位密钥(16字节)
- 192位密钥(24字节)
- 256位密钥(32字节)
也就是说,我们的这个秘钥大小必须得是以上三种的任何一种。
这里演示使用16字节的:
包括了秘钥key和偏移量
key = '0123456789abcdef'.encode() # 秘钥: 因为aes-128模式,所以必须16字节
iv = b'abcdabcdabcdabcd' # 偏移量:因为aes-128模式,所以必须16字节
初始化
首先需要选定好加密模式
常见的加密模式有以下两种:
ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。
我们这里采用CBC的模式
from Crypto.Cipher import AES
aes = AES.new(key, AES.MODE_CBC, iv) # 创建一个aes对象
加密内容
因为这里采用的是128位秘钥,也就是16字节,所以你的加密内容也应该是16的倍数
from Crypto.Util.Padding import padtext = pad(text.encode(), 16) # 补充为16的倍数en_text = aes.encrypt(text) # 加密明文
编码
由于最后通过加密的数据是而紧凑,在后续不方便进行传输(包含不可打印数据),所以最终转为base64的编码:
import base64
en_text = base64.b64encode(en_text).decode() # 将返回的字节型数据转进行base64编码
2.3 解密
解密其实是差不多的逻辑,将base64解码为字节流,然后通过key和iv进行解密,这里不在赘述。
下面给出我自己封装好的一个类:
3. AES封装类
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64class AESClass:def __init__(self, key, iv):self.key = key.encode() # 秘钥self.iv = iv.encode() # 偏移量def encryption(self, text):"""加密:param test: 需要加密的内容:return:"""text = pad(text.encode(), 16)aes = AES.new(self.key, AES.MODE_CBC, self.iv) # 创建一个aes对象en_text = aes.encrypt(text) # 加密明文en_text = base64.b64encode(en_text).decode() # 将返回的字节型数据转进行base64编码return en_textdef decryption(self, text):"""解密:param text: 密文:return:"""aes = AES.new(self.key, AES.MODE_CBC, self.iv)text = text.encode() # 需要解密的文本ecrypted_base64 = base64.b64decode(text) # base64解码成字节流source = aes.decrypt(ecrypted_base64) # 解密return unpad(source, 16).decode()