之前寫接口一般不用加密(做了權限處理),最近公司要求接口加密,我開始了入坑之路
因為公司其他人用的AES和DES加密,我就在網上查了下關於這方面的使用方法。
首先安裝Crypto
pip install Crypto
安裝成功,但是這個包是1.4.1根本不支持python3.6版本,
然后就下載pycrypto:pip install pycrypto,但是報錯(需要安裝visual C++ 2015 14.0版本),感覺麻煩就沒弄。。
之后就網上下載pycrypto的包,將里面的Crypto放到C:\Python36\Lib\site-packages,網上找了一下代碼,測試
from Crypto.Cipher import AES這一塊會報錯,在源碼中有一個import _AES(DES有一個import _DES),死活不行。。
接下來各種搗鼓,各種版本都是import那一塊出錯,實在不行,安裝c++庫,安完提示已安裝c++其它版本,終止安裝。。(這個時候心態已經崩了),
!!!重點來了!
接下來我在知乎上發布帖子,希望得到回復,有一個辦法回復:安裝Anaconda,自帶 Crypto,網上查了下600多m,有點大,,,
就逛知乎,無意間看到。。pycryptodome模塊,對,就是它,用pip安裝,C:\Python36\Lib\site-package目錄下就會有Crypto文件夾,
試了下代碼,沒有import錯誤
之后,執行了下代碼
#!/usr/bin/env python #! usr/bin/python # coding: utf8 import os,django from django.conf import settings os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tuling.settings")# project_name 項目名稱 django.setup() from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex class Prpcrypt(): """AES加密,采用CBC模式,這里key和iv值一樣""" def __init__(self, key): self.key = key self.mode = AES.MODE_CBC # 加密函數,如果text不是16的倍數【加密文本text必須為16的倍數!】,那就補足為16的倍數 def encrypt(self, text): cryptor = AES.new(self.key, self.mode, self.key)#cryptor = AES.new(key,mode,iv)# # 這里密鑰key 長度必須為16(AES-128)、24(AES-192)、或32(AES-256)Bytes 長度.目前AES-128足夠用 length = 16 count = len(text) if (count % length != 0): add = length - (count % length) else: add = 0 text = text + (b'\0' * add) self.ciphertext = cryptor.encrypt(text) # 因為AES加密時候得到的字符串不一定是ascii字符集的,輸出到終端或者保存時候可能存在問題 # 所以這里統一把加密后的字符串轉化為16進制字符串 return b2a_hex(self.ciphertext) # 解密后,去掉補足的空格用strip() 去掉 def decrypt(self, text): cryptor = AES.new(self.key, self.mode, self.key) plain_text = cryptor.decrypt(a2b_hex(text)) return plain_text.rstrip(b'\0') pc = Prpcrypt(settings.AES_KEY.encode()) # 初始化密鑰 # e = pc.encrypt(b'0123456789ABCDEF')#加密 # d = pc.decrypt(e) #解密 # print(e.decode()) # print(d.decode())
這個模塊要在字符串前加b,不然會報錯。
參考:https://blog.csdn.net/nurke/article/details/77267081
http://cakin24.iteye.com/blog/2384909
https://blog.csdn.net/s740556472/article/details/78778522
