game_sync/common/configencryptor.go

120 lines
3.1 KiB
Go

package common
const (
aa uint = 0x7E
bb = 0x33
cc = 0xA1
ENCRYPT_KEY1 = 0xa61fce5e // A = 0x20, B = 0xFD, C = 0x07, first = 0x1F, key = a61fce5e
ENCRYPT_KEY2 = 0x443ffc04 // A = 0x7A, B = 0xCF, C = 0xE5, first = 0x3F, key = 443ffc04
ENCRYPT_KEY3 = 0x12345678
)
var ConfigFE = &ConfigFileEncryptor{}
type ConfigFileEncryptor struct {
m_nPos1 int
m_nPos2 int
m_nPos3 int
m_cGlobalEncrypt EncryptCode
}
type EncryptCode struct {
m_bufEncrypt1 [256]uint8
m_bufEncrypt2 [256]uint8
m_bufEncrypt3 [256]uint8
}
func (this *EncryptCode) init(key1, key2, key3 uint) {
var a1, b1, c1, fst1 uint
a1 = ((key1 >> 0) & 0xFF) ^ aa
b1 = ((key1 >> 8) & 0xFF) ^ bb
c1 = ((key1 >> 24) & 0xFF) ^ cc
fst1 = (key1 >> 16) & 0xFF
var a2, b2, c2, fst2 uint
a2 = ((key2 >> 0) & 0xFF) ^ aa
b2 = ((key2 >> 8) & 0xFF) ^ bb
c2 = ((key2 >> 24) & 0xFF) ^ cc
fst2 = (key2 >> 16) & 0xFF
i := 0
nCode := uint8(fst1)
for i = 0; i < 256; i++ {
this.m_bufEncrypt1[i] = nCode
nCode = (uint8(a1)*nCode*nCode + uint8(b1)*nCode + uint8(c1)) & 0xFF
}
nCode = uint8(fst2)
for i = 0; i < 256; i++ {
this.m_bufEncrypt2[i] = nCode
nCode = (uint8(a2)*nCode*nCode + uint8(b2)*nCode + uint8(c2)) & 0xFF
}
for i = 0; i < 256; i++ {
this.m_bufEncrypt3[i] = uint8(((key3 >> uint(i%4)) ^ uint(i)) & 0xff)
}
}
func (this *ConfigFileEncryptor) init(key1, key2, key3 uint) {
this.m_cGlobalEncrypt.init(key1, key2, key3)
}
func (this *ConfigFileEncryptor) IsCipherText(buf []byte) bool {
size := len(buf)
if size < 4 {
return false
}
//0x1b454e43
if buf[size-1] == 0x43 && buf[size-2] == 0x4e && buf[size-3] == 0x45 && buf[size-4] == 0x1b {
return true
}
return false
}
func (this *ConfigFileEncryptor) Encrypt(buf []byte) []byte {
size := len(buf)
oldPos1, oldPos2, oldPos3 := this.m_nPos1, this.m_nPos2, this.m_nPos3
for i := 0; i < size; i++ {
buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt1[this.m_nPos1]
buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt2[this.m_nPos2]
buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt3[this.m_nPos3]
this.m_nPos1++
if this.m_nPos1 >= 256 {
this.m_nPos1 = 0
this.m_nPos2++
if this.m_nPos2 >= 256 {
this.m_nPos2 = 0
}
}
this.m_nPos3++
if this.m_nPos3 >= 256 {
this.m_nPos3 = 0
}
}
this.m_nPos1, this.m_nPos2, this.m_nPos3 = oldPos1, oldPos2, oldPos3
buf = append(buf, 0x1b, 0x45, 0x4e, 0x43)
return buf
}
func (this *ConfigFileEncryptor) Decrtypt(buf []byte) []byte {
size := len(buf) - 4
oldPos1, oldPos2, oldPos3 := this.m_nPos1, this.m_nPos2, this.m_nPos3
for i := 0; i < size; i++ {
buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt1[this.m_nPos1]
buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt2[this.m_nPos2]
buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt3[this.m_nPos3]
this.m_nPos1++
if this.m_nPos1 >= 256 {
this.m_nPos1 = 0
this.m_nPos2++
if this.m_nPos2 >= 256 {
this.m_nPos2 = 0
}
}
this.m_nPos3++
if this.m_nPos3 >= 256 {
this.m_nPos3 = 0
}
}
this.m_nPos1, this.m_nPos2, this.m_nPos3 = oldPos1, oldPos2, oldPos3
return buf[:size]
}
func init() {
ConfigFE.init(ENCRYPT_KEY1, ENCRYPT_KEY2, ENCRYPT_KEY3)
}