有道翻译逆向解析,为什么JS经过MD5返回类型和python经过MD5返回的类型不一样?
我参考这篇博客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)
这是源代码
比如拿这个为例子:
decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"
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的。
引用的这个在线库:
<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)是方法引用中错误的返回类型: 编码方法: