From 6ec06c28130bc2fc6364596048162604496ec0c7 Mon Sep 17 00:00:00 2001 From: "david.yan" Date: Sun, 6 Apr 2025 13:42:44 +0800 Subject: [PATCH] add third --- third/wechat.go | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 third/wechat.go diff --git a/third/wechat.go b/third/wechat.go new file mode 100644 index 0000000..3357e66 --- /dev/null +++ b/third/wechat.go @@ -0,0 +1,65 @@ +package third + +import ( + "crypto/aes" + "crypto/cipher" + "encoding/base64" + "errors" +) + +func WeChat_Decrypt(sessionKey, encryptedData, iv string) (string, error) { + aesKey, err := base64.StdEncoding.DecodeString(sessionKey) + if err != nil { + return "", err + } + cipherText, err := base64.StdEncoding.DecodeString(encryptedData) + if err != nil { + return "", err + } + ivBytes, err := base64.StdEncoding.DecodeString(iv) + if err != nil { + return "", err + } + block, err := aes.NewCipher(aesKey) + if err != nil { + return "", err + } + mode := cipher.NewCBCDecrypter(block, ivBytes) + mode.CryptBlocks(cipherText, cipherText) + cipherText, err = WeChat_Pkcs7Unpad(cipherText, block.BlockSize()) + if err != nil { + return "", err + } + + return string(cipherText), nil +} + +// pkcs7Unpad returns slice of the original data without padding +func WeChat_Pkcs7Unpad(data []byte, blockSize int) ([]byte, error) { + var ( + // ErrInvalidBlockSize block size不合法 + ErrInvalidBlockSize = errors.New("invalid block size") + // ErrInvalidPKCS7Data PKCS7数据不合法 + ErrInvalidPKCS7Data = errors.New("invalid PKCS7 data") + // ErrInvalidPKCS7Padding 输入padding失败 + ErrInvalidPKCS7Padding = errors.New("invalid padding on input") + ) + + if blockSize <= 0 { + return nil, ErrInvalidBlockSize + } + if len(data)%blockSize != 0 || len(data) == 0 { + return nil, ErrInvalidPKCS7Data + } + c := data[len(data)-1] + n := int(c) + if n == 0 || n > len(data) { + return nil, ErrInvalidPKCS7Padding + } + for i := 0; i < n; i++ { + if data[len(data)-n+i] != c { + return nil, ErrInvalidPKCS7Padding + } + } + return data[:len(data)-n], nil +}