🔧 chore: 初始化番茄小说 API 项目结构
新增项目基础框架,包含核心 API 实现、算法模块、HTTP 处理器等完整功能模块
This commit is contained in:
commit
6981148727
107 files changed
+12463
No files matched your search
@@ -0,0 +1,174 @@
|
||||
package algos
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
)
|
||||
|
||||
// Algo8404 8404加密器
|
||||
type Algo8404 struct {
|
||||
unix int64
|
||||
params string
|
||||
xSSStub string
|
||||
}
|
||||
|
||||
// NewAlgo8404 创建新的Algo8404实例
|
||||
func NewAlgo8404(params string, unix int64, xSSStub string) *Algo8404 {
|
||||
if xSSStub == "" {
|
||||
xSSStub = "00000000000000000000000000000000"
|
||||
}
|
||||
return &Algo8404{
|
||||
unix: unix,
|
||||
params: params,
|
||||
xSSStub: xSSStub,
|
||||
}
|
||||
}
|
||||
|
||||
// getXGorgon 生成X-Gorgon签名
|
||||
func (a *Algo8404) getXGorgon() string {
|
||||
timeHex := fmt.Sprintf("%x", a.unix)
|
||||
timeBin, _ := hex.DecodeString(timeHex)
|
||||
|
||||
m := md5.Sum([]byte(a.params))
|
||||
mBytes := m[:4]
|
||||
|
||||
var aaa []byte
|
||||
if a.xSSStub != "" {
|
||||
stubBytes, _ := hex.DecodeString(a.xSSStub)
|
||||
if len(stubBytes) >= 4 {
|
||||
aaa = stubBytes[:4]
|
||||
} else {
|
||||
aaa = make([]byte, 4)
|
||||
}
|
||||
} else {
|
||||
aaa = make([]byte, 4)
|
||||
}
|
||||
|
||||
// 生成随机数
|
||||
a1 := rand.Intn(256)
|
||||
a2 := rand.Intn(256)
|
||||
|
||||
// 构建数据
|
||||
data := make([]byte, 0)
|
||||
data = append(data, mBytes...)
|
||||
data = append(data, aaa...)
|
||||
data = append(data, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x04}...)
|
||||
data = append(data, timeBin...)
|
||||
|
||||
// 初始化表
|
||||
table := make([]int, 256)
|
||||
for i := 0; i < 256; i++ {
|
||||
table[i] = i
|
||||
}
|
||||
|
||||
key := []int{0x4A, 0x00, 0x16, a2, 0x47, 0x6C, 0x00, a1}
|
||||
|
||||
// 第一轮处理
|
||||
w8 := 0
|
||||
for i := 0; i < 256; i++ {
|
||||
keyI := i & 7
|
||||
w10 := key[keyI]
|
||||
w9 := w8 + table[i]
|
||||
w9 = (w9 + w10) & 0xFFFFFFFF
|
||||
w10 = w9
|
||||
w10 &= 0xFFFFFF00
|
||||
w20 := (w9 - w10) & 0xFFFFFFFF
|
||||
table[i] = table[w20]
|
||||
w8 = w20
|
||||
}
|
||||
|
||||
// 第二轮处理
|
||||
dataArr := make([]int, len(data))
|
||||
for i, b := range data {
|
||||
dataArr[i] = int(b)
|
||||
}
|
||||
|
||||
w26 := 0
|
||||
for i := 0; i < len(dataArr); i++ {
|
||||
w25 := i
|
||||
w8_ := w25 ^ 1
|
||||
w9_ := ((w25 & 1) << 1) & 2
|
||||
w8_ = (w9_ + w8_) & 0xFFFFFFFF
|
||||
x10 := w8_ & 0xFF
|
||||
|
||||
w9b := table[x10]
|
||||
w11 := (w26 ^ w9b) & 0xFFFFFFFF
|
||||
w9c := ((w26 | w9b) << 1) & 0xFFFFFFFF
|
||||
w9c = (w9c - w11) & 0xFFFFFFFF
|
||||
w26 = w9c
|
||||
x11 := w26 & 0xFF
|
||||
|
||||
w12 := table[x11]
|
||||
table[x10] = w12
|
||||
table[x11] = w12
|
||||
|
||||
w10_ := w12
|
||||
w11_ := dataArr[i]
|
||||
w13_ := w10_ | w12
|
||||
w10b := w10_ & w12
|
||||
wX10 := (w13_ + w10b) & 0xFF
|
||||
ks := table[wX10]
|
||||
|
||||
dataArr[i] = ks ^ w11_
|
||||
}
|
||||
|
||||
// 第三轮处理
|
||||
w2 := 0xFFFFFFAA
|
||||
w3 := 0x55
|
||||
w4 := 0x33
|
||||
w8_2 := (^len(dataArr)) & 0xFFFFFFFF
|
||||
|
||||
for i := 0; i < len(dataArr); i++ {
|
||||
val := dataArr[i]
|
||||
w16 := ((val >> 4) & 0x0F) | ((val & 0x0F) << 4)
|
||||
dataArr[i] = w16 & 0xFF
|
||||
|
||||
if i == len(dataArr)-1 {
|
||||
dataArr[i] = dataArr[0] ^ w16
|
||||
} else {
|
||||
w7 := dataArr[i]
|
||||
w16n := dataArr[i+1]
|
||||
w20 := w7 | w16n
|
||||
wI2 := w7 & w16n
|
||||
dataArr[i] = (w20 - wI2) & 0xFF
|
||||
}
|
||||
|
||||
w13_ := dataArr[i]
|
||||
t1 := w2 & (w13_ << 1)
|
||||
t2 := w3 & (w13_ >> 1)
|
||||
w13_ = t1 | t2
|
||||
t3 := w13_ << 2
|
||||
t4 := w4 & (w13_ >> 2)
|
||||
mix := (t3 & 0xFFFFFFCF) | t4
|
||||
high := (mix >> 4) & 0x0F
|
||||
low := mix & 0x0FFFFFFF
|
||||
mix = ((low << 4) | high) & 0xFFFFFFFF
|
||||
w13_ = mix ^ w8_2
|
||||
|
||||
dataArr[i] = w13_ & 0xFF
|
||||
}
|
||||
|
||||
// 构建输出
|
||||
output := make([]byte, 0)
|
||||
output = append(output, 0x84, 0x04)
|
||||
output = append(output, byte(a1), byte(a2))
|
||||
output = append(output, 0x00, 0x00)
|
||||
|
||||
for _, val := range dataArr {
|
||||
output = append(output, byte(val))
|
||||
}
|
||||
|
||||
return hex.EncodeToString(output)
|
||||
}
|
||||
|
||||
// GetValue 获取加密值
|
||||
func (a *Algo8404) GetValue() map[string]string {
|
||||
return map[string]string{
|
||||
"X-Gorgon": a.getXGorgon(),
|
||||
"X-Khronos": fmt.Sprintf("%d", a.unix),
|
||||
"X-SS-REQ-Ticket": fmt.Sprintf("%d", a.unix*1000),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user