精易论坛

标题: 这段py代码怎么转换到易语言 [打印本页]

作者: 流年浮生    时间: 2025-4-22 13:58
标题: 这段py代码怎么转换到易语言
这段py代码怎么转换到易语言,求好心人告知
  
import base64
import urllib.parse
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

def decrypt (url, text):
"""
使用 AES CBC 模式解密数据

:param url: 用于生成密钥和 IV 的字符串,一般是接口地址
:param text: 加密后的密文
:return: 解密后的明文
"""
if not isinstance (url, str):
return None

# 内部函数:生成 base64 编码并重复三次
def generate_key_iv (s):
# URI 编码后 base64 编码
encoded = base64.b64encode (urllib.parse.quote (s).encode ()).decode ()
return (encoded * 3)

# 生成密钥和初始向量
str_repeated = generate_key_iv (url)

# 从重复后的字符串中截取 key 和 iv
org_key = str_repeated[:16]     # 前 16 字符作为密钥
org_iv = str_repeated[12:28]    # 第 12~28 字符作为初始向量(IV)

# 解密
try:
# 将密文从 base64 解码
cipher_text = base64.b64decode (text)

# 创建解密器
cipher = AES.new (
key=org_key.encode ( ' utf-8'),
mode=AES.MODE_CBC,
iv=org_iv.encode ( ' utf-8')
)

# 解密并去除填充
decrypted = unpad (cipher.decrypt (cipher_text), AES.block_size)

# 转换为字符串
return decrypted.decode ( ' utf-8')

except Exception as e:
print (f"Decryption error: {e}")
return None

# 示例调用
if __name__ == "__main__":
url = ' /api/rank/author/fans/increment'
data = ' pNgodwr8Bn+1lFcoCpk5NVt/gN+gQwnu8gW0sZiShqJnc2VNtCkVUn/MOWLKWOFG+AXPxIkUlwx/RyCNVMF10JkBHELqU2sFdbLV0uMZ/kV/XSDjX7qo6xfoMEt530H+3YZFt0Nx19zv4jV4EujYCjKtI98bcVpdwM2ZX9d9b5XNChZNYIFYDErUd+aM2LpXOtkZd78BpIAF+M5syOlAHyGrdavUnvKUUIG5w5U44dNLhaPqTPrECZpOtMCIi8XP8Mxv8K1jhSE6Q6efMUCC2cv2QA0xEL3QDUB2jK2O'
print (decrypt (url, data))


作者: 果心豆腐酱    时间: 2025-4-22 13:58
代码,很简单,问题出在你的原始密文。本身是错的。
py里运行,就已经报错了Data must be padded to 16 byte boundary in CBC mode
你用这个密文在易语言里运行,肯定,也是错的

话说,这个问题,我咋感觉有点眼熟呢

aes加解密.e

183.44 KB, 下载次数: 2


作者: 菜鸟路过    时间: 2025-4-22 14:00
直接调用e2ee 的加解密对象命令
作者: 流年浮生    时间: 2025-4-22 14:03
菜鸟路过 发表于 2025-4-22 14:00
直接调用e2ee 的加解密对象命令

大哥能给个例子吗
作者: z13228604287    时间: 2025-4-22 14:08
这个需要库  实现  这个py并非源码
而是调用库的方法
作者: lao3    时间: 2025-4-22 14:13

我记得~

https://125.confly.eu.org/forum.php?mod ... 14852344&extra=
作者: 清壹    时间: 2025-4-22 14:17
可以问 豆包
作者: 流年浮生    时间: 2025-4-22 14:31
lao3 发表于 2025-4-22 14:13
我记得~

https://125.confly.eu.org/forum.php?mod=viewthread&tid=14852344&extra=

就是这个~我去验证了一下,发现返回空
作者: mosheng    时间: 2025-4-22 14:32
100精币不少了,如果是RMB我愿意帮写
作者: lao3    时间: 2025-4-22 14:49
流年浮生 发表于 2025-4-22 14:31
就是这个~我去验证了一下,发现返回空

你的python代码也解不了啊,报错了~

检查下密文密钥是否匹配吧~
作者: 流年浮生    时间: 2025-4-22 14:51
lao3 发表于 2025-4-22 14:49
你的python代码也解不了啊,报错了~

检查下密文密钥是否匹配吧~

这是我在网上找的:https://blog.csdn.net/yuanbang_bc/article/details/146519688,您看一下
作者: lao3    时间: 2025-4-22 15:04
流年浮生 发表于 2025-4-22 14:51
这是我在网上找的:https://blog.csdn.net/yuanbang_bc/article/details/146519688,您看一下 ...

他的密文可以解啊~你这密文哪个请求的?
作者: 流年浮生    时间: 2025-4-22 15:09
lao3 发表于 2025-4-22 15:04
他的密文可以解啊~你这密文哪个请求的?

就是这个,您有时间能帮忙写个易语言例子吗?
作者: lao3    时间: 2025-4-22 15:22
流年浮生 发表于 2025-4-22 15:09
就是这个,您有时间能帮忙写个易语言例子吗?

这不是写不写的问题, 前面的代码应该是没啥问题,

你提供的数据在考古加那都解不了~

你贴个完整抓包内容吧
作者: w409608911    时间: 2025-4-22 17:59

大概就是这个样子没有验证过要用一个”支持库 eAPI”我没有这个东西所以没验证

.版本 2
.支持库 spec
.支持库 eAPI

.子程序 Decrypt, 文本型, 公开, 使用 AES CBC 模式解密数据
    .参数 url, 文本型, , 用于生成密钥和 IV 的字符串,一般是接口地址
    .参数 text, 文本型, , 加密后的密文
    .局部变量 str_repeated, 文本型
    .局部变量 org_key, 文本型
    .局部变量 org_iv, 文本型
    .局部变量 cipher_text, 字节集
    .局部变量 decrypted, 字节集
    .局部变量 result, 文本型
    .局部变量 errorMsg, 文本型

    ' 检查 url 是否为字符串类型
    如果 (取数据类型 (url) ≠ #文本型) 那么
        返回 (“”)
    结束如果

    ' 内部函数:生成 base64 编码并重复三次
    .子程序 generate_key_iv, 文本型
        .参数 s, 文本型
        .局部变量 encoded, 文本型
        ' URI 编码后 base64 编码
        encoded = 编码_base64 (编码_URL (s))
        返回 (encoded + encoded + encoded)
    结束子程序

    ' 生成密钥和初始向量
    str_repeated = generate_key_iv (url)

    ' 从重复后的字符串中截取 key 和 iv
    org_key = 取文本中间 (str_repeated, 1, 16)  '前 16 字符作为密钥
    org_iv = 取文本中间 (str_repeated, 12, 16)  '第 12~28 字符作为初始向量(IV)

    ' 解密
    尝试
        '将密文从 base64 解码
        cipher_text = 编码_base64 (text, 真)

        ' 创建解密器(这里使用系统 API 进行 AES CBC 解密,示例代码,可能需要进一步完善)
        decrypted = AES_CBC_Decrypt (cipher_text, 到字节集 (org_key), 到字节集 (org_iv))

        ' 去除填充(简单示例,实际可能需要更完善的处理)
        decrypted = 去除填充 (decrypted, 16)

        ' 转换为字符串
        result = 到文本 (decrypted)
        返回 (result)
    捕获异常 (errorMsg)
        调试输出 (“Decryption error: ” + errorMsg)
        返回 (“”)
    结束尝试
结束子程序

.子程序 AES_CBC_Decrypt, 字节集, 公开, AES CBC 模式解密,示例代码,可能需要进一步完善
    .参数 密文, 字节集
    .参数 密钥, 字节集
    .参数 初始向量, 字节集
    ' 这里只是简单示例,实际使用中需要调用 Windows 系统的加密 API 实现 AES CBC 解密
    ' 例如使用 CryptEncrypt 和 CryptDecrypt 等函数,具体实现较为复杂
    返回 ({})
结束子程序

.子程序 去除填充, 字节集, 公开, 简单的去除填充示例,实际可能需要更完善的处理
    .参数 数据, 字节集
    .参数 块大小, 整数型
    .局部变量 填充长度, 整数型
    填充长度 = 取字节集尾 (数据, 1)[1]
    返回 (删去字节集尾 (数据, 填充长度))
结束子程序

.子程序 编码_URL, 文本型, 公开, 模拟 Python 的 urllib.parse.quote 功能
    .参数 文本, 文本型
    ' 这里简单示例,实际可能需要更完善的 URL 编码处理
    返回 (文本)
结束子程序






欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4