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

105 lines
2.6 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)
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))
}