python aes 加盐 加密解密
爬虫就是在学习的过程,前几天从某网站的js里学到的加密方式,通过下断点弄清加密原理后,用python复现一下,在这里和大家分享下
#--------引入模块--------
from Crypto.Cipher import AES
import base64
import time
import random
from hashlib import md5
from Crypto.Util.Padding import pad,unpad
#--------函数区--------
def md(s,salt):#md5加密,盐加在了末尾,这个可以自定义,加在开头,加在中间斗ok的,只要两端的加密方式统一就可以
mdd=md5()
mdd.update(s+salt)
return mdd.digest()
def dec(key,iv,data):#aes解密
decc= AES.new(key,AES.MODE_CBC,iv)
result=unpad(decc.decrypt(data),block_size=16).decode()
return result
def enc(key,iv,data):#aes加密
decc = AES.new(key, AES.MODE_CBC, iv)
result=decc.encrypt(pad(data.encode(),block_size=16))
return result
def saltenc(xdata, ts): # 加盐解密
password = 'xxxxxxxxxxxxxxxxxxx:' + ts # 加密的原始key,可以是你任意想输入的内容,也可以像这样由固定字符串和时间戳决定,同时兼顾了校验的功能
salt = md(str(random.random()).encode(), b'')[4:12] # 随机生成盐,8位,其他位数也是可以的,影响不是很大
st = md(password.encode(), salt) # 第一次md5
keys = md(st + password.encode(), salt) # 第一次md5的结果加上原始key再进行一次md5
key = st + keys # 两次加密结果衔接作为32位的加密key
iv = md(keys + password.encode(), salt) # 将得到的key再和原始key相加进行一次md5,作为偏移量iv
encda = enc(key, iv, xdata) # 使用加密key和iv进行加密
result = base64.b64encode(b'Salted__' + salt + encda).decode() # 返回结果带上salted和盐,进行base加密
return result
def saltdec(xdata,ts):#加盐加密
password = 'xxxxxxxxxxxxxxxxxxx:' + ts#加密的原始key
s=base64.b64decode(xdata)#base64解密
data=s[16:]#数据从第17位开始
salt=s[8:16]#这里是盐的位置
st=md(password.encode(),salt)#第一次md5
keys=md(st+password.encode(),salt)#第一次md5的结果加上原始key再进行一次md5
key=st+keys # 32位的加密key由两次加密结果衔接得到
iv=md(keys+password.encode(),salt)#将得到的key再和原始key相加进行一次md5,得到偏移量iv
result=dec(key,iv,data)# 使用加密key和iv进行解密
return result
def test():#测试函数
unenc_data='i am laowei'#原始数据
timestamp = str(int(time.time() * 1000))#13位时间戳
enc_data=saltenc(unenc_data,timestamp)#加密
print(enc_data)#打印加密后数据
dec_data=saltdec(enc_data,timestamp)#解密加密数据
print(dec_data)#打印解密数据
test()
ps:知道了算法,很多东西就可以不拘泥于形式,比如说md5时盐的位置,原始key的选择,原始key换为加密key的方式,也可以不局限于md5,sha256也是不错的选择,甚至是几种hash方式配合使用
老魏的公众号,会发布一些个人爬虫的案例和经验,欢迎大家一起来交流