python中的AES对称加密
2019-04-15 本文已影响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'}
- 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 的区别及产生由来。