Files
wechat_ipad_pro/clientsdk/android/wcaes.go
2026-02-17 13:06:23 +08:00

267 lines
5.8 KiB
Go

package android
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/hex"
)
var Sea06_Data, _ = hex.DecodeString(SeaDatIpad)
var Sea01_Data, _ = hex.DecodeString(SeaDatAndroid)
//////////////////////////////////////////////// sae06加密 /////////////////////////////////////////////////////
func SaeEncrypt06(data []byte) []byte {
sae := Sea06_Data
in_bytes := data
in_len := len(data)
xor := sae[9:25]
input_val := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
output_val := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
var result []byte
for i := 0; i < in_len/16; i++ {
for j := 0; j < 16; j++ {
input_val[j] = xor[j] ^ in_bytes[i*16+j]
}
output_val = DoEncryptInput(input_val, sae)
xor = output_val
result = BytesCombine1(result, output_val)
input_val = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
output_val = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
}
return result
}
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
// todo
// new sae 白盒aes加密
func SaeEncrypt07(data []byte) []byte {
var key, iv []byte
key, _ = hex.DecodeString("24E545FC309F1CC92B0223FAFA8C84F4")
iv, _ = hex.DecodeString("6d1f24b8e29268d6efbf55cafb27d3bf")
block, err := aes.NewCipher(key)
if err != nil {
return nil
}
blockMode := cipher.NewCBCEncrypter(block, iv)
src := PKCS7Padding(data, block.BlockSize())
origData := make([]byte, len(src))
blockMode.CryptBlocks(origData, src)
return origData
}
func SaeEncrypt01(data []byte) []byte {
sae := Sea01_Data
in_bytes := data
in_len := len(data)
xor := sae[9:25]
input_val := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
output_val := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
var result []byte
for i := 0; i < int(in_len/16); i++ {
for j := 0; j < 16; j++ {
input_val[j] = xor[j] ^ in_bytes[i*16+j]
}
output_val = DoEncryptInput(input_val, sae)
xor = output_val
result = BytesCombine1(result, output_val)
input_val = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
output_val = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
}
return result
}
func DoEncryptInput(input_val, sae_val []byte) []byte {
in_p := input_val
output := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
for i := 0; i < 4; i++ {
for j := 0; j < 4; j++ {
output[i*4+j] = in_p[j*4+i]
}
}
pos := -0x24000
sae_pos := 0x82030
for {
output = LeftShift(output, 4, 1)
output = LeftShift(output, 8, 2)
output = LeftShift(output, 12, 3)
if pos < 0 {
buf := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
buf = Sub106c03420(buf, output, sae_val[0x43030+pos:])
output = Sub106c036a8(output, buf, sae_val[sae_pos-0x3f000:])
sae_pos = sae_pos + 0x3000
pos = pos + 0x4000
continue
}
break
}
result := Sub106c0397c(output, sae_val[0xbc030:])
result_p := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
for i := 0; i < 0x10; i++ {
result_p[i] = result[int(i/4)+int((i%4)*4)]
}
return result_p
}
func LeftShift(data []byte, offset, distance int) []byte {
/*左轮转
:param data: 需要被轮转的数据
:param offset: 偏移量
:param distance: 轮转距离
:return 轮转结果*/
for i := 0; i < distance; i++ {
tmp := data[offset]
data[offset] = data[1+offset]
data[1+offset] = data[2+offset]
data[2+offset] = data[3+offset]
data[3+offset] = tmp
}
return data
}
func Sub106c03420(buf, data, sae []byte) []byte {
//sae06字典加密
v3 := 0
buf_pos := 0
sae_pos := 0
for {
if v3 == 4 {
break
}
v4 := 0
v5 := buf_pos
v6 := sae_pos
for {
if v4 == 4 {
break
}
v7 := 0
v8 := v6
for {
if v7 == 0x40 {
break
}
buf[v5+v7] = sae[v8+4*int(data[4*v3+v4])] //根据data序列查字典, 结果放入buf
v8 = v8 + 1
v7 = v7 + 0x10
}
v4 = v4 + 1
v6 = v6 + 0x400
v5 = v5 + 4
}
v3 = v3 + 1
sae_pos = sae_pos + 0x1000
buf_pos = buf_pos + 1
}
return buf
}
func Sub106c036a8(data, buf, sae []byte) []byte {
v3 := 0
v4 := 0
v5 := 0
v6 := 0x200
v7 := 0
for {
if v5 == 4 {
break
}
v8 := 0
v14 := v6
v9 := v7
for {
if v8 == 4 {
break
}
result := buf[v3+16*v5+4*v8+3]
v11 := v4 + 4*v5 + v8
data[v11] = result
v12 := v6
v13 := 2
for {
if v13 == -1 {
break
}
result = Sub106c033bc(buf[v9+v13], result, sae[v12:])
data[v11] = result
v13 = v13 - 1
v12 = v12 - 0x100
}
v8 = v8 + 1
v9 = v9 + 4
v6 = v6 + 0x300
}
v5 = v5 + 1
v7 = v7 + 0x10
v6 = v14 + 0xc00
}
return data
}
func Sub106c033bc(a1 byte, a2 byte, sae []byte) byte {
temp := 0xffffff0f
v3 := (a1 & 0xf0) | (a2 >> 4)
if v3&0x80 != 0 {
v3 = sae[(0+(v3&0x7f))] >> 4
} else {
v3 = sae[(0+v3)] & 0xf
}
v4 := ((a2 & 0xf) | 0x10*a1) & 0xff
var v5 byte
if v4&0x80 != 0 {
v5 = sae[(0+int(v4&0x7f)+0x80)] >> 4
} else {
v5 = sae[(0+int(v4&0xff)+0x80)] & 0xf
}
return (v5 & uint8(temp)) | 0x10*(v3&0xf)
}
func Sub106c0397c(output, sae []byte) []byte {
v3 := 0
v5 := 0
result := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
v4 := 0
for {
if v3 == 4 {
break
}
v6 := 0
v7 := 0
for {
if v6 == 4 {
break
}
result[v4+v6] = sae[v7+int(output[v5+v6])]
v6 = v6 + 1
v7 = v7 + 0x100
}
v3 = v3 + 1
v5 = v5 + 4
sae = sae[0x400:]
v4 = v4 + 4
}
return result
}
func BytesCombine1(pBytes ...[]byte) []byte {
length := len(pBytes)
s := make([][]byte, length)
for index := 0; index < length; index++ {
s[index] = pBytes[index]
}
sep := []byte("")
return bytes.Join(s, sep)
}