文章目录

  • AES加解密
  • 1. 什么是AES
  • 2. AES 相关特性
  • 2.1 填充模式
  • 2.2 加解密模式
  • 2.3 明文和密文长度关系
  • 3. AES在线计算工具
  • 4. python实现AES加解密算法源码


AES加解密

1. 什么是AES

  • 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准,简而言之就是一种十分安全,基本无法破解的加密算法。

2. AES 相关特性

  • 要学会正确使用AES算法加解密,只需要弄懂如下几个特性即可:

2.1 填充模式

  • AES加密是对称加密,支持长度有 128, 192, 256 bit 共3种, 分别表示密钥的长度为16byte, 24byte和 32byte。
  • AES的加密方式会将明文拆分成不同的块进行加密,例如一个256 位的数据用128的密钥加密,则分成 :明文1(128位) 明文2(128位),加密后: 密文1(128位) 密文2(128位)
  • 如果明文长度不是16byte的整数倍,则需要对明文进行填充,填充方法及说明见下表:

填充方法

说明

NoPadding

不进行填充,要求明文必须要是16个字节的整数倍

PKCS5Padding(默认)

明文的末尾进行填充,填充的数据是和16个字节相差的数量

ISO10126Padding

明文的末尾进行填充,和16个字节相差的数量填写在最后,其余字节填充随机数

2.2 加解密模式

  • 模式是需要制定AES对明文进行加密时使用的模式(这里并不涉及具体的加密方法,只是加密步骤上的不同模式,在加解密时同样需要相同的模式,否则无法成功)
  • 一共提供了五种模式,模式的基本原理是近似的,但是细节上会有一些变化

模式

说明

ECB模式(默认)

电码本模式:根据密钥的位数,将数据分成不同的块进行加密,加密完成后,再将加密后的数据拼接起来

CBC模式

密码分组链接模式 :引入了初始向量概念,该向量必须和密钥长度相等的数据,在第一次加密前,会使用初始化向量与第一块数据做异或运算,生成的新数据再进行加密,加密第二块之前,会拿第一块的密文数据与第二块明文进行异或运算后再进行加密

CFB模式

密码反馈模式

OFB模式

输出反馈模式

CTR模式

计算器模式

2.3 明文和密文长度关系

  • 由于填充模式不同,加密后明文和密文的长度有所不同,其长度关系见下表:

3. AES在线计算工具

4. python实现AES加解密算法源码

  • python有用于计算AES加解密的模块,使用前需要先安装该模块:pip install pycryptodome(window系统,python3.8版本)
  • 源码如下:
"""
计算AES加解密的python程序
加密模式:AES 128 默认填充 CBC模式
"""

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

class AesCrypter(object):
    def __init__(self, key , iv):
        self.key = key
        self.iv = iv
        
    def encrypt(self, data):
        data = data.encode()
        data = self.pkcs7padding(data) # 判断长度,若不够进行填充
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        encrypted = cipher.encrypt(data)
        return b2a_hex(encrypted) # 转成hex格式返回
 
    def decrypt(self, data):
        data = a2b_hex(data)
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        decrypted = cipher.decrypt(data)
        decrypted = self.pkcs7unpadding(decrypted)
        return decrypted
 
    def pkcs7padding(self, data):
        bs = AES.block_size
        padding = bs - len(data) % bs
        padding_text = chr(padding) * padding
        return data + padding_text.encode('utf-8')
 
    def pkcs7unpadding(self, data): 
        lengt = len(data)
        unpadding = data[lengt - 1]
        return data[0:lengt-unpadding]
      
if __name__ == '__main__':
    AES_KEY = '1234567812345678' # 16 byte的加解密密钥
    AES_IV = '1234567812345678' # 16 byte的偏移向量
    aes = AesCrypter(AES_KEY, AES_IV)
    encrypted = aes.encrypt('1') # 加密
    print (str.format("%s %d"%(encrypted, len(encrypted))))
    plain = aes.decrypt(encrypted) # 解密
    print (plain, len(plain))

感谢阅读 若有错误 敬请见谅 !!!