11package api
22
33import (
4+ "crypto/md5"
5+ "encoding/hex"
46 "fmt"
7+ "io"
58 "strconv"
69 "strings"
710)
@@ -27,26 +30,107 @@ func BoolToStr(b bool) string {
2730 }
2831 return "0"
2932}
30- func EncryptMd5 (e string ) string {
31- if len (e ) != 32 {
32- return e
33+
34+ // EncryptMd5 百度网盘的MD5加密,会对标准的md5做一些特殊的处理
35+ func EncryptMd5 (t string ) string {
36+ // 检查长度是否为32
37+ if len (t ) != 32 {
38+ return t
39+ }
40+
41+ // 检查所有字符是否在0-9或a-f之间
42+ for _ , ch := range t {
43+ if ! ((ch >= '0' && ch <= '9' ) || (ch >= 'a' && ch <= 'f' )) {
44+ return t
45+ }
46+ }
47+
48+ // 重新排列字符串的片段
49+ r := t [8 :16 ] + t [0 :8 ] + t [24 :32 ] + t [16 :24 ]
50+ n := strings.Builder {}
51+
52+ // 对每个字符进行转换
53+ for e := 0 ; e < len (r ); e ++ {
54+ // 将十六进制字符转换为数字
55+ v , _ := strconv .ParseInt (string (r [e ]), 16 , 64 )
56+ // 执行异或操作
57+ zj := int (v ) ^ (15 & e )
58+ // 转换回十六进制字符串(小写)
59+ n .WriteString (strconv .FormatInt (int64 (zj ), 16 ))
60+ }
61+
62+ result := n .String ()
63+ // 转换第9位字符(索引9)
64+ if num , err := strconv .ParseInt (string (result [9 ]), 16 , 64 ); err == nil {
65+ replacement := string (rune (103 + num )) // 103 = 'g'的ASCII码
66+ // 替换字符串的第9个字符
67+ return result [:9 ] + replacement + result [10 :]
68+ }
69+
70+ return result
71+ }
72+ func DecryptMd5 (encrypted string ) string {
73+ // 1. 检查输入是否为有效的加密格式
74+ if len (encrypted ) != 32 {
75+ return encrypted
76+ }
77+
78+ // 检查特殊字符位置(索引9)是否在g-v范围内
79+ if encrypted [9 ] < 'g' || encrypted [9 ] > 'v' {
80+ return encrypted
3381 }
3482
35- for _ , ch := range e {
36- if ! (ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'f' ) {
37- return e
83+ // 检查其他位置是否都是十六进制字符
84+ for i , ch := range encrypted {
85+ if i == 9 {
86+ continue
87+ }
88+ if ! ((ch >= '0' && ch <= '9' ) || (ch >= 'a' && ch <= 'f' )) {
89+ return encrypted
3890 }
3991 }
4092
41- var i = e [8 :16 ] + e [0 :8 ] + e [24 :32 ] + e [16 :24 ]
93+ // 2. 恢复原始n字符串
94+ // 取出索引9的特殊字符,计算原始十六进制值
95+ originalDigit := int (encrypted [9 ] - 'g' ) // 减去'g'的偏移量
96+ n := encrypted [:9 ] + fmt .Sprintf ("%x" , originalDigit ) + encrypted [10 :]
97+
98+ // 3. 重建r字符串
99+ r := strings.Builder {}
100+ for e := 0 ; e < len (n ); e ++ {
101+ // 将十六进制字符转换为数字
102+ v , _ := strconv .ParseInt (string (n [e ]), 16 , 64 )
103+ // 反转异或操作
104+ original := int (v ) ^ (15 & e )
105+ r .WriteString (fmt .Sprintf ("%x" , original ))
106+ }
107+ rStr := r .String ()
42108
43- r := ""
44- for o := 0 ; o < len (i ); o ++ {
45- digit , _ := strconv .ParseInt (string (i [o ]), 16 , 0 )
46- r += strconv .FormatInt (digit ^ (int64 (o ))& 15 , 16 )
109+ // 4. 重新排列字符串片段恢复原始数据
110+ if len (rStr ) != 32 {
111+ return encrypted
47112 }
48113
49- s := string ('g' + int64 (strings .Index ("0123456789abcdef" , string (r [9 ]))))
114+ // 反转排列操作
115+ return rStr [8 :16 ] + // 对应原始t[0:8]
116+ rStr [0 :8 ] + // 对应原始t[8:16]
117+ rStr [24 :32 ] + // 对应原始t[16:24]
118+ rStr [16 :24 ] // 对应原始t[24:32]
119+ }
120+ func Md5 (in io.ReadCloser , limitSize int ) (string , error ) {
121+ // 确保在函数结束时关闭 io.ReadCloser
122+ defer in .Close ()
123+
124+ // 创建一个新的 MD5 哈希对象
125+ hash := md5 .New ()
126+
127+ buffer := make ([]byte , limitSize )
128+
129+ bytesRead , err := io .ReadFull (in , buffer )
130+ if err != nil {
131+ return "" , err
132+ }
133+ hash .Write (buffer [:min (bytesRead , limitSize )])
50134
51- return r [ 0 : 9 ] + s + r [ 10 :]
135+ return hex . EncodeToString ( hash . Sum ( nil )), nil
52136}
0 commit comments