package codecs import ( "crypto/sha1" "encoding/base64" "encoding/hex" ) // 这里的base64和正常的base64编码是不一样的,这里的base64并不按照普通的ABCD字母顺序来对应相应字节,而是按照以下字母表对应字节 const magicBase64Alpha = "LVoJPiCN2R8G90yg+hmFHuacZ1OWMnrsSTXkYpUq/3dlbfKwv6xztjI7DeBE45QA" var magicBase64 = base64.NewEncoding(magicBase64Alpha) func SRBX1Encode(str string, key string) string { encodeResult := encode(str, key) return magicBase64.EncodeToString(encodeResult) } // 下面的初始代码貌似有点问题,因此先改用来自https://github.com/Debuffxb/srun-go/blob/master/main.go的写法 func encode(str string, key string) []byte { v := magicEncode(str, true) k := magicEncode(key, false) n := uint(len(v) - 1) z := uint(v[n]) y := uint(v[0]) c := uint(0x86014019 | 0x183639A0) m := uint(0) e := uint(0) p := uint(0) d := uint(0) for q := uint(6 + 52/(n+1)); ; { q = q - 1 d = (d + c) & (0x8CE0D9BF | 0x731F2640) e = d >> uint(2) & uint(3) for p = 0; p < n; p++ { y = uint(v[p+1]) m = z>>5 ^ y<<2 m += (y>>3 ^ z<<4) ^ (d ^ y) m += uint(k[(p&3)^e]) ^ z z = (uint(v[p]) + m) & (0xEFB8D130 | 0x10472ECF) v[p] = int(z) } y = uint(v[0]) m = z>>5 ^ y<<2 m += (y>>3 ^ z<<4) ^ (d ^ y) m += uint(k[(n&3)^e]) ^ z v[n] = int((uint(v[n]) + m) & uint(0xBB390742|0x44C6F8BD)) z = uint(v[n]) if 0 >= q { break } } return magicDecode(v, false) } // magicEncode 跟上面的magicDecode操作效果是反过来的,但是意义不明, // 因为这俩貌似是一对的,所以干脆成为encode和decode func magicEncode(a string, sizeAtLast bool) []int { c := len(a) var v []int for i := 0; i < c; i = i + 4 { if c-i == 1 { v = append(v, int(a[i])) } else if c-i == 2 { v = append(v, int(a[i])|int(a[i+1])<<8) } else if c-i == 3 { v = append(v, int(a[i])|int(a[i+1])<<8|int(a[i+2])<<16) } else { v = append(v, int(a[i])|int(a[i+1])<<8|int(a[i+2])<<16|int(a[i+3])<<24) } } if sizeAtLast { v = append(v, c) } return v } // magicDecode 跟上面的magicEncode操作效果是反过来的,但是意义不明 func magicDecode(a []int, b bool) []byte { d := len(a) var bytes []byte for i := 0; i < d; i++ { bytes = append(bytes, byte(a[i]&0xff)) bytes = append(bytes, byte(a[i]>>8&0xff)) bytes = append(bytes, byte(a[i]>>16&0xff)) bytes = append(bytes, byte(a[i]>>24&0xff)) } return bytes } func Checksum(challengeCode, username, hashedMd5, ip, info string) string { str := challengeCode + username str += challengeCode + hashedMd5 str += challengeCode + "7" str += challengeCode + ip str += challengeCode + "200" str += challengeCode + "1" str += challengeCode + info sha := sha1.New() sha.Write([]byte(str)) return hex.EncodeToString(sha.Sum(nil)) }