45 lines
1.0 KiB
Go
45 lines
1.0 KiB
Go
package feishu
|
|
|
|
import (
|
|
"crypto/aes"
|
|
"crypto/cipher"
|
|
"crypto/sha256"
|
|
"encoding/base64"
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// 解密事件消息
|
|
func DecryptFeiShuWebhookMsg(encryptData string, encryptKey string) ([]byte, error) {
|
|
buf, err := base64.StdEncoding.DecodeString(encryptData)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("base64StdEncode Error[%v]", err)
|
|
}
|
|
if len(buf) < aes.BlockSize {
|
|
return nil, errors.New("cipher too short")
|
|
}
|
|
keyBs := sha256.Sum256([]byte(encryptKey))
|
|
block, err := aes.NewCipher(keyBs[:sha256.Size])
|
|
if err != nil {
|
|
return nil, fmt.Errorf("AESNewCipher Error[%v]", err)
|
|
}
|
|
iv := buf[:aes.BlockSize]
|
|
buf = buf[aes.BlockSize:]
|
|
// CBC mode always works in whole blocks.
|
|
if len(buf)%aes.BlockSize != 0 {
|
|
return nil, errors.New("ciphertext is not a multiple of the block size")
|
|
}
|
|
mode := cipher.NewCBCDecrypter(block, iv)
|
|
mode.CryptBlocks(buf, buf)
|
|
n := strings.Index(string(buf), "{")
|
|
if n == -1 {
|
|
n = 0
|
|
}
|
|
m := strings.LastIndex(string(buf), "}")
|
|
if m == -1 {
|
|
m = len(buf) - 1
|
|
}
|
|
return buf[n : m+1], nil
|
|
}
|