55 lines
1.6 KiB
Go
55 lines
1.6 KiB
Go
package util
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"errors"
|
|
)
|
|
|
|
//// getDeterministicSalt 根据字符串内容生成确定性 salt(范围 0~255)
|
|
//func getDeterministicSalt(text string) byte {
|
|
// var sum int
|
|
// for i := 0; i < len(text); i++ {
|
|
// sum = (sum + int(text[i])*(i+1)) & 0xFF
|
|
// }
|
|
// return byte(sum)
|
|
//}
|
|
|
|
//// EncryptTokenHex 按照确定性 salt + 异或规则生成十六进制 token
|
|
//// 规则:首字节为 salt;其余字节为 char ^ key ^ ((salt + idx) & 0xFF)
|
|
//func EncryptTokenHex(text string, key byte) string {
|
|
// salt := getDeterministicSalt(text)
|
|
// // 预分配:2个hex字符的salt + 每个字符2个hex
|
|
// out := make([]byte, 0, 2+len(text)*2)
|
|
// // 写入salt
|
|
// out = append(out, []byte(hex.EncodeToString([]byte{salt}))...)
|
|
// // 写入加密数据
|
|
// for i := 0; i < len(text); i++ {
|
|
// b := text[i] ^ key ^ byte((int(salt)+i)&0xFF)
|
|
// enc := make([]byte, 2)
|
|
// hex.Encode(enc, []byte{b})
|
|
// out = append(out, enc...)
|
|
// }
|
|
// return string(out)
|
|
//}
|
|
|
|
// DecryptTokenHex 解析十六进制 token 为原始字符串
|
|
// 规则:首字节为salt;后续字节与 key ^ ((salt + idx) & 0xFF) 异或
|
|
func DecryptTokenHex(enc string, key byte) (string, error) {
|
|
if enc == "" {
|
|
return "", errors.New("empty token")
|
|
}
|
|
bs, err := hex.DecodeString(enc)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if len(bs) < 1 {
|
|
return "", errors.New("invalid token length")
|
|
}
|
|
salt := bs[0]
|
|
out := make([]byte, len(bs)-1)
|
|
for i := 1; i < len(bs); i++ {
|
|
out[i-1] = bs[i] ^ key ^ byte((int(salt)+i-1)&0xFF)
|
|
}
|
|
return string(out), nil
|
|
}
|