AES-128加密解密方式(逐步更新)

@AES-128加密解密方式

慢慢钻研也在慢慢更新

前言说一下,本人小白起步,断断续续的学习Python,慢慢的垒代码,持续学习中。部分内容,可能是直接找到网上内容来使用的,请大家勿喷,感谢。

由于最近项目接入一些东西呢,从产品运营的角度写一个简单的代码,去验证一些内容,所以写了这个代码。下面直接进入主题:

引入的库
from Crypto.Cipher import AES
from binascii import b2a_hex,a2b_hex
from Crypto import Random
import base64
检测key的长度
def check_key(key):
    # 检测key的长度是否为16,24或者32bytes的长度
    try:
        if isinstance(key, bytes):
            assert len(key) in [16, 24, 32]
            return key
        elif isinstance(key, str):
            assert len(key.encode()) in [16, 24, 32]
            return key.encode()
        else:
            raise Exception(f'密钥必须为str或bytes,不能为{type(key)}')
    except AssertionError:
        print('输入的长度不正确')
CFB/GCM模式
class AesEncryption(object):
    # CFB模式
    # def __init__(self, key, mode=AES.MODE_CFB):
    #     self.key = check_key(key)
    #     # 密钥key长度必须为16,24或者32bytes的长度
    #     self.mode = mode
    #     self.iv = Random.new().read(AES.block_size)

    # GCM模式
    def __init__(self, key, mode=AES.MODE_GCM):
        self.key = check_key(key)
        # 密钥key长度必须为16,24或者32bytes的长度
        self.mode = mode
        self.iv = Random.new().read(AES.block_size)
完整代码
from Crypto.Cipher import AES
from binascii import b2a_hex,a2b_hex
from Crypto import Random
import base64


def check_key(key):
    # 检测key的长度是否为16,24或者32bytes的长度
    try:
        if isinstance(key, bytes):
            assert len(key) in [16, 24, 32]
            return key
        elif isinstance(key, str):
            assert len(key.encode()) in [16, 24, 32]
            return key.encode()
        else:
            raise Exception(f'密钥必须为str或bytes,不能为{type(key)}')
    except AssertionError:
        print('输入的长度不正确')


class AesEncryption(object):
    # CFB模式
    # def __init__(self, key, mode=AES.MODE_CFB):
    #     self.key = check_key(key)
    #     # 密钥key长度必须为16,24或者32bytes的长度
    #     self.mode = mode
    #     self.iv = Random.new().read(AES.block_size)

    # GCM模式
    def __init__(self, key, mode=AES.MODE_GCM):
        self.key = check_key(key)
        # 密钥key长度必须为16,24或者32bytes的长度
        self.mode = mode
        self.iv = Random.new().read(AES.block_size)

    def check_data(self,data):
        # '检测加密的数据类型'
        if isinstance(data, str):
            data = data.encode()
        elif isinstance(data, bytes):
            pass
        else:
            raise Exception(f'加密的数据必须为str或bytes,不能为{type(data)}')
        return data
    def encrypt(self, data):
        # 加密函数
        data = self.check_data(data)
        cryptor = AES.new(self.key, self.mode,self.iv)
        return b2a_hex(cryptor.encrypt(data)).decode()

    def decrypt(self,data):
        # 解密函数
        data = self.check_data(data)
        cryptor = AES.new(self.key, self.mode,self.iv)
        return cryptor.decrypt(a2b_hex(data)).decode()

if __name__ == '__main__':
    key = input('请输入key:')
    data = '{"ai":"test-accountId","name":"用户姓名","idNum":"371321199012310912"}'
    aes = AesEncryption(key)
    # 调用加密函数
    e = aes.encrypt(data)
    # 调用解密函数
    d = aes.decrypt(e)
    # 打印加密
    print('加密内容: ', e)
    # 打印解密
    print('解密内容: ', d)
    # 返回base64位的加密
    en_text = base64.b64encode(bytes(e, 'utf-8'))
    # 打听base64加密
    print('获得的base64加密: ', en_text)
持续更新中

后续还在钻研拼接,希望大家理解。请慢喷,小白一名,写的有误的地方,请大家理解和指正。感谢

你可能感兴趣的:(python)