高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
由于 pycryto 模块很长时间没有更新了 通过 pip install pycryto 来安装已经不行了
参考了几篇文章尝试解决这个问题,结果都没有成功
后来在 StackOverFlow 上发现有人说可以用 yum install python-crypto 在linux 直接安装!!!
试了一下果然可以。
那么Windows 怎么办???
经过搜索发现可以用 pycryptodome 代替
pip install pycryptodome -i https://pypi.mirrors.ustc.edu.cn/simple/
- 阿里云 https://mirrors.aliyun.com/pypi/simple/
- 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
- 豆瓣(douban) https://pypi.douban.com/simple/
- 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
- 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
pip 加个 -i 参数 用国内源 下载速度不知道快到哪里去。
一下子就。。。成功了!
那么到底好不好使呢?试一试就知道了!
#Python3 AES Test
#Authour: Michael Jiang
#Last-Modified: 2018年10月28日19:50:45
import base64 #Python base64模块是用来作base64编码解码的
from Crypto.Cipher import AES
#如果 str 不是16的倍数就补足为16的倍数
def add_to_16(value):
while len(value) % 16 != 0:
value += '\0'
return str.encode(value) #返回bytes
#加密方法
def encode_aes(key,p):
'''
key : 秘钥
p : 明文
'''
# 初始化加密器
aes = AES.new(add_to_16(key), AES.MODE_ECB)
#先进行aes加密
encrypt_aes = aes.encrypt(add_to_16(p))
#用base64转成字符串形式
encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8')
# 执行加密并转码返回bytes
return encrypted_text
#解密方法
def decode_aes(key,c):
'''
key : 秘钥
p : 密文
'''
# 初始化加密器
aes = AES.new(add_to_16(key), AES.MODE_ECB)
#优先逆向解密base64成bytes
base64_decrypted = base64.decodebytes(c.encode(encoding='utf-8'))
#执行解密密并转码返回str
decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8').replace('\0','')
return decrypted_text
if __name__ == '__main__':
p = 'are you ok?'
k = '123456'
print("原文: "+p)
c = encode_aes(k, p)
print("密文: "+c)
d_c = decode_aes(k,c)
print("解密: "+d_c)
几种AES MODE 对比
一、Cipher feedback(CFB)
CFB算法优点:
同明文不同密文,分组密钥转换为流密码。
CFB算法缺点:
串行运算不利并行,传输错误可能导致后续传输块错误。
二、Output feedback(OFB)
OFB算法优点:
同明文不同密文,分组密钥转换为流密码。
OFB算法缺点:
串行运算不利并行,传输错误可能导致后续传输块错误。
三、Electronic codebook(ECB)
ECB算法优点:
简单、孤立,每个块单独运算。适合并行运算。传输错误一般只影响当前块。
ECB算法缺点:
同明文输出同密文,可能导致明文攻击。我们平时用的AES加密很多都是ECB模式的,此模式加密不需要向量IV。
四、Cipher-block chaining(CBC)
CBC算法优点:
串行化运算,相同明文不同密文
CBC算法缺点:
需要初始向量,不过这其实不算缺点,下文的CTR也是需要随机数的。如果出现传输错误,那么后续结果解密后可能全部错误。
此外,还有Propagating cipher-block chaining(PCBC)加密模式,
五、Counter mode(CTR)
CTR算法优点:
无填充,同明文不同密文,每个块单独运算,适合并行运算。
CTR算法缺点:
可能导致明文攻击。