百度网盘md5计算方法
百度网盘公共api返回的文件md5与本地文件md5值一致,是因为百度md5对原md5进行了加工,导致下载后,本地无法通过md5比较验证文件是否完整。
发现这个算法不稳定,出现计算结果不一致,可能还有其他算法变化。
java
public static String encMd5(String md5) { String temp = md5.substring(8, 16) + md5.substring(0, 8) + md5.substring(24, 32) + md5.substring(16, 24); StringBuilder res = new StringBuilder(); char[] chars = temp.toCharArray(); for (int i = 0; i < chars.length; i++) { char c = chars[i]; res.append(Integer.toHexString(Character.digit(c, 16) ^ 15 & i)); } res.replace(9, 10, "" + (char)(Character.digit(res.charAt(9), 16) + 'g')); return res.toString(); }
py脚本,可以保存为py文件直接运行
python encode-baidu-md5.py <标准MD5>
#!/usr/bin/env python3 """Convert a standard file MD5 into Baidu Netdisk's encoded MD5 form.""" from __future__ import annotations import argparse import re MD5_PATTERN = re.compile(r"^[0-9a-fA-F]{32}$") def encode_baidu_md5(md5: str) -> str: """Apply Baidu's byte-order permutation and position-dependent hex transform.""" normalized = md5.strip().lower() if not MD5_PATTERN.fullmatch(normalized): raise ValueError("MD5 must contain exactly 32 hexadecimal characters") reordered = normalized[8:16] + normalized[0:8] + normalized[24:32] + normalized[16:24] encoded = [format(int(character, 16) ^ (15 & index), "x") for index, character in enumerate(reordered)] encoded[9] = chr(int(encoded[9], 16) + ord("g")) return "".join(encoded) def main() -> int: """Parse one MD5 argument and print only its Baidu-encoded value.""" parser = argparse.ArgumentParser(description="将标准文件 MD5 转换为百度网盘编码 MD5") parser.add_argument("md5", help="32 位十六进制文件 MD5") args = parser.parse_args() try: print(encode_baidu_md5(args.md5)) except ValueError as error: parser.error(str(error)) return 0 if __name__ == "__main__": raise SystemExit(main())
原理是
假设原始 MD5 按每 8 位分组:
A B C D
算法分三步:
- 调换分组顺序:
A B C D → B A D C
- 对第
i个十六进制字符做异或:
新值 = 原值 XOR (i & 0x0f)
位置每 16 位循环一次,因此掩码依次是:
0, 1, 2, ... f, 0, 1, 2, ... f
- 将索引
9的字符特殊编码:
0~f → g~v
posted on 2026-09-09 16:13 Lv Jianwei 阅读(6) 评论(0) 收藏 举报
浙公网安备 33010602011771号