125 lines
3.2 KiB
Go
125 lines
3.2 KiB
Go
|
package cdkey
|
|||
|
|
|||
|
/*
|
|||
|
* 奖励码模块,从神魔大陆java代码移植过来的
|
|||
|
*/
|
|||
|
|
|||
|
func GenerateAll(batch int, totalCount int) []string {
|
|||
|
keyList := make([]string, 0, totalCount)
|
|||
|
for i := 0; i < totalCount; i++ {
|
|||
|
codeKey := GenerateOne(batch, totalCount, i)
|
|||
|
keyList = append(keyList, codeKey)
|
|||
|
}
|
|||
|
return keyList
|
|||
|
}
|
|||
|
|
|||
|
func GenerateOne(batch int, totalCount int, curNo int) string {
|
|||
|
base := MAXNUM / totalCount
|
|||
|
numId := curNo
|
|||
|
num := base + numId*base
|
|||
|
mainKeyBitSet := newBitmap(MAIN_KEY_LENGTH, 0)
|
|||
|
numKeyIndex := int((num + batch) % NUM_KEY_LENGTH_BINARY)
|
|||
|
temp := newEncode(int64(num), numKeyIndex)
|
|||
|
for i := 0; i < MAIN_KEY_NUM_LENGTH; i++ {
|
|||
|
mainKeyBitSet.Set(i, (temp&1) == 1)
|
|||
|
temp >>= 1
|
|||
|
}
|
|||
|
for i := 0; i < NUM_KEY_LENGTH; i++ {
|
|||
|
mainKeyBitSet.Set(i+MAIN_KEY_NUM_LENGTH, toNumBitSet[numKeyIndex].Get(i))
|
|||
|
}
|
|||
|
|
|||
|
var beCheckNum int64
|
|||
|
if mainKeyBitSet.toInt64() > 0 {
|
|||
|
beCheckNum = mainKeyBitSet.toInt64()
|
|||
|
} else {
|
|||
|
beCheckNum = -mainKeyBitSet.toInt64()
|
|||
|
}
|
|||
|
checkNum := int32(beCheckNum % 32)
|
|||
|
checkNumBitSet := toBitSet32[checkNum]
|
|||
|
for i := 0; i < CHECK_LENGTH; i++ {
|
|||
|
mainKeyBitSet.Set(i+MAIN_KEY_NUM_LENGTH+NUM_KEY_LENGTH, checkNumBitSet.Get(i))
|
|||
|
}
|
|||
|
batchBitSet := newBitmap(BATCH_LENGTH, 0)
|
|||
|
temp = int64(batch)
|
|||
|
for i := 0; i < BATCH_LENGTH; i++ {
|
|||
|
batchBitSet.Set(i, (temp&1) == 1)
|
|||
|
temp >>= 1
|
|||
|
}
|
|||
|
batchKeyIndex := (num + batch) % BATCH_KEY_LENGTH_BINARY
|
|||
|
batchStr := base32Encode(fakeRC4Encode(batchBitSet, batchKey[batchKeyIndex]))
|
|||
|
temp1 := fakeRC4Encode(mainKeyBitSet, getMainKey(batchBitSet))
|
|||
|
mainKeyStr := base32Encode(temp1)
|
|||
|
|
|||
|
cdKeyType := 1
|
|||
|
typeIndex := (num + cdKeyType) % TYPE_LENGTH_BINARY
|
|||
|
|
|||
|
codeKey := mainKeyStr + batchStr + string(toBase32[batchKeyIndex]) + string(toBase32[typeIndex])
|
|||
|
return shuffleCDKey(codeKey, batchKeyIndex)
|
|||
|
}
|
|||
|
|
|||
|
type CDKeyInfo struct {
|
|||
|
Batch int
|
|||
|
Num int64
|
|||
|
}
|
|||
|
|
|||
|
func DecodeCDKey(cdKey string) (*CDKeyInfo, bool) {
|
|||
|
if len(cdKey) != CDKEY_LENGTH {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
index := toBase32CToI[rune(cdKey[SHUFFLE_INDEX])]
|
|||
|
cdKey1 := recoverCDKey(cdKey[0:SHUFFLE_INDEX], index)
|
|||
|
if cdKey1 == "" {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
typeCheck, find := toBase32CToI[rune(cdKey1[TYPE_INDEX])]
|
|||
|
if !find {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
batchKeyIndex, find := toBase32CToI[rune(cdKey1[BATCH_NUM_BEGIN])]
|
|||
|
if !find {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
if !(batchKeyIndex == index) {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
batch := base32Decode(cdKey1[BATCH_BEGIN:BATCH_END])
|
|||
|
if batch == nil {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
batchBitSet := fakeRC4Encode(batch, batchKey[batchKeyIndex])
|
|||
|
if batchBitSet == nil {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
mainKey := base32Decode(cdKey1[MAIN_KEY_BEGIN:MAIN_KEY_END])
|
|||
|
if mainKey == nil {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
mainKey2 := getMainKey(batchBitSet)
|
|||
|
if mainKey2 == nil {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
mainKeyBitSet := fakeRC4Encode(mainKey, mainKey2)
|
|||
|
if mainKeyBitSet == nil {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
if !(check(mainKeyBitSet)) {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
numKeyIndex := getNumKeyIndex(mainKeyBitSet)
|
|||
|
numInt := numEncode(mainKeyBitSet.toInt64()&intFormat, numKeyIndex)
|
|||
|
batchInt := int(batchBitSet.toInt64() & intFormat)
|
|||
|
if !(checkIndex(numInt, batchInt, batchKeyIndex, numKeyIndex)) {
|
|||
|
return nil, false
|
|||
|
}
|
|||
|
|
|||
|
cdkeyInfo := &CDKeyInfo{
|
|||
|
Batch: batchInt,
|
|||
|
Num: numInt,
|
|||
|
// Type: typeCheck,
|
|||
|
}
|
|||
|
if typeCheck > 0 {
|
|||
|
|
|||
|
}
|
|||
|
return cdkeyInfo, true
|
|||
|
}
|