Python3 AES加密

今天写一下Python3 的AES加密

这里简单介绍下AES加密。
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijdael之名命之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 “Rhine doll”。)高级加密标准算法从很多方面解决了令人担忧的问题。实际上,攻击数据加密标准的那些手段对于高级加密标准算法本身并没有效果。如果采用真正的128位加密技术甚至256位加密技术,蛮力攻击要取得成功需要耗费相当长的时间。
虽然高级加密标准也有不足的一面,但是,它仍是一个相对新的协议。因此,安全研究人员还没有那么多的时间对这种加密方法进行破解试验。我们可能会随时发现一种全新的攻击手段会攻破这种高级加密标准。至少在理论上存在这种可能性。

Python3 AES加密的ECB和CBC加密模式代码

# Python2.4以上需要导入这个模块
pip install pycryptodome
from Crypto.Cipher import AES
import base64

class aescrypt():
    # 初始化对象
    def __init__(self,key,model,iv,encode_):
        self.encode_ = encode_
        self.model = {'ECB':AES.MODE_ECB,'CBC':AES.MODE_CBC}[model]
        self.key = self.add_16(key)
        # CBC加密需要初始化向量IV,必须是16位,ECB模式不需要。
        self.iv = iv.encode()
        if model == 'ECB':
            self.aes = AES.new(self.key,self.model)
        elif model == 'CBC':
            self.aes = AES.new(self.key,self.model,self.iv)

    # 秘钥长度必须为16、24、32,目前16位足够
    def add_16(self,par):
        par = par.encode(self.encode_)
        while len(par) % 16 != 0:
            par += b'\x00'
        return par

    # 加密
    def aesencrypt(self,text):
        text = self.add_16(text)
        self.encrypt_text = self.aes.encrypt(text)
        return base64.encodebytes(self.encrypt_text).decode().strip()

    # 解密
    def aesdecrypt(self,text):
    	''' 两种解密方式不通用 '''
        if self.model == AES.MODE_CBC:
            self.aes = AES.new(self.key,self.model,self.iv)
            text = base64.decodebytes(text.encode(self.encode_))
            self.decrypt_text = self.aes.decrypt(text)
            return self.decrypt_text.decode(self.encode_).strip('\0')
        elif self.model == AES.MODE_ECB:
            text = base64.decodebytes(text.encode(self.encode_))
            self.decrypt_text = self.aes.decrypt(text)
            return self.decrypt_text.decode(self.encode_).strip('\0')

if __name__ == '__main__':
    # ECB
    pattern_ecb = aescrypt('85745','ECB','','utf8')
    en_text = pattern_ecb.aesencrypt('My hero')
    print('ECB加密模式密文:',en_text)
    data = pattern_ecb.aesdecrypt(en_text)
    print('ECB加密模式明文:',data)

    # CBC  需要初始化向量IV
    pattern_cbc = aescrypt('859685','CBC','1252635241524152','utf8')
    cbc_text = pattern_cbc.aesencrypt('My hero')
    print('CBC加密模式密文:',cbc_text)
    cbc_data = pattern_cbc.aesdecrypt(cbc_text)
    print('CBC加密模式密文:',cbc_data)

'''  
	两种加密模式的输出为以下的结果
	
	ECB加密模式密文: KCucY5hvnNg7ATEQI0nuAg==
	ECB加密模式明文: My hero
	
	CBC加密模式密文: mnIC0uhaAjAK+V8/G5F/Ig==
	CBC加密模式密文: My hero
'''

注意:我尝试了大小写字母、汉字、整形数字、特殊符号、浮点型数字等,也包括不同的编码,比如gbk、utf8、iso8859-1,经过测试都能加密解密。有需要的可以直接复制使用。
感谢 知识点提供的有关AES知识。

关于AES的其他加密方式,以后有时间再研究。在此,祝大家新年快乐!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值