python AES补全加密解密小练习

该代码示例展示了如何使用Python的Crypto库实现AES加密算法的CBC模式,包括加密和解密过程。用户可以输入e进行加密,d进行解密,q退出程序。加密过程中,明文使用UTF-8编码,不足16字节的部分用零填充,然后进行AES加密并Base64编码。解密时,首先Base64解码,再用AES解密,最后去除填充的零。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值