一、環(huán)境:windows10 /Linux + python3.6+cryptography2.3 + Crypto + pycryptodome
(Linux如果報(bào)錯(cuò)报亩,可能是缺少相應(yīng)包,pip3 install pycryptodome
下載)
(Crypto 文件不同,執(zhí)行操作可能不同父晶,也許會(huì)報(bào)錯(cuò))
-
加密
# -*- 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')
-
驗(yàn)證
import json v = json.dumps({'主機(jī)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)) # {'主機(jī)IP': '10.0.0.11', '1': '1'}
- bytearray的用法:https://www.cnblogs.com/gengyi/p/8438001.html
二、環(huán)境: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')
??????????????????????????????????? 學(xué)而不思則罔,思而不學(xué)則殆
三赞警、環(huán)境: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
四、使用過程中出現(xiàn)的錯(cuò)誤:
- OSError: Cannot load native module 'Crypto.Cipher._raw_ecb': Trying '_raw_ecb.pyd': [Error 126] (Windows愧旦,python2執(zhí)行時(shí)報(bào)錯(cuò))世剖。
- 排查:如果有此文件,將_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執(zhí)行時(shí)報(bào)錯(cuò))。
- 排查:執(zhí)行 pip install pycryptodome琼蚯。
五酬凳、思考
思考1:cryptography pycryptodome Crypto 的關(guān)系。
點(diǎn)擊查看思考2:.pyd 文件 和 .so 文件 的作用遭庶。
思考3:_raw_ecb.cp36-win_amd64.pyd 和 _raw_ecb.pyd 的區(qū)別及產(chǎn)生由來宁仔。