🔧 chore: 初始化番茄小说 API 项目结构
新增项目基础框架,包含核心 API 实现、算法模块、HTTP 处理器等完整功能模块
This commit is contained in:
commit
6981148727
107 files changed
+12463
No files matched your search
@@ -0,0 +1,137 @@
|
||||
package algos
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// Gorgon Gorgon加密器
|
||||
type Gorgon struct {
|
||||
unix int64
|
||||
params string
|
||||
xSSStub string
|
||||
cookies string
|
||||
}
|
||||
|
||||
// NewGorgon 创建新的Gorgon实例
|
||||
func NewGorgon(params string, unix int64, xSSStub string, cookies string) *Gorgon {
|
||||
if xSSStub == "" {
|
||||
xSSStub = "00000000000000000000000000000000"
|
||||
}
|
||||
return &Gorgon{
|
||||
unix: unix,
|
||||
params: params,
|
||||
xSSStub: xSSStub,
|
||||
cookies: cookies,
|
||||
}
|
||||
}
|
||||
|
||||
// hash MD5哈希
|
||||
func (g *Gorgon) hash(data string) string {
|
||||
hasher := md5.New()
|
||||
hasher.Write([]byte(data))
|
||||
return hex.EncodeToString(hasher.Sum(nil))
|
||||
}
|
||||
|
||||
// getBaseString 获取基础字符串
|
||||
func (g *Gorgon) getBaseString() string {
|
||||
baseStr := g.hash(g.params)
|
||||
baseStr = baseStr + g.xSSStub
|
||||
|
||||
if g.cookies != "" {
|
||||
baseStr = baseStr + g.hash(g.cookies)
|
||||
} else {
|
||||
baseStr = baseStr + "00000000000000000000000000000000"
|
||||
}
|
||||
|
||||
return baseStr
|
||||
}
|
||||
|
||||
// rbitAlgorithm 位反转算法
|
||||
func (g *Gorgon) rbitAlgorithm(num int) int {
|
||||
result := ""
|
||||
tmpString := fmt.Sprintf("%08b", num)
|
||||
|
||||
for i := 0; i < 8; i++ {
|
||||
result = result + string(tmpString[7-i])
|
||||
}
|
||||
|
||||
val, _ := strconv.ParseInt(result, 2, 64)
|
||||
return int(val)
|
||||
}
|
||||
|
||||
// hexString 转十六进制字符串
|
||||
func (g *Gorgon) hexString(num int) string {
|
||||
tmpString := fmt.Sprintf("%x", num)
|
||||
if len(tmpString) < 2 {
|
||||
tmpString = "0" + tmpString
|
||||
}
|
||||
return tmpString
|
||||
}
|
||||
|
||||
// reverse 反转
|
||||
func (g *Gorgon) reverse(num int) int {
|
||||
tmpString := g.hexString(num)
|
||||
val, _ := strconv.ParseInt(tmpString[1:]+tmpString[:1], 16, 64)
|
||||
return int(val)
|
||||
}
|
||||
|
||||
// encrypt 加密
|
||||
func (g *Gorgon) encrypt(data string) map[string]string {
|
||||
length := 0x14
|
||||
key := []int{
|
||||
0xDF, 0x77, 0xB9, 0x40, 0xB9, 0x9B, 0x84, 0x83,
|
||||
0xD1, 0xB9, 0xCB, 0xD1, 0xF7, 0xC2, 0xB9, 0x85,
|
||||
0xC3, 0xD0, 0xFB, 0xC3,
|
||||
}
|
||||
|
||||
paramList := make([]int, 0)
|
||||
for i := 0; i < 12; i += 4 {
|
||||
temp := data[8*i : 8*(i+1)]
|
||||
for j := 0; j < 4; j++ {
|
||||
val, _ := strconv.ParseInt(temp[j*2:(j+1)*2], 16, 64)
|
||||
paramList = append(paramList, int(val))
|
||||
}
|
||||
}
|
||||
|
||||
paramList = append(paramList, 0x0, 0x6, 0xB, 0x1C)
|
||||
|
||||
H := int(g.unix)
|
||||
paramList = append(paramList, (H&0xFF000000)>>24)
|
||||
paramList = append(paramList, (H&0x00FF0000)>>16)
|
||||
paramList = append(paramList, (H&0x0000FF00)>>8)
|
||||
paramList = append(paramList, (H&0x000000FF)>>0)
|
||||
|
||||
eorResultList := make([]int, len(paramList))
|
||||
for i, val := range paramList {
|
||||
eorResultList[i] = val ^ key[i]
|
||||
}
|
||||
|
||||
for i := 0; i < length; i++ {
|
||||
C := g.reverse(eorResultList[i])
|
||||
D := eorResultList[(i+1)%length]
|
||||
E := C ^ D
|
||||
F := g.rbitAlgorithm(E)
|
||||
H := ((F ^ 0xFFFFFFFF) ^ length) & 0xFF
|
||||
eorResultList[i] = H
|
||||
}
|
||||
|
||||
result := ""
|
||||
for _, param := range eorResultList {
|
||||
result += g.hexString(param)
|
||||
}
|
||||
|
||||
return map[string]string{
|
||||
"x-ss-req-ticket": strconv.FormatInt(g.unix*1000, 10),
|
||||
"x-khronos": strconv.FormatInt(g.unix, 10),
|
||||
"x-gorgon": fmt.Sprintf("0404b0d30000%s", result),
|
||||
}
|
||||
}
|
||||
|
||||
// GetValue 获取加密值
|
||||
func (g *Gorgon) GetValue() map[string]string {
|
||||
return g.encrypt(g.getBaseString())
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user