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))

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

园长QwQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值