zoukankan      html  css  js  c++  java
  • 使用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'' * add
            elif count > 16 and count % 16 != 0:    # 位数大于16并且不是16的倍数时
                add = length - (count % length)
                # 后面补空格
                content = content + b'' * add
            # print("content被补齐后的样子",content,len(content))
            # 提供的字典被处理之后:b'{"name": "python"}x00x00x00x00x00x00x00x00x00x
            # 00x00x00x00x00' 长度是32
            encryptor = AES.new(self.key,AES.MODE_CBC,self.vi)
            # 加密
            content = encryptor.encrypt(content)
            # print("加密后的数据",content)
            # b'xcf.xe9	yxdbx80vxf09x85xe5Oxc6xb0x13lxbasRxaadxc3|N
            # xb1xf2xa2x1etx0cd'  为了更加安全所以用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("")
        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("")
        import json
        # 将字符串转成字典对象
        d = json.loads(info)
        return JsonResponse({"code": "ok"})
    

     注意事项:

    客户端与服务端key与vi一定要保持一致
    key的长度必须为16、24或32位
    vi长度必须为16位,否则将直接报错
    加密的内容必须为16的整数倍,不足可与服务器端协商补全
    加密的内容必须是bytes,不能是字符串。
    
  • 相关阅读:
    洛谷P4016 负载平衡问题 费用流
    Reactor Cooling ZOJ
    Acme Corporation UVA
    洛谷P4014 分配问题 费用流
    洛谷P4013 数字梯形问题 费用流
    洛谷P4012 深海机器人问题 费用流
    力扣题目汇总(旋转数字,移除元素,找不同)
    力扣题目汇总(两数之和Ⅱ-输入有序数组,删除排序数组中的重复项,验证回文串)
    逻辑练练手小程序
    爬虫之Scarpy.Request
  • 原文地址:https://www.cnblogs.com/fawaikuangtu123/p/9762315.html
Copyright © 2011-2022 走看看