吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 784|回复: 4
收起左侧

[学习记录] python学习——AES加密

[复制链接]
clown9s 发表于 2023-3-18 11:06
本帖最后由 clown9s 于 2023-3-26 18:36 编辑

封装前:
[Python] 纯文本查看 复制代码
"""
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)



封装后:
[Python] 纯文本查看 复制代码
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可以参考下面的图片:

文件位置

文件位置




再次优化方便后续解密:
[Python] 纯文本查看 复制代码
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
pwp 发表于 2023-3-19 18:43
牛逼,学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-6 04:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表