Go 语言 微信小程序加密数据解密算法实现
代码实现
本实现参考官方PHP例程实现,Go代码实现如下:
func DecryptData (app_id, session_key, iv, encrypted_data string) (map[string]interface{}, error) { if len := strings.Count(session_key, "") - 1; len != 24 { return nil, errors.New("Invalid value session_key!") } aesKey, err := base64.StdEncoding.DecodeString(session_key) if err != nil { return nil, err } if len := strings.Count(iv, "") - 1; len != 24 { return nil, errors.New("Invalid value iv!") } ivKey, err := base64.StdEncoding.DecodeString(iv) if err != nil { return nil, err } decodeData, err := base64.StdEncoding.DecodeString(encrypted_data) if err != nil { return nil, err } dataBytes, err := AesDecrypt(decodeData, aesKey, ivKey) if err != nil { return nil, err } var result map [string] interface{} err = json.Unmarshal(dataBytes, &result) watermark := result["watermark"].(map[string]interface{}) if watermark["appid"] != app_id { return nil, errors.New("Invalid appid data!") } return result, err }
参考
AES解密算法实现参考:golang版微信小程序登录和ase解码微信公开数据,稍作修改,代码如下:
func AesDecrypt(crypted, key, iv []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockMode := cipher.NewCBCDecrypter(block, iv) origData := make([]byte, len(crypted)) blockMode.CryptBlocks(origData, crypted) // 去除填充 length := len(origData) unp := int(origData[length-1]) return origData[:(length - unp)], nil }