有道翻译逆向解析,为什么JS经过MD5返回类型和python经过MD5返回的类型不一样?

有道翻译逆向解析,为什么JS经过MD5返回类型和python经过MD5返回的类型不一样?
图片.png

我参考这篇博客https://blog.csdn.net/m0_73689941/article/details/133975299 练习逆向,为什么密钥和偏移量MD5加密后在python运行结果和js运行结果不一样?

这是为啥呢? python用的看着像十六进制组合,但是又不完全是,JS用的是数字数组表示。为啥会有这种区别?

import base64
import time
from Crypto.Cipher import AES
import requests
import hashlib

ti = str(int(time.time() * 1000))

# sign值加密
def sign():
    str_md5 = f'client=fanyideskweb&mysticTime={str(ti)}&product=webfanyi&key=fsdsogkndfokasodnaso'
    sign = hashlib.md5(str_md5.encode("utf-8")).hexdigest()
    return sign

# 返回值解密
def result(text_AES):
    #   偏移量
    decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"
    # 秘钥
    decodekey = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl"
    # 先把密匙和偏移量进行md5加密 digest()是返回二进制的值
    key = hashlib.md5(decodekey.encode(encoding='utf-8')).digest()
    iv = hashlib.md5(decodeiv.encode(encoding='utf-8')).digest()
    # AES解密 CBC模式解密
    aes_en = AES.new(key, AES.MODE_CBC, iv)
    # 将已经加密的数据放进该方法
    data_new = base64.urlsafe_b64decode(text_AES)
    # 参数准备完毕后,进行解密
    result = aes_en.decrypt(data_new).decode('utf-8')
    return result


headers = {
    "Origin": "https://fanyi.youdao.com",
    "Referer": "https://fanyi.youdao.com/",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.61",
    'Host':'dict.youdao.com',
    'cookie':'OUTFOX_SEARCH_USER_ID=-2034389685@10.110.96.157; OUTFOX_SEARCH_USER_ID_NCOO=1994625046.2245197',
}

# 语言字典
dic_code = {0: '自动识别', 'code0': 'auto', 1: '阿拉伯文', 'code1': 'ar', 2: '冰岛文', 'code2': 'is', 3: '波兰文', 'code3': 'pl', 4: '德文', 'code4': 'de', 5: '俄文', 'code5': 'ru', 6: '法文', 'code6': 'fr', 7: '芬兰文', 'code7': 'fi', 8: '弗里西文', 'code8': 'fy', 9: '菲律宾文', 'code9': 'tl', 10: '韩文', 'code10': 'ko', 11: '荷兰文', 'code11': 'nl', 12: '蒙古文', 'code12': 'mn', 13: '缅甸文', 'code13': 'my', 14: '尼泊尔文', 'code14': 'ne', 15: '挪威文', 'code15': 'no', 16: '葡萄牙文', 'code16': 'pt', 17: '日文', 'code17': 'ja', 18: '瑞典文', 'code18': 'sv', 19: '世界文', 'code19': 'eo', 20: '土耳其文', 'code20': 'tr', 21: '乌克兰文', 'code21': 'uk', 22: '西班牙文', 'code22': 'es', 23: '希腊文', 'code23': 'el', 24: '夏威夷文', 'code24': 'haw', 25: '英文', 'code25': 'en', 26: '意大利文', 'code26': 'it', 27: '中文', 'code27': 'zh-CHS'}

# 获取输入语言
def get_from():
    print('选择数字,输入为什么语言:')
    # 判断是否报错
    try:
        from_data = int(input(f'{dic_code}:'))
        code_from = dic_code.get(f"code{from_data}")
        if code_from == None:
            get_from()
        print(f'输入为{dic_code.get(from_data)}')
        return code_from
    # 报错函数回调
    except:
        get_from()
# 翻译成语言
def get_to():
    print('选择数字,翻译成什么语言:')
    try:
        from_data = int(input(f'{dic_code}:'))
        code_from = dic_code.get(f"code{from_data}")
        if code_from == None:
            get_from()
        print(f'翻译为为{dic_code.get(from_data)}')
        return code_from
    except:
        get_from()

get_from1 = get_from()
# 判断是不是选择了自动选择
if get_from1 == 'auto':
    to = ''
else:
    to = get_to()

word = input('请输入语句')

data = {
    "i": word ,
    "from": str(get_from1),
    "to": str(to),
    "domain": "0",
    "dictResult": "true",
    "keyid": "webfanyi",
    "sign":sign(),
    "client": "fanyideskweb",
    "product": "webfanyi",
    "appVersion": "1.0.0",
    "vendor": "web",
    "pointParam": "client,mysticTime,product",
    "mysticTime": str(ti),
    "keyfrom": "fanyi.web",
    "mid": "1",
    "screen": "1",
    "model": "1",
    "network": "wifi",
    "abtest": "0",
    "yduuid": "abcdefg"
}
url = "https://dict.youdao.com/webtranslate"

response = requests.post(url, headers=headers,data=data )
print(response)
print(response.text)

result1 = result(response.text)
print(result1)

这是源代码

阅读 554
1 个回答

比如拿这个为例子:

decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"
  • python的hash md5算法算出来的结果是:
import hashlib

res = hashlib.md5(decodeiv.encode('utf-8')).digest()
# b'\xd2\xbb\x1b\xfd\xe8;8\xc3D6cW\xb7\x9c\xae\x1c'

# 然后再进一步转换为16进制字符串
s_16 = res.hex()    # 'd2bb1bfde83b38c344366357b79cae1c'

这里python的你可以进一步转化,不然字节形式的那个看着挺麻烦,不好比较python和js的。

  • 你js的代码不知道怎么做md5的,我用了我的方式:

引用的这个在线库:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
// 要进行哈希的字符串
const decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4";

// 对字符串进行 MD5 哈希
const result = CryptoJS.MD5(decodeiv);

// 输出哈希后的字符串
console.log(result.toString(), "-------------");
// d2bb1bfde83b38c344366357b79cae1c -------------

可以看到二者的md5输出字符串是一样的啊。都是 d2bb1bfde83b38c344366357b79cae1c,并无二致。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏