首先上结论:因为有数据填充。 CBC 模式要求明文数据必须填充至长度为分组长度的整数倍。 所以解密之后需要删除填充数据,才能正确的进行 JSON Unmarshal。 参考代码: func UnPadding(decryptedDataByte []byte) []byte { length := len(decryptedDataByte) unpadding := int(decryptedDataByte[length-1]) return decryptedDataByte[:(length - unpadding)] }
go小程序登录解密encryptedData报错 ,但是写死的官方参数又可以解密package main import( "fmt" "crypto/aes" "crypto/cipher" "encoding/base64" "errors" "log" "encoding/json" ) type WXBizDataCrypt struct { appId string sessionKey string } type WaterMark struct { TimeStamp string `json:"timestamp"` AppID string `json:"appid"` } type EncryptedDataUserInfo struct { OpenID string `json:"openId"` NickName string `json:"nickName"` Gender int `json:"gender"` Language string `json:"language"` City string `json:"city"` Province string `json:"province"` Country string `json:"country"` AvatarURL string `json:"avatarUrl"` UnionID string `json:"unionId"` Watermark struct { Timestamp int `json:"timestamp"` Appid string `json:"appid"` } `json:"watermark"` } func checkError(err error, id string) { if err!= nil { log.Fatal("Wrong position is " + id, err) } } func (wx *WXBizDataCrypt) decrypt(encryptedData string, iv string) string { // The sessionkey & encryptedData & iv are base64 encode // So we need to use base64 to decode it first sessionKey,err := base64.StdEncoding.DecodeString(wx.sessionKey) checkError(err, "1") encryptedDataByte,err := base64.StdEncoding.DecodeString(encryptedData) checkError(err, "2") ivByte,err := base64.StdEncoding.DecodeString(iv) checkError(err, "3") block,err := aes.NewCipher(sessionKey) checkError(err, "4") if len(encryptedDataByte) < aes.BlockSize { err = errors.New("Ciphertext block size is too short!") checkError(err, "5") } //The wechat biz data use mode CBC, which use block mode := cipher.NewCBCDecrypter(block, ivByte) mode.CryptBlocks(encryptedDataByte, encryptedDataByte) var dat EncryptedDataUserInfo fmt.Println(string(encryptedDataByte)) json.Unmarshal(encryptedDataByte, &dat) //fmt.Println(dat.UnionID) return dat.UnionID /*openId,err := jsonparser.GetString(encryptedDataByte,"openId") checkError(err, "6") return openId*/ } func main(){ ha := WXBizDataCrypt{ appId: "wx4f4bc4dec97d474b", sessionKey : "tiihtNczf5v6AKRyjwEUhQ=="} encryptedData := "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==" iv := "r7BXXKkLb8qrSNn05n0qiA==" /* ha := WXBizDataCrypt{ appId: "wxb8776b4df5c6ef6a", sessionKey : "ezcAawD6urUDuNetdZulOg=="} encryptedData := "BoG3R4blaQ5PwtODlnvbMowmmN37KI44bc3UPGa/dBpI4LelPkJ5C2vJ2xjEC6HTTT5VvyBKeQu6O+vBA7yc+D/0gSJRXhCUk0m1MoR1d2bqpxCQewnsAAj47f2ieo3B+bVI5Dayw06izx5EgMokZear7ZxT5VXAAoppTRximeht0MwZyH6XR9lakwPwrZfZPcd3hgGd81NPUdvsVyTHXiXnr4TRRPhw9z+cwTTy7HgVI6JmDjD1SgtyP2o4huVcc66UWzve5yAgCT2Q7DJvH8b+XZEFmRgYjlZfaspS1oK/kOEgbzJu+1m/MsZfMUGsh1TE9JkwrH6EjLhjuhhJNxAe7nO9mN7W8COs8wfvxWfhS3uwUjmg3dRiQpxIrmfewpcJQQr0mw68vl6KneXeY26LgmCyAzYPzUu946pYSJrhbLvEds4gMGJb7R4XipwMLZ4tcY1rgs4Md8noBAicWLUjNsNLNeoxvUOVEVvA1HcPo4fowg2G+ibGRiJP/AQORzigimbLAux1b/nRunx3KQ==" iv := "FYmK+E8nT6SLJUP9ytvSvQ=="*/ res := ha.decrypt(encryptedData, iv) fmt.Println(res) }
2020-02-24