clown9s 发表于 2023-3-18 11:06

python学习——AES加密

本帖最后由 clown9s 于 2023-3-26 18:36 编辑

封装前:"""
Remarks:crypto库的AES加密
"""

import base64# 调用base64 将二进制转换成64个字符 编码专用
from Crypto.Cipher import AES# 调用AES,AES一种对称加密算法
from Crypto.Util.Padding import pad# 调用pad 当明文或密文位数不足时用于填充空余的位置


if __name__ == '__main__':
    p_i_w = b'0123456789012345'# 明文 b 表示bytes(字节)类型
    s_k = b'aaaabbbbccccdddd'# 密钥

    # key = s_k.encode('utf-8')# 给密钥设定编码,但需要在有类、函数内使用 如有类或函数这是第一步
    # s_k = pad(s_k, 16, 'pkcs7')
    # pad有三个参数第一个是需填充的数据,第二个是数据最低位数,第三个是非必要参数填充类型
    mode = AES.MODE_ECB# 选择AES加密模式 第二步
    cryption = AES.new(s_k, mode)# 初始化加密器 第三步
    # msg = base64.b64encode(cryption.encrypt(pad(p_i_w, 16)).decode('utf-8')
    # 一般来说加密步骤按上面写会比较好,如果加个填充类型就更好了
    msg = base64.b64encode(cryption.encrypt(p_i_w)).decode('utf-8')# 开始加密 第四步

    # 打印结果
    print('明文:%d', p_i_w)
    print('密钥:%d', s_k)
    print('密文:%d', msg)


封装后:
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad


def cryption(data, s_key):
    c_data = data.encode('utf-8')# 因为用户输入的是字符串最好转译一下
    c_key = s_key.encode('utf-8')# 不是字节类型程序会运行错误
    c_mode = AES.MODE_ECB
    c_cryption = AES.new(pad(c_key, 16, 'pkcs7'), c_mode)
    c_msg = base64.b64encode(c_cryption.encrypt(pad(c_data, 16, 'pkcs7'))).decode('utf-8')
    return c_msg


if __name__ == '__main__':
    a = input('请输入需加密的文本:')
    b = input('请输入密钥:')
    c = cryption(a, b)
    print('加密后的文本:', c)



修改了一下AES加密模式,其他加密模式需要添加固定的iv否则解密时无法回溯原文本,只有ECB模式不需要添加iv值
如使用crypto库则需要下载pycryptodome(pycrypto已经停止维护了所以建议用pycryptodome)然后在文件存储位置找到crypto文件将其改为Crypto(不改名好像无法调用,反正我是这样的),也可以下载pycryptodomx(pycryptodome的进阶版)
如果用的是anaconda可以参考下面的图片:




再次优化方便后续解密:
def cryption(data, s_key):
    c_data = data.encode('utf-8')# 因为用户输入的是字符串最好转译一下
    c_key = s_key.encode('utf-8')# 不是字节类型程序会运行错误
    p_k = pad(c_key, 16, 'pkcs7')
    p_d = pad(c_data, 16, 'pkcs7')
    c_mode = AES.MODE_ECB
    c_cryption = AES.new(p_k, c_mode)
    c_msg = base64.b64encode(c_cryption.encrypt(p_d)).decode('utf-8')
    return c_msg, p_k# 这里多返回了一个p_k(填充后的密钥),正常是只有一个返回值这个值可以删除



解密篇:python学习——AES解密

skywalker0123 发表于 2023-3-18 12:34

楼主打ctf吗

jackyleerq 发表于 2023-3-18 15:21

学习一下!!

clown9s 发表于 2023-3-19 14:30

skywalker0123 发表于 2023-3-18 12:34
楼主打ctf吗

没那种技术,现在只是在学习python的库

pwp 发表于 2023-3-19 18:43

{:1_921:}牛逼,学习了
页: [1]
查看完整版本: python学习——AES加密