Python27中AES加密的安裝以及使用


Ums系統AES的加密使用

AES(英文:Advanced Encryption Standard,中文:高級加密標准),是一種區塊加密標准。AES將原始數據分成多個4×4字節矩陣來處理,通過預先定義的密鑰對每個字節矩陣中的每個字節進行異或、替換、移位以及線性變換操作來達到加密的目的。密鑰長度可以是128,192或256比特。

Python強大之處一是表現在語法簡單,內容小巧,卻可以實現復雜的程序功能;二是其優秀的跨平台能力,尤其涉及系統API調用時,統一封裝為PythonAPI,我們所需要的僅僅是在運行機器上有Python解釋器;三是豐富的庫模塊,使得我們可以使用Python實現多種多樣的功能。所有的這一切,都使得我們擺脫程序開發時的細枝末節,而將重點放在程序邏輯和技術實現之上。我們准備使用Python來對一個文件進行AES加密,當然我們可以自己來實現這個加密函數(其實推薦C/C++的實現,因為速度快),但是我們完全可以調用現成的模塊。這里我們使用的模塊是PyCrypto。

一、關於PyCrypto
  由於我們今天主要調用PyCrypto庫來實現加密,所以這里還是稍微做些介紹吧!PyCrypto是一個免費的加密算法庫,支持常見的DES、AES加密以及MD5、SHA各種HASH運算。我們可以在其官方主頁下載最新版本:https://www.dlitz.net/software/pycrypto/,我編寫程序時最新的是v2.6.1,下載之后得到一個zip的發布包,其中提供了setup.py文件,可以知道該程序包是使用Distutils分發的,基本的命令應該是:

點擊(此處)折疊或打開

python setup.py build

python setup.py install 

使用模塊准備:

1.安裝

Pip install Crypto

安裝遇到的問題

(1)python setup.py egg_info錯誤

解決辦法

方法一:
所有的問題出在certifi version conflict
所以可以從https://pypi.python.org/pypi/certifi 中下載,然后install from source
運行這句命令sudo python setup.py install 便可順利解決此問題。
或者可以直接卸載certifi 2016.2.28sudo pip uninstall certifi
然后安裝符合要求的certifi==2015.11.20。sudo pip install certifi==2015.11.20
為避免產生RuntimeError: maximum recursion depth exceeded 的錯誤
再更新distributepip install --upgrade distribute


方法二:
創建虛擬環境運行ipython

>>>pip install virtualenv

>>>virtualenv venv

>>>source venv/bin/activate

這時便已經進入了虛擬環境,現在便可使用pip install ipython 安裝。
當你想退出這個虛擬環境時,使用命令

>>>deactivate

 

(2)Microsoft Visual C++ 9.0 is required錯誤

   python27在運行setup.py安裝時, 會默認尋找visual studio 2008來編譯其中的C++文件。

  解決方法

1.安裝VS2008 所以需要運行
SET VS90COMNTOOLS=%VS120COMNTOOLS% 改變配置。

2.追加(如果你不想安裝vs2008): 

最終解決辦法:

安裝Microsoft Visual C++ Compiler for Python 2.7

二.使用模塊

將模塊安裝完成后,直接調用

From Crypto.Cipher import AES

還是報錯

 ImportError: No module named Crypto.Cipher

解決方法:

 Pip install pycrypto

如果還是報錯,則刪除crypto,pycrypto后,再次安裝pycrypto。

補充,后面安裝又碰到相同問題,上面的操作無法解決,甚至crypto模塊內部代碼都報這個錯誤,仔細檢查,從安裝目錄查找 c:/python27/Lib/site-packages/crypto把crypto 改成Crypto

 

附件樣例

from Crypto.Cipher import AES
from binascii import b2a_hex,a2b_hex
class MyCrypt():
    def __init__(self, key):
        self.key = key
        self.mode = AES.MODE_CBC
    def myencrypt(self, text):
        length = 16
        count = len(text)
        print count
        if count < length:
            add = length - count
            text= text + ('\0' * add)
        elif count > length:
            add = (length -(count % length))
            text= text + ('\0' * add)
        # print len(text)
        cryptor = AES.new(self.key, self.mode, b'0000000000000000')
        self.ciphertext = cryptor.encrypt(text)
        return b2a_hex(self.ciphertext)

    def mydecrypt(self, text):
        cryptor = AES.new(self.key, self.mode, b'0000000000000000')
        plain_text = cryptor.decrypt(a2b_hex(text))
        return plain_text.rstrip('\0')
if __name__ == '__main__':
    mycrypt = MyCrypt('abcdefghjklmnopq')
    e = mycrypt.myencrypt('hello,world!')
    d = mycrypt.mydecrypt(e)
    print e
    print d
輸出結果:
        12
        51296b171cfb57262f16a9ce3b68ec31
        hello,world!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM