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 }