整理一下關於Crypto加密的坑

  以前寫接口通常不用加密(作了權限處理),最近公司要求接口加密,我開始了入坑之路python

  由於公司其餘人用的AES和DES加密,我就在網上查了下關於這方面的使用方法。c++

  首先安裝Cryptodjango

  pip install Cryptodom

  安裝成功,可是這個包是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,否則會報錯。spa

  參考:https://blog.csdn.net/nurke/article/details/77267081.net

  http://cakin24.iteye.com/blog/2384909code

  https://blog.csdn.net/s740556472/article/details/78778522

相關文章
相關標籤/搜索