Crypto 提供AES 加/解密。有几点需要注意:
- 密钥key 长度必须为16(AES-128),24(AES-192),或者32 (AES-256)Bytes 长度
- 每次使用encrypt( ) 方法加密的内容必须为16 Bytes 长度
- Crypto AES加密模式有ECB/CBC/CFB 等模式,ECB 不需要使用iv 参数,CBC 等链式模式需要iv 参数
- ECB 是最简单的分块加密方式,CBC 当前加密结果和之前所有加密块都有关系,抗频率分析
- iv 是用于链式加密的参数,加密时长度必须等于AES.block_size,解密时长度为block_size+2 Bytes
PS:dd 命令可以创建任意大小的文件用于测试
实验环境:
CPU : Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
内存 : 12GB
结果:
ECB 加密速度在 13.7 MB/S 左右
CBC 加密速度在 11.9 MB/S 左右
自己预计是CBC 加密速度应该差点,但没有想到差距还有点大
CODE:
AES ECB 方式加密(temp00 为大小2GB 的二进制文件):
1: from Crypto.Cipher import AES
2: import datetime
3: import os
4: import sys
5:
6: def main():
7: pfile=open('temp00','rb')
8: con=pfile.read(2048*1024*1024)
9: key='0123456789012345'
10: mode=AES.MODE_ECB
11: encryptor=AES.new(key,mode)
12: stime=datetime.datetime.now()
13: for i in xrange(128*1024*1024):
14: text=con[i:i+16]
15: ciphertext=encryptor.encrypt(text)
16: etime=datetime.datetime.now()
17: dtime=(etime-stime).seconds
18: print 2048.0/int(dtime),'MB/S',dtime,'s'
19: pfile.close()
20:
21: if __name__=="__main__":
AES CBC 方式加密(temp00 为大小2GB 的二进制文件):
1: from Crypto.Cipher import AES
2: from Crypto import Random
3: import datetime
4: import os
5: import sys
6:
7:
8: def main():
9: pfile=open('temp00','rb')
10: con=pfile.read(2048*1024*1024)
11: key='0123456789012345'
12: mode=AES.MODE_CBC
13: iv=Random.new().read(AES.block_size)
14: encryptor=AES.new(key,mode,iv)
15: stime=datetime.datetime.now()
16: for i in xrange(128*1024*1024):
17: text=con[i:i+16]
18: ciphertext=iv+encryptor.encrypt(text)
19: etime=datetime.datetime.now()
20: dtime=(etime-stime).seconds
21: print 2048.0/int(dtime),'MB/S',dtime,'s'
22: pfile.close()
23:
24: if __name__=="__main__":
25: main()