AES密码算法:利用python中的AES模块来实现AES对称算法,以及算法的封装

AES算法简介

AES:即Advanced Encryption Standard,高级加密标准。AES又称Rijndael(为了表彰密码学家Joan Daemen和Vincent Rijmen)加密法,是美国联邦政府采用的一种区块加密标准。
这个标准用来替代原先的DES(Data Encryption Standard)。

AES的地位:已经成为对称密钥加密中最流行的算法之一。

AES算法特点:

  • 是一种对称分组加密算法。
  • AES的分组长度为128bit,密钥长度是可选的,分别为128/192/256bit,对应的轮数分别为10/12/14。
  • AES是一种迭代分组密码,使用了多轮置换和替换操作,且操作是可逆的。
  • 常见的对称加密: AES, DES, 3DES。

AES加密模式:

对称/分组密码一般分为流加密(如OFB、CFB等)和块加密(如ECB、CBC等)。对于流加密,需要将分组密码转化为流模式工作。对于块加密(或称分组加密),如果要加密超过块大小的数据,就需要涉及填充和链加密模式。

下面是常用的AES加密模式:

1) ECB(Electronic Code Book电子密码本)模式:

ECB模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。

  • 优点:
    (1).简单; 
    (2).有利于并行计算; 
    (3).误差不会被传送;
  • 缺点: 
    (1).不能隐藏明文的模式; 
    (2).可能对明文进行主动攻击; 因此,此模式适于加密小消息。

2) CBC(Cipher Block Chaining,加密块链)模式:

  • 优点:
    (1).不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
  • 缺点: 
    (1).不利于并行计算; 
    (2).误差传递; 
    (3).需要初始化向量IV

3) CFB(Cipher FeedBack Mode,加密反馈)模式:

  • 优点:
    (1).隐藏了明文模式; 
    (2).分组密码转化为流模式; 
    (3).可以及时加密传送小于分组的数据;
  • 缺点: 
    (1).不利于并行计算; 
    (2).误差传送:一个明文单元损坏影响多个单元; 
    (3).唯一的IV;

4) OFB(Output FeedBack,输出反馈)模式:

  • 优点:
    (1).隐藏了明文模式; 
    (2).分组密码转化为流模式; 
    (3).可以及时加密传送小于分组的数据;
  • 缺点: 
    (1).不利于并行计算; 
    (2).对明文的主动攻击是可能的; 
    (3).误差传送:一个明文单元损坏影响多个单元。

利用python进行AES加密和解密

需要安装必要的库:

pip install pycrypto

python代码:

from Crypto.Cipher import AES


def aes_cbc_encode(key,iv,data):
    """
    长度
        16: *AES-128*
        24: *AES-192*
        32: *AES-256*
        
    MODE 加密模式. 
        常见的ECB, CBC
        ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
        CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。
        CFB/OFB:实际上是一种反馈模式,目的也是增强破解的难度。
        FCB和CBC的加密结果是不一样的,两者的模式不同,而且CBC会在第一个密码块运算时加入一个初始化向量。
    """
    #aes = AES.new(b"17962AF2C75B7CD8", mode=AES.MODE_CBC, IV=b"A8D0D6BB81D4455E")
    aes = AES.new(key,mode=AES.MODE_CBC,IV=iv)
    #data = "本月是今年的最后一个月"
    data_bs = data.encode("utf-8")
    # 需要加密的数据必须是16的倍数
    # 填充规则: 缺少数据量的个数 * chr(缺少数据量个数)
    pad_len = 16 - len(data_bs) % 16
    data_bs += (pad_len * chr(pad_len)).encode("utf-8")

    bs = aes.encrypt(data_bs)
    print(bs)

def aes_cbc_decode(key,iv,cipher_data):
    """
    长度
        16: *AES-128*
        24: *AES-192*
        32: *AES-256*
        
    MODE 加密模式. 
        常见的ECB, CBC
        ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
        CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。
        CFB/OFB:实际上是一种反馈模式,目的也是增强破解的难度。
        FCB和CBC的加密结果是不一样的,两者的模式不同,而且CBC会在第一个密码块运算时加入一个初始化向量。
    """
    #aes = AES.new(b"17962AF2C75B7CD8", mode=AES.MODE_CBC, IV=b"A8D0D6BB81D4455E")
    aes = AES.new(key,mode=AES.MODE_CBC,IV=iv)
    # 密文
    #bs = b'\x94,`s\x9a\xc2\x15\xbfzU\xce\xf3\x8f)\xbb\xb5U<\xf4\xd9\xc8,]\xbbB\x99\x982nH\x82\x90\xd8Il\xd6\x94\x9c\xf9\x80\x1a\xde\x1c\xf8\x7f\xc4w\xc6'
    result = aes.decrypt(cipher_data)  # 解密
    print(result.decode("utf-8"))

# main 
if __name__ == '__main__':
    print("aes encode begin");

    key = b"17962AF2C75B7CD8"
    iv = b"A8D0D6BB81D4455E"
    #明文
    data = "本月是今年的最后一个月"
    print("明文:",data);
    aes_cbc_encode(key,iv,data)  #加密

    print("aes decode begin");
    #密文
    cipher_data = b'\x94,`s\x9a\xc2\x15\xbfzU\xce\xf3\x8f)\xbb\xb5U<\xf4\xd9\xc8,]\xbbB\x99\x982nH\x82\x90\xd8Il\xd6\x94\x9c\xf9\x80\x1a\xde\x1c\xf8\x7f\xc4w\xc6'
    aes_cbc_decode(key,iv,cipher_data) #解密


运行结果:

% python3 aes_test.py
aes encode begin
明文: 本月是今年的最后一个月
b’\x94,`s\x9a\xc2\x15\xbfzU\xce\xf3\x8f)\xbb\xb5U<\xf4\xd9\xc8,]\xbbB\x99\x982nH\x82\x90\xd8Il\xd6\x94\x9c\xf9\x80\x1a\xde\x1c\xf8\x7f\xc4w\xc6’
aes decode begin
本月是今年的最后一个月

你可能感兴趣的:(Python学习笔记,AES,对称算法,ECB模式,CBC模式,python,AES)