# 在使用 python3
做爬虫的时候,有时候遇到 AES
加密或解密,下面介绍一下常见的 ECB
和 CBC
模式包括 base64
编码和 hex
编码
#
Crypto
安装pycrypto
,pycrytodome
一个东西,前者最新版在 13 年更新的,对windows
系统而言,python3
建议安装pycryptodome
,用法和pycrypto
一样pip install pycryptodome # 支持 py2 和 py3
# 使用
Crypto
实现AES
加密解密ECB
模式
from Crypto.Cipher import AES
# 我封装成了函数,也可以封装成类,看个人需求
def aes_ECB(s, encry=True):
"""
AES ECB加密
:param s: 原始字符串
:param encry:
- 默认 True 加密
- False 解密
:return: 加密 或者 解密后的字符串
"""
key = "6HPjSZFH8RLv4dBj" # 密钥,根据实际情况赋值
# 初始化 ECB 模式的实例
aes = AES.new(key, AES.MODE_ECB)
# 加密
if encry:
# 补位数,使原始字串为 block_size 的倍数 block_size 默认是 16
count = len(s.encode('utf-8'))
diff = AES.block_size - (count % AES.block_size)
data = s + (chr(diff) * diff)
ret = aes.encrypt(data.encode("utf8"))
return base64.b64encode(ret).
# 解密
else:
# 去除填充的字符
unpad = lambda info: info[0:-ord(info[-1])]
ret = base64.b64decode(s.encode("utf8"))
return unpad(aes.decrypt(ret).decode("utf8"))
- CBC 模式
from Crypto.Cipher import AES
def aes_CBC(s, encry=True):
"""
AES CBC加密
:param s: 原始字符串
:param encry:
- 默认 True 加密
- False 解密
:return: 加密 或者 解密后的字符串
"""
key = "6HPjSZFH8RLv4dBj" # 密钥,根据实际情况赋值
iv = "6HPjSZFH8RLv4dBj" # 偏移量,根据实际情况赋值
# 初始化 CBC 模式的实例
cbc = AES.new(key, AES.MODE_CBC, iv)
# 加密
if encry:
# 填充字符,使原始字串为 block_size 的倍数,block_size 默认是 16
count = len(s.encode('utf-8'))
diff = AES.block_size - (count % AES.block_size)
data = s + (chr(diff) * diff)
ret = cbc.encrypt(data)
return base64.b64encode(ret)
# 解密
else:
# 去除填充的字符
unpad = lambda info: info[0:-ord(info[-1])]
decryptByts = base64.b64decode(s)
ret = cbc.decrypt(decryptByts)
return unpad(ret)
# 如果是
hex
格式,把base64
换成下列函数加解密即可from binascii import a2b_hex, b2a_hex
# b2a_hex 对应 b64encode 编码
# a2b_hex 对应 b64decode 解码