当前位置: 首页 > 知识库问答 >
问题:

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

潘辰龙
2024-03-13

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

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

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

import base64import timefrom Crypto.Cipher import AESimport requestsimport hashlibti = 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 resultheaders = {    "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)

这是源代码

共有1个答案

郏景澄
2024-03-13

比如拿这个为例子:

decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"
  • python的hash md5算法算出来的结果是:
import hashlibres = 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,并无二致。

 类似资料:
  • 我有一个任务,我们要创造一个石头,纸,剪刀的游戏。它指定我们必须创建一个抽象的“工具”类,其中有三个子类:“ToolRock”、“ToolPaper”、“ToolScissors”。抽象类应该有一个“+getFeagnet():tool”函数(用斜体写成)。 我的假设是做一个像这样的抽象函数: RockTool类被指定为具有函数“+get弱点():tool”(不是用斜体写的),我的想法是创建一个覆

  • 使用的方法引用具有返回类型。但在以下示例中允许使用不兼容。 如何使用声明方法以使方法引用类型安全而无需手动强制转换? 我尝试在没有注释处理(自动值)或编译器插件(龙目岛)的情况下实现通用构建器

  • 我读过这篇文章:java中arrays.aslist(array)与新arraylist (arrays.aslist(ia))之间的差异 当然,包装器上不允许一些列表操作,比如从列表中添加或删除元素,您只能读取或覆盖元素。 如果list2有List接口的引用,我期望它用Java实现List接口中包含的所有方法。https://docs.oracle.com/javase/7/docs/api/j

  • 问题内容: 使用的方法引用具有返回类型。但是在下面的示例中,允许不兼容。 如何解决方法声明以确保方法引用类型安全而无需手动强制转换? 用例:类型安全但通用的Builder。 我尝试实现没有注释处理(自动值)或编译器插件(lombok)的通用生成器 问题答案: 在第一个例子,并帮助解决通用参数,并以和分别。 除非您明确声明,否则它并不总是a ,这将导致编译时错误,如第二个示例所示。

  • 我正试图从使用observable转换下面的observable代码。使用可管道操作符创建到。 我已经尝试了下面的方法,但是我得到了一个转换错误,无法转换可观察的类型。看不见的。如有任何帮助,我们将不胜感激。

  • line.FlatMap(WordSutil::GetWords)是方法引用中错误的返回类型: 编码方法: