为了账号安全,请及时绑定邮箱和手机立即绑定

用空格解码base64

用空格解码base64

Go
青春有我 2023-03-29 15:18:23
我有一个 base64 编码的字符串,我正试图用 go 解密。该字符串包含应忽略的空格。我正在尝试的示例代码:s := "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjEzZmU3MWQ0LWQxMGQtNDIyMC1hMjE2LTIwMDZkMWRkNGNiOCIsImFjc1RyY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++W5zSUQiOiJkN2M0NWY5OS05NDc4LTQ0YTYtYjFmMi0xMDAwMDAwMDMzNjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0%3D"out, err := base64.URLEncoding.DecodeString(s)if err != nil {    fmt.Println(err)    return}fmt.Println(string(out))此代码返回:输入字节 93 处的非法 base64 数据更改字符串填充并使用 StdEncoding 而不是 URLEncoding 后:s= strings.Replace(s, "%3D", "=", -1)out, err := base64.StdEncoding.DecodeString(s)if err != nil {    fmt.Println(err)    return}fmt.Println(string(out))输出将是:{"threeDSServerTransID":"13fe71d4-d10d-4220-a216-2006d1dd4cb8","acsTrc ��������������������...... 9478-44a6-b1f2-100000003366","messageType":"CReq","messageVersion":"2.1.0","challengeWindowSize":"02"}如何正确解密字符串?
查看完整描述

2 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

您所拥有的很可能是从 URL 中“截断”的,并且它是 URL 编码形式。所以要得到一个Base64字符串,你必须先解码它,你可能会用到url.PathUnescape()这个。

获得未转义的字符串后,您可以使用base64.StdEncoding编码器对其进行解码。请注意,仅仅因为它是 / 是 URL 的一部分,并不会使它成为使用 Base64 的 URL 安全版本的字母表的 base64 字符串。

+它中间的标志也真的只是“垃圾”。它们一开始就不应该存在,因此请仔细检查您是如何获得输入的,但既然它们存在,您就必须删除它们。为此,您可以使用strings.Replace().

解码无效输入的最终代码:

s := "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjEzZmU3MWQ0LWQxMGQtNDIyMC1hMjE2LTIwMDZkMWRkNGNiOCIsImFjc1RyY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++W5zSUQiOiJkN2M0NWY5OS05NDc4LTQ0YTYtYjFmMi0xMDAwMDAwMDMzNjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0%3D"

s = strings.Replace(s, "+", "", -1)

var err error

if s, err = url.PathUnescape(s); err != nil {

    panic(err)

}


out, err := base64.StdEncoding.DecodeString(s)

if err != nil {

    panic(err)

}

fmt.Println(string(out))

完整输出(在Go Playground上尝试):


{"threeDSServerTransID":"13fe71d4-d10d-4220-a216-2006d1dd4cb8",

   "acsTransID":"d7c45f99-9478-44a6-b1f2-100000003366","messageType":"CReq",

    "messageVersion":"2.1.0","challengeWindowSize":"02"}

请注意,该+符号是标准 Base64 字母表中的有效符号,您甚至可以在不删除符号的情况下解码 Base64 +,但随后您会在结果的 JSON 键中得到垃圾数据。


查看完整回答
反对 回复 2023-03-29
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

输入字符串存在三个问题


首先是中间的+号


其次最后有垃圾(一个url编码+)


第三个字符串似乎不是有效的 Base64


要删除中间的加号,找到开始和结束的索引并创建一个新字符串要删除末尾的垃圾,更早地终止字符串(在固定字符串的索引 249 处)


固定字符串的索引 148 处的字符串还有一个问题,我猜这是由于数据错误造成的


但是下面的代码片段显示了如何克服前两件事


package main


import (

    "fmt"

    "encoding/base64"

    "strings"

)


func main() {

    s := "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6IjEzZmU3MWQ0LWQxMGQtNDIyMC1hMjE2LTIwMDZkMWRkNGNiOCIsImFjc1RyY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++W5zSUQiOiJkN2M0NWY5OS05NDc4LTQ0YTYtYjFmMi0xMDAwMDAwMDMzNjYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjAyIn0%3D"



    a:=strings.Index(s,"+")

    b:=strings.LastIndex(s,"+")+1


    fixed:=s[0:a] + s[b:249]

    out, err := base64.StdEncoding.DecodeString(fixed)

    if err != nil {

        fmt.Println(err)

        fmt.Println(fixed)


    }

    fmt.Println(a,b)

    fmt.Println(String(out))


}


查看完整回答
反对 回复 2023-03-29
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信