AES加密——python实现

简介

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

代码

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex  # 处理位数
from Crypto import Random


class PrpCrypt(object):
    def __init__(self, key):
        """
        初始化方法
        :param key:
        """
        self.key = key.encode('utf-8')  # 先将传进来的数据进行编码,utf-8是目前互联网中使用最为广泛的一种
        self.mode = AES.MODE_CBC  # 根据要求返回的数据,选择对应的算法,这里mode-cbc返回的是2
        self.iv = Random.new().read(AES.block_size)  # 随机生成十六进制数字 读取处理的数据

    def encrypto(self, text):
        """
        加密函数 如果text不足16位就使用空格来补足16位(16位 密钥规则)
        :return:统一加密后的字符串转换成16进制后的字符串
        """
        text = text.encode('utf-8')
        cryptor = AES.new(self.key, self.mode, self.iv)
        # 密钥长度   AES-128(16)    AES-192(24)     AES-256(32)     Bytes 长度
        length = 16
        # 用户输入的字符串长度
        count = len(text)
        if count < length:
            add = (length - count)
            text = text + ('\0' * add).encode('utf-8')
        elif count > length:
            add = (length - (count % length))
            text = text + ('\0' * add).encode('utf-8')

        self.ciphertext = cryptor.encrypt(text)  # 加密
        return b2a_hex(self.ciphertext)  # 返回16进制加密结果

    def dencrypto(self, text):
        """
        解密函数
        :return:
        """
        cryptor = AES.new(self.key, self.mode, self.iv)
        plain_text = cryptor.decrypt(a2b_hex(text))
        return bytes.decode(plain_text).rstrip('\0')  # rstrip去除空格,decode将二进制反编码为str

if __name__ == '__main__':  # 程序入口
    i = 1
    while i:
        judge = input('加密请输入1,解密请输入2:')
        if judge == '1':
            keys = input('请输入16位长度的加密密钥:')
            pc = PrpCrypt(keys)
            data = input('请输入你要加密的数据:')
            e = pc.encrypto(data)  # 加密
            print('加密', e)
        elif judge == '2':
            # key2 = input('请输入16位长度的解密密钥:')
            # pc = PrpCrypt(key2)
            data2 = input('请输入你需要解密的数据:')   # 解密encode编码
            d = pc.dencrypto(data2).encode()
            #d = pc.dencrypto(e).encode()
            #d = pc.dencrypto(b2a_hex(data2)).encode()   #Data must be padded to 16 byte boundary in CBC mode
            print('解密', d)

运行示例

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章