使用Crypto对数据进行加密解密
注释都在代码里:
先撸客户端:
from Crypto.Cipher import AES import base64,requests class Message(object): def __init__(self,key,vi): self.key = key self.vi = vi def encryText(self,content): length = 16 content = content.encode() # 在这里将字符串转化为bytes count = len(content) if count < length: add = length - count # 加密字符小于16位时,后面补空格 content = content + b'\0' * add elif count > 16 and count % 16 != 0: # 位数大于16并且不是16的倍数时 add = length - (count % length) # 后面补空格 content = content + b'\0' * add # print("content被补齐后的样子",content,len(content)) # 提供的字典被处理之后:b'{"name": "python"}\x00\x00\x00\x00\x00\x00\x00\x00\x00\x # 00\x00\x00\x00\x00' 长度是32 encryptor = AES.new(self.key,AES.MODE_CBC,self.vi) # 加密 content = encryptor.encrypt(content) # print("加密后的数据",content) # b'\xcf.\xe9\ty\xdb\x80v\xf09\x85\xe5O\xc6\xb0\x13l\xbasR\xaad\xc3|N # \xb1\xf2\xa2\x1et\x0cd' 为了更加安全所以用base64再加工 return base64.urlsafe_b64encode(content) if __name__ == "__main__": import json data = {"name":"python"} encryptData = Message(b"the requests key",b"1234567890123456").encryText(json.dumps(data)) # print("得到的结果encryptData",encryptData) # b'zy7pCXnbgHbwOYXlT8awE2y6c1KqZMN8TrHyoh50DGQ=' # 不传输,立马就解密,如下: jiemimiyue = AES.new(b"the requests key", AES.MODE_CBC, b"1234567890123456") xianjiema = base64.urlsafe_b64decode(encryptData) jiemidata = jiemimiyue.decrypt(xianjiema).decode() # 解密完成之后转化为字符串 info = jiemidata.rstrip("\0") print("解密后的数据", info) d = json.loads(info) print("最终数据",d) # 传输代码如下: # r = requests.post("http://127.0.0.1:8000/search_all/", data={"data": encryptData}) # print(r.json())
服务端:
from Crypto.Cipher import AES import base64 from django.http import JsonResponse def getInfo(request): data = request.POST.get("data", "") key = b"the requests key" vi = b"1234567890123456" decryptor = AES.new(key, AES.MODE_CBC, vi) # 解密并解码 info = decryptor.decrypt(base64.urlsafe_b64decode(data)).decode() # 去掉右边空格 info = info.rstrip("\0") import json # 将字符串转成字典对象 d = json.loads(info) return JsonResponse({"code": "ok"})
注意事项:
客户端与服务端key与vi一定要保持一致 key的长度必须为16、24或32位 vi长度必须为16位,否则将直接报错 加密的内容必须为16的整数倍,不足可与服务器端协商补全 加密的内容必须是bytes,不能是字符串。