crypto这个模块的安装有点小坑,需要注意。
crypto,pycrypto,pycryptodome的功能是一样的。
crypto与pycrypto已经没有维护了,所以直接都用 pycryptodome 就行了,安装命令如下
pip install pycryptodome
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad # pad 实现自动填充 无需手写判断字符长度再进行填充 很方便
def aes_encrypt(key=None, data_s=None): # 加密函数
aes = AES.new(key=key.encode('utf-8'), mode=AES.MODE_ECB)
raw = pad(data_s.encode('utf-8'), 16) # 注意 AES ECB 模式填充的不是0,填充的是特殊符号,由明文长度决定
print(raw) # b'pachongnixianglaoyao\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c'
en_str = aes.encrypt(raw)
res = base64.b64encode(en_str).decode('utf-8')
return res
def decrypt(key=None, data=None): # 解密函数
res = base64.b64decode(data.encode("utf-8"))
aes = AES.new(key.encode('utf-8'), mode=AES.MODE_ECB)
msg = aes.decrypt(res).decode("utf-8") # msg是填充后的明文 AES ECB模式填充的不是0,填充的是特殊符号,解密时最好打印看下
return msg # 这里是个坑 不能直接返回msg 要去掉填充 用replace() 替换掉填充
if __name__ == "__main__":
# key的长度需要补长(16倍数),补全方式根据情况而定
# key字符长度决定加密结果,长度16:加密结果AES(128),长度32:结果就是AES(256)
print(aes_encrypt("ABCDEFGHIJKMNOPQ", 'pachongnixianglaoyao'))
print(decrypt(key="ABCDEFGHIJKMNOPQ", data='5DoJIAzqDLW8cA3Yy1ASjw47bdDn8McNc32hfLhfq+g='))
# b'pachongnixianglaoyao\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c'
# 5DoJIAzqDLW8cA3Yy1ASjw47bdDn8McNc32hfLhfq+g=
# pachongnixianglaoyao
特别需要注意的是,网上很多文章说不足16位时填充0或者空格,那是误导人呢,AES加密ECB模式下 , 具体填充的什么跟字符串长度有关系,解密时打印看看,然后去掉填充 ,才是真正的明文