package tpi 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 }