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
安裝遇到的問題
解決辦法
方法一:
所有的問題出在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!