Python AES加密解密

字节类型加密解密

from Crypto.Cipher import AES


#
class Aes_byte:
    iv: bytes = []
    key: bytes = []
    BLOCK_SIZE: int = 16  # 设定字节长度

    def __init__(self, key: bytes, iv: bytes, BLOCK_SIZE: int = 16):
        self.iv = iv
        self.key = key
        self.BLOCK_SIZE = BLOCK_SIZE
        pass

    def __str__(self):
        print("AES加密和解密---字节类型")
        pass

    # 补足字节方法
    def pad(self, value) -> bytes:
        count = len(value)
        if (count % self.BLOCK_SIZE != 0):
            add = self.BLOCK_SIZE - (count % self.BLOCK_SIZE)
        else:
            add = 0
        text = value + ("\0".encode() * add)  # 这里的"\0"必须编码成bytes,不然无法和text拼接
        return text

    # 将明文用AES加密
    def AES_encrypt(self, data: bytes) -> bytes:
        # 将长度不足16字节的字符串补齐
        buffter = self.pad(data)  # 注意在这个地方要把传过来的数据编码成bytes,不然还是会报上面说的那个错
        # 创建加密对象
        cryptor = AES.new(self.key, AES.MODE_CBC, self.iv)
        # 完成加密
        return cryptor.encrypt(buffter)  # 将明文用AES加密

    # 将明文用AES解密
    def AES_decrypt(self, data: bytes) -> bytes:
        # 将长度不足16字节的字符串补齐
        buffter = self.pad(data)  # 注意在这个地方要把传过来的数据编码成bytes,不然还是会报上面说的那个错
        # 创建加密对象
        cryptor = AES.new(self.key, AES.MODE_CBC, self.iv)
        # 完成加密
        return cryptor.decrypt(buffter)


if __name__ == "__main__":
    # 创建公共文件夹,方便后面视频读取
    public_path: str = "./response/加密解密/"
    key_path: str = "./response/加密解密/key.key"

    # 读取字节---key的
    with open(key_path, "rb") as File:
        key = File.read()

    # 加密
    with open(public_path + "666.ts", "rb") as VideoBuffter:
        video = VideoBuffter.read()
        b = Aes_byte(key, bytes(16)).AES_encrypt(video)
    with open(public_path + "encrypt.ts", "ab") as VideoBuffter:
        VideoBuffter.write(b)

    # 解密
    with open(public_path + "encrypt.ts", "rb") as VideoBuffter_en:
        b = Aes_byte(key, bytes(16)).AES_decrypt(VideoBuffter_en.read())
    with open(public_path + "decrypt.ts", "ab") as VideoBuffter_de:
        VideoBuffter_de.write(b)

字符串加密解密

import base64
from Crypto.Cipher import AES


class Aes_str:
    iv: str = []
    key: str = []
    BLOCK_SIZE: int = 16  # 设定字节长度

    def __init__(self, key: str, iv: str, BLOCK_SIZE: int = 16):
        self.iv = iv
        self.key = key
        self.BLOCK_SIZE = BLOCK_SIZE
        pass

    def __str__(self):
        print("AES加密和解密---字符串")
        pass

    # 将原始的明文用空格填充到16字节
    def pad(self, data):
        pad_data = data
        for i in range(0, 16 - len(data)):
            pad_data = pad_data + ' '
        return pad_data

    # 将明文用AES加密
    def AES_encrypt(self, data):
        # 将长度不足16字节的字符串补齐
        if len(data) < 16:
            data = self.pad(data)
        # 创建加密对象
        AES_obj = AES.new(self.key.encode("utf-8"), AES.MODE_CBC, self.iv.encode("utf-8"))
        # 完成加密
        AES_encrypt_str = AES_obj.encrypt(data.encode("utf-8"))
        # 用base64编码一下
        AES_encrypt_str = base64.b64encode(AES_encrypt_str)
        # 最后将密文转化成字符串
        AES_encrypt_str = AES_encrypt_str.decode("utf-8")
        return AES_encrypt_str

    def AES_decrypt(self, data):
        # 解密过程逆着加密过程写
        # 将密文字符串重新编码成二进制形式
        data = data.encode("utf-8")
        # 将base64的编码解开
        data = base64.b64decode(data)
        # 创建解密对象
        AES_decrypt_obj = AES.new(self.key.encode("utf-8"), AES.MODE_CBC, self.iv.encode("utf-8"))
        # 完成解密
        AES_decrypt_str = AES_decrypt_obj.decrypt(data)
        # 去掉补上的空格
        AES_decrypt_str = AES_decrypt_str.strip()
        # 对明文解码
        AES_decrypt_str = AES_decrypt_str.decode("utf-8")
        return AES_decrypt_str


if __name__ == "__main__":
    data = "123456"
    data = Aes_str("bunny20010212123", "bunny20010212---").AES_encrypt(data)
    print(data)
    data = Aes_str("bunny20010212123", "bunny20010212---").AES_decrypt(data)
    print(data)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是使用 Python 进行 AES 加密和解密的示例代码: ```python from Crypto.Cipher import AES import base64 # 加密函数 def aes_encrypt(key, data): # 将密钥和数据进行补位 key = key.encode('utf-8') data = data.encode('utf-8') key = key.ljust(16, b'\0') data = data.ljust(16, b'\0') # 创建 AES 加密器 aes = AES.new(key, AES.MODE_ECB) # 加密 encrypted_data = aes.encrypt(data) # 对加密结果进行 base64 编码 base64_data = base64.b64encode(encrypted_data) return base64_data.decode('utf-8') # 解密函数 def aes_decrypt(key, encrypted_data): # 将密钥和加密数据进行补位 key = key.encode('utf-8') encrypted_data = encrypted_data.encode('utf-8') key = key.ljust(16, b'\0') encrypted_data = base64.b64decode(encrypted_data) # 创建 AES 解密aes = AES.new(key, AES.MODE_ECB) # 解密 decrypted_data = aes.decrypt(encrypted_data) return decrypted_data.decode('utf-8').rstrip('\0') # 示例 key = '1234567890123456' data = 'Hello, world!' encrypted_data = aes_encrypt(key, data) decrypted_data = aes_decrypt(key, encrypted_data) print('加密前的数据:', data) print('加密后的数据:', encrypted_data) print('解密后的数据:', decrypted_data) ``` 在示例中,使用了 PyCryptodome 库中的 AES 加密和解密函数来实现加密和解密操作。需要注意的是,为了保证密钥和数据的长度符合 AES 加密算法的要求,需要在密钥和数据后面进行补位。在示例中,采用了将字符串转换成字节数组的方式进行补位。同时,在加密操作中,还对加密结果进行了 base64 编码,以便于传输和存储。 ### 回答2: Python AES加密解密是利用Python中的加密库来实现AES算法的加密和解密操作。AES是一种常用的对称加密算法,可以对数据进行高强度的加密,并可以通过相同密钥进行解密。 在Python中,我们可以使用第三方库PyCryptodome来实现AES加密解密。首先,需要安装PyCryptodome库,可以使用pip命令进行安装。 安装完成后,我们可以通过以下代码进行AES加密和解密的操作: ```python from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes # 生成随机的16字节密钥 key = get_random_bytes(16) # 初始化AES实例,使用ECB模式 cipher = AES.new(key, AES.MODE_ECB) # 待加密的数据 data = b'This is some data to be encrypted' # 执行加密操作 ciphertext = cipher.encrypt(pad(data, AES.block_size)) print('加密后的数据:', ciphertext) # 执行解密操作 decrypted_data = unpad(cipher.decrypt(ciphertext), AES.block_size) print('解密后的数据:', decrypted_data) ``` 在上述代码中,首先我们通过`get_random_bytes`函数生成了一个随机的16字节密钥。然后,使用生成的密钥以ECB模式初始化了一个AES实例。接下来,我们定义了待加密的数据,并通过`pad`函数进行填充,保证数据长度是AES块大小的整数倍。然后,调用`encrypt`函数对数据进行加密,并通过`print`函数打印出加密后的数据。 接着,我们调用`unpad`函数对加密后的数据进行解密,并通过`print`函数打印出解密后的数据。 需要注意的是,AES的安全性依赖于密钥的安全性,因此在实际应用中,密钥的生成和管理需要采取相应的安全措施。 ### 回答3: Python中实现AES加密解密可以使用`Crypto.Cipher`库。首先,需要安装`pycryptodome`库。可以使用以下命令安装: ``` pip install pycryptodome ``` 然后,我们可以按照下面的步骤使用AES进行加密和解密: 步骤 1:导入所需库 ```python from Crypto.Cipher import AES from Crypto.Random import get_random_bytes ``` 步骤 2:生成随机密钥和初始化向量(IV) ```python key = get_random_bytes(16) # 生成16字节的密钥 iv = get_random_bytes(16) # 生成16字节的初始化向量 ``` 步骤 3:创建AES加密器和解密器,使用生成的密钥和IV ```python cipher = AES.new(key, AES.MODE_CBC, iv) decrypter = AES.new(key, AES.MODE_CBC, iv) ``` 步骤 4:对要加密的数据进行填充 ```python data = b'Hello, World!' padding_length = AES.block_size - (len(data) % AES.block_size) data += bytes([padding_length]) * padding_length ``` 步骤 5:对数据进行加密和解密 ```python encrypted_data = cipher.encrypt(data) decrypted_data = decrypter.decrypt(encrypted_data) ``` 最后,我们可以打印出加密和解密后的数据: ```python print("加密后的数据:", encrypted_data) print("解密后的数据:", decrypted_data) ``` 这样,我们就完成了使用AES进行加密和解密的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值