|
|
|
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)
|
|
|
|
|
|
|
|
var m, e, p, d uint
|
|
|
|
|
|
|
|
for q := 6 + 52/(n+1); q > 0; q-- {
|
|
|
|
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])
|
|
|
|
}
|
|
|
|
|
|
|
|
return magicDecode(v)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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 {
|
|
|
|
switch c - i {
|
|
|
|
case 1:
|
|
|
|
v = append(v, int(a[i]))
|
|
|
|
case 2:
|
|
|
|
v = append(v, int(a[i])|int(a[i+1])<<8)
|
|
|
|
case 3:
|
|
|
|
v = append(v, int(a[i])|int(a[i+1])<<8|int(a[i+2])<<16)
|
|
|
|
default:
|
|
|
|
v = append(v, int(a[i])|int(a[i+1])<<8|int(a[i+2])<<16|int(a[i+3])<<24)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if sizeAtLast {
|
|
|
|
return append(v, c)
|
|
|
|
} else {
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// magicDecode 跟上面的magicEncode操作效果是反过来的,但是意义不明
|
|
|
|
func magicDecode(a []int) []byte {
|
|
|
|
d := len(a)
|
|
|
|
var bytes []byte
|
|
|
|
for i := 0; i < d; i++ {
|
|
|
|
bytes = append(bytes, byte(a[i]&0xff), byte(a[i]>>8&0xff), byte(a[i]>>16&0xff), byte(a[i]>>24&0xff))
|
|
|
|
}
|
|
|
|
|
|
|
|
return bytes
|
|
|
|
}
|
|
|
|
|
|
|
|
func Checksum(challengeCode, username, hashedMd5, ip, info string) string {
|
|
|
|
str := challengeCode + username +
|
|
|
|
challengeCode + hashedMd5 +
|
|
|
|
challengeCode + "7" +
|
|
|
|
challengeCode + ip +
|
|
|
|
challengeCode + "200" +
|
|
|
|
challengeCode + "1" +
|
|
|
|
challengeCode + info
|
|
|
|
|
|
|
|
sha := sha1.New()
|
|
|
|
sha.Write([]byte(str))
|
|
|
|
|
|
|
|
return hex.EncodeToString(sha.Sum(nil))
|
|
|
|
}
|