python中的AES对称加密

一、环境:windows10 /Linux + python3.6+cryptography2.3 + Crypto + pycryptodome

(Linux如果报错,可能是缺少相应包,pip3 install pycryptodome下载)
(Crypto 文件不同,执行操作可能不同,也许会报错)

  • 加密

    # -*- coding: utf-8 -*
    from Crypto.Cipher import AES
    
    
    def encrypt(message):
        key = b'0123456789ABCDEF'
        cipher = AES.new(key, AES.MODE_CBC, key)
        bmessage = bytearray(message, encoding='utf-8')  
        v1 = len(bmessage)
        v2 = v1 % 16
        if v2 == 0:
            v3 = 16
        else:
            v3 = 16 - v2
        for i in range(v3):
            bmessage.append(v3)
        mi_msg = cipher.encrypt(bmessage)
        return mi_msg
    
  • 解密

    def decrypt(message):
        key = b'0123456789ABCDEF'
        cipher = AES.new(key, AES.MODE_CBC, key)
        result = cipher.decrypt(message)
        data = result[0:-result[-1]]
        return str(data,encoding='utf-8')
    
  • 验证

    import json
    v = json.dumps({'主机IP':'10.0.0.11','1':'1'})
    mi_data = encrypt(v)
    print('mi_data-->',mi_data)
    # mi_data--> b"\x06\x93\x845\x95\x18\xc2'e\xcfL\xd9a-p\x88\x98\xbd\x9fT\x05\x00}H\xb7qv\xd1\x92\xc3e8<\x14\xa3\xce\xd6Z\x9df\xcb\x90y\xeaR\xab8m"
    jiemi_data = decrypt(mi_data)
    print(len(jiemi_data),jiemi_data)
    # 41 {"\u4e3b\u673aIP": "10.0.0.11", "1": "1"}
    print(json.loads(jiemi_data))
     # {'主机IP': '10.0.0.11', '1': '1'}
    
    • bytearray的用法:https://www.cnblogs.com/gengyi/p/8438001.html
二、环境:windows10 + python2.7+cryptography2.3 + Crypto
  • 解密(稍微有些不同)

    def decrypt(message):
        key = b'0123456789ABCDEF'
        cipher = AES.new(key, AES.MODE_CBC, key)
        result = cipher.decrypt(message)
        print("result-->", result)
        print('result[-1]--->', result[-1], type(result[-1]))
        print(ord(result[-1]), )
        data = result[0:-ord(result[-1])]  # 【此处不同】
        print("data-->", data)
        return data.decode('utf-8')
    

                                    学而不思则罔,思而不学则殆

三、环境:Linux + python2.7+Crypto(和之前文件稍有差距)
  • 加密(稍微有些不同,解密同win_py2)

    # -*- coding: utf-8 -*
    from Crypto.Cipher import AES
      
    
    def encrypt(message):
        key = b'0123456789ABCDEF'
        cipher = AES.new(key, AES.MODE_CBC, key)
        bmessage = bytearray(message, encoding='utf-8')
        v1 = len(bmessage)
        print ('v1-->',v1)
        v2 = v1 % 16
        print ('v2-->',v2)
        if v2 == 0:
            v3 = 16
        else:
            v3 = 16 - v2
        print("v3-->",v3)
        for i in range(v3):
            bmessage.append(v3)
        print('bmessage-->',bmessage)
        final_data = bmessage.decode('utf-8')
        msg = cipher.encrypt(final_data)
        return msg
    
四、使用过程中出现的错误:
  • OSError: Cannot load native module 'Crypto.Cipher._raw_ecb': Trying '_raw_ecb.pyd': [Error 126] (Windows,python2执行时报错)。
    • 排查:如果有此文件,将_raw_ecb.cp36-win_amd64.pyd 文件名改为 _raw_ecb.pyd)。
  • OSError: Cannot load native module 'Crypto.Cipher._raw_ecb': Trying '_raw_ecb.cpython-34m.so' (Linux,python3执行时报错)。
    • 排查:执行 pip install pycryptodome。
五、思考
  • 思考1:cryptography pycryptodome Crypto 的关系。
    点击查看

  • 思考2:.pyd 文件 和 .so 文件 的作用。

  • 思考3:_raw_ecb.cp36-win_amd64.pyd 和 _raw_ecb.pyd 的区别及产生由来。

你可能感兴趣的:(python中的AES对称加密)