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 + ('' * add)
        elif count > length:
            add = (length -(count % length))
            text= text + ('' * 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('')
if __name__ == '__main__':
    mycrypt = MyCrypt('abcdefghjklmnopq')
    e = mycrypt.myencrypt('hello,world!')
    d = mycrypt.mydecrypt(e)
    print e
    print d
输出结果:
        12
        51296b171cfb57262f16a9ce3b68ec31
        hello,world!
原文地址:https://www.cnblogs.com/zn0523/p/7093585.html