博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Crypto对数据进行加密解密
阅读量:4552 次
发布时间:2019-06-08

本文共 2423 字,大约阅读时间需要 8 分钟。

注释都在代码里:

先撸客户端:

from Crypto.Cipher import AESimport base64,requestsclass 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 AESimport base64from django.http import JsonResponsedef 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,不能是字符串。

转载于:https://www.cnblogs.com/fawaikuangtu123/p/9762315.html

你可能感兴趣的文章
进程/线程切换原则
查看>>
正则表达式语法
查看>>
20165301 2017-2018-2 《Java程序设计》第四周学习总结
查看>>
Vue的简单入门
查看>>
urllib 中的异常处理
查看>>
通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?
查看>>
SQL优化:重新编译存储过程和表
查看>>
PCB“有铅”工艺将何去何从?
查看>>
Solr环境搭建
查看>>
垂直居中的几种实现方法
查看>>
UILabel标签文字过长时的显示方式
查看>>
H5离线缓存机制-manifest
查看>>
比较:I/O成员函数getline() 与 get()(第二种用法)的用法异同
查看>>
201671010118 2016-2017-2《Java程序设计》 第十一周学习心得
查看>>
Get Sauce(状压DP)
查看>>
Office2007 升级到 office2010
查看>>
SpringBoot整合Hibernate
查看>>
PPT1 例2
查看>>
extern外部方法使用C#简单例子
查看>>
血液循环结构
查看>>