栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

AES加解密

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

AES加解密

文章目录
  • 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))

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/499138.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号