Python实现AES_256 CBC模式加密算法

AES
AES(Advanced Encryption Standard)高级加密标准。是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过多年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES最常见的有3种方案,分别是AES-128、AES-192和AES-256,它们的区别在于密钥长度不同,AES-128的密钥长度为16bytes(128bit / 8),后两者分别为24bytes和32bytes。
密钥越长,安全强度越高,但伴随运算轮数的增加,带来的运算开销就会更大,所以用户应根据不同应用场合进行合理选择。
用户在应用过程中,除了关注密钥长度外,还应注意确认算法模式。AES算法有五种加密模式,即CBC、ECB、CTR、OCF、CFB,后三种模式因其较为复杂且应用较少,从安全性角度推荐CBC加密方法。
ECB模式的全称是Electronic Codebook Book,即电码本模式。这种模式是将整个明文分成若干个长度相同的分组,然后对每一小组进行加密,并将加密结果拼接为最终结果,C = C1C2C3…Cn。它与ECB模式的DES算法加密流程基本一致。
CBC模式的全称是Cipher Block Chaining,这种模式是先将明文切分成若干个长度相同的分组(与ECB模式一样),此时先利用初始向量IV与第一组数据进行异或后再进行加密运算生成C1。将C1作为初始向量与第二组数据进行异或后再进行加密运算生成C2。以此类推,当最后一组数据加密完毕后,将加密结果拼接为最终结果,C = C1C2C3…Cn。

Python实现AES
首先要安装好模块,防止大家踩坑,一定要区分开发环境,不同环境的安装包不一样,否则会出现安装报错,提示你缺少microsoft visual c++ 2015。避免遇到了但是又安装不上的窘境。如果你已经安装了但是还是出现无法加载模块,试试卸载重新安装。
python 在 Windows下使用AES时要安装的是pycryptodome 模块, pip install pycryptodome
python 在 Linux下使用AES时要安装的是pycrypto模块, pip install pycrypto
CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)

加密
加密时,明文首先与IV异或,然后将结果进行块加密,得到的输出就是密文,同时本次的输出密文作为下一个块加密的IV。
在这里插入图片描述
解密
解密时,先将密文的第一个块进行块解密,然后将结果与IV异或,就能得到明文,同时,本次解密的输入密文作为下一个块解密的IV。
在这里插入图片描述
代码实现:

from Crypto.Cipher import AES
import os
from Crypto import Random
import base64

"""
aes加密算法
padding : PKCS7
"""

class AESUtil:

    __BLOCK_SIZE_16 = BLOCK_SIZE_16 = AES.block_size

    @staticmethod
    def encryt(string, key, iv):
        """
        加密文本
        :param string: 文本
        :param key: 密钥
        :param iv: 偏移量/初始向量
        :return: 密文
        """
        cipher = AES.new(key, AES.MODE_CBC, iv)
        x = AESUtil.__BLOCK_SIZE_16 - (len(string) % AESUtil.__BLOCK_SIZE_16)
        # 如果最后一块不够16位需要用字符进行补全
        if x != 0:
            string = string + chr(x)*x
        msg = cipher.encrypt(string.encode('utf-8'))
        
        # msg = base64.urlsafe_b64encode(msg).replace('=', '')
        # msg = base64.b64encode(msg)
        return msg

    @staticmethod
    def decrypt(en_str, key, iv):
        cipher = AES.new(key, AES.MODE_CBC, iv)
        # en_str += (len(en_str) % 4)*"="
        # decryptByts = base64.urlsafe_b64decode(en_str)
        # decryptByts = base64.b64decode(en_str)
        # msg = cipher.decrypt(decryptByts)

        msg = cipher.decrypt(en_str)
        padding_len = msg[len(msg)-1]
        return msg[0:-padding_len]


if __name__ == "__main__":
    # import hashlib
    # key = hashlib.md5().hexdigest()   # 随机生产一个md5值,32位
    string = '{"key": "123456"}'
    key = b"d41d8cd98f00b204e9800998ecf8427e"   # 32位
    iv = b"1234567812345678"    # 16位
    res = AESUtil.encryt(string, key, iv)
    print(res)  # \xbf\xd7\xf7\xfc\x1c\x15\x93\xc1*Z\xc3\x0e\xda\x85\xdb\x9d\x9a\xb6z\xbb\xa7\xb3&\x8b\xa1\xd3\xc6\xf13;\xf3\n
    print(AESUtil.decrypt(res, key, iv))    # {"key": "123456"}

————————————————

原文链接:https://blog.csdn.net/ALLENsakaru/article/details/116568533

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值