120 lines
3.1 KiB
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)
|
|
}
|