python AES补全加密解密小练习

AES.MODE_CBC

1.KEY:16位或16位倍数字节
2.IV:16位或16位倍数字节
3.CBC:加密解密都需要创建aes对象

程序运行流程

def main():
    while True:
        s = input('加密输入e,解密输入d,结束输入q:').strip()
        if s == 'e':
            en_code()
        elif s == 'd':
            de_code()
        elif s == 'q':
            break
if __name__ == '__main__':
    main()

加密

def en_code():
    s = input('请输入加密明文:').strip()
    # 对明文编码
    s_utf = s.encode('utf-8')
    # 计算编码后的明文长度,缺多少位
    le = len(s_utf)
    n = le % 16
    m = (16 - n)
    # 将明文补齐,补齐方式是应该是zeropadding
    s_utf_b = s_utf + b'\x00' * m
    iv = b'asd15sd48sd78weq'
    key = b'123asd456qwe789r'
    # 创建aes对象
    aes = AES.new(key, AES.MODE_CBC, iv)
    # aes加密
    s_encrypt = aes.encrypt(s_utf_b)
    # 对aes加密后的密文进行base64编码,然后再用utf-8解码,其实这个地方无论什么解码都行
    s_b64 = base64.encodebytes(s_encrypt).decode()
    print(s_b64)
    # 将明文密文保存在工作目录1.txt文件中
    with open('1.txt', 'a', encoding='utf-8') as f:
        f.write('明文:' + s + '\n')
        f.write('密文:' + s_b64)

解密

def de_code():
    s = input('请输入解密密文:').strip()
    # 先编码
    s_utf = s.encode()
    # base64解码
    s_b64 = base64.decodebytes(s_utf)
    iv = b'asd15sd48sd78weq'
    key = b'123asd456qwe789r'
    # 获取aes对象
    aes = AES.new(key, AES.MODE_CBC, iv)
    # aes解码
    s_dencrypt = aes.decrypt(s_b64)
    # 因为明文的utf-8编码曾经用\x00补全过,所以要去掉补全的\x00
    s_dencrypt = s_dencrypt.replace(b'\x00', b'')
    # 最后utf-8解码
    s_decode = s_dencrypt.decode('utf-8')
    print(s_decode)
    # 把密文和解密的明文保存在1.txt文件里面
    with open('1.txt', 'a', encoding='utf-8') as f:
        f.write('密文:' + s + '\n')
        f.write('明文:' + s_decode + '\n')
        f.write('\n')

完整代码

from Crypto.Cipher import AES
import base64


def en_code():
    s = input('请输入加密明文:').strip()
    s_utf = s.encode('utf-8')
    le = len(s_utf)
    n = le % 16
    m = (16 - n)
    s_utf_b = s_utf + b'\x00' * m
    iv = b'asd15sd48sd78weq'
    key = b'123asd456qwe789r'
    aes = AES.new(key, AES.MODE_CBC, iv)
    s_encrypt = aes.encrypt(s_utf_b)
    s_b64 = base64.encodebytes(s_encrypt).decode()
    print(s_b64)
    with open('1.txt', 'a', encoding='utf-8') as f:
        f.write('明文:' + s + '\n')
        f.write('密文:' + s_b64)


def de_code():
    s = input('请输入解密密文:').strip()
    s_utf = s.encode()
    s_b64 = base64.decodebytes(s_utf)
    iv = b'asd15sd48sd78weq'
    key = b'123asd456qwe789r'
    aes = AES.new(key, AES.MODE_CBC, iv)
    s_dencrypt = aes.decrypt(s_b64)
    s_dencrypt = s_dencrypt.replace(b'\x00', b'')
    s_decode = s_dencrypt.decode('utf-8')
    print(s_decode)
    with open('1.txt', 'a', encoding='utf-8') as f:
        f.write('密文:' + s + '\n')
        f.write('明文:' + s_decode + '\n')
        f.write('\n')


def main():
    while True:
        s = input('加密输入e,解密输入d,结束输入q:').strip()
        if s == 'e':
            en_code()
        elif s == 'd':
            de_code()
        elif s == 'q':
            break


if __name__ == '__main__':
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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进行加密和解密的过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值