使用PyCrypto调用AES加密文件

使用PyCrypto调用AES加密文件

使用Python来对一个文件进行AES加密,当然我们可以自己来实现这个加密函数(其实推荐C/C++的实现,因为速度快),但是我们完全可以调用现成的模块。这里我们使用的模块是PyCrypto。

关于PyCrypto

PyCrypto是一个免费的加密算法库,支持常见的DES、AES加密以及MD5、SHA各种HASH运算。

关于AES

关于AES加密这边就不详细介绍,大家有兴趣去自己查看一下AES加密算法

安装PyCrypto

一种直接pip install pycrypto

在windows下安装会提示报错,在这边就找到一个网站直接安装编译好的PyCrypto.exe格式的文件
PyCrypto 2.6 for Python 2.7 64bit.exe

这边就举例两个版本,具体的下载地址详见:PyCrypto

安装成功以后,测试一下:
image

如何使用PyCrypto

一般我们在我们的项目里面使用AES来加密接口程序,比如我要调用c#那边的AD接口
我们会用使用加密后的数据来传输,我们在这边使用AES来加密。

我们各自约定好一个key,然后用这个key来加密,然后在解密,具体的代码如下:

import base64
from Crypto.Cipher import AES


BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s : s[:-ord(s[len(s)-1:])]

class AESCipher:
    def __init__( self, key ):
        self.key = key

    def encrypt( self, raw ):
        raw = pad(raw)
        iv="xxxxxx"#16位的向量,跟接口一起约定
        cipher = AES.new( self.key, AES.MODE_CBC, iv )
        return base64.b64encode( cipher.encrypt( raw ) )


    def decrypt( self, enc ):
        enc = base64.b64decode(enc)
        iv="xxxxxx"#16位的向量,跟接口一起约定
        cipher = AES.new(self.key, AES.MODE_CBC, iv )
        return cipher.decrypt( enc )

#具体如何使用
sskey='xxxxx' #也是一起约定的一个key,至少16位
username=AESCipher(key=sskey).encrypt("root")
pwd=AESCipher(key=sskey).encrypt("password")
print username,pwd
bb=AESCipher(key=sskey).decrypt(username)
aa=AESCipher(key=sskey).decrypt(pwd)
print bb,aa