wust校园网认证登录(web + pppoe拨号)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
canti/app/codecs/encode.go

111 lines
2.8 KiB

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))
}