1. Python
  2. 随笔一记

Python3 AES加密 解密

高级加密标准(英语: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/

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算法缺点:

可能导致明文攻击。