美文网首页
python中的AES对称加密

python中的AES对称加密

作者: 清风徐来_简 | 来源:发表于2019-04-15 13:20 被阅读0次
    一、环境: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'}
      
    二、环境: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对称加密

          本文链接:https://www.haomeiwen.com/subject/olluwqtx.html