百度网盘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

算法分三步:

  1. 调换分组顺序:
A B C D → B A D C
  1. 对第 i 个十六进制字符做异或:
新值 = 原值 XOR (i & 0x0f)

位置每 16 位循环一次,因此掩码依次是:

0, 1, 2, ... f, 0, 1, 2, ... f
  1. 将索引 9 的字符特殊编码:
0~f → g~v

posted on 2026-09-09 16:13  Lv Jianwei  阅读(6)  评论(0)    收藏  举报