用空格解码base64

时间:2018-08-30 10:36:24

标签: string go base64 url-encoding

我有一个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” nsID“: “ d7c45f99-9478-44a6-b1f2-100000003366”,“ messageType”:“ CReq”,“ messageVersion”:“ 2.1.0”,“ challengeWindowSize”:“ 02”}


如何正确解密字符串?

2 个答案:

答案 0 :(得分:6)

您拥有的内容很可能是从URL“截断”的,并且采用URL编码形式。因此,要获取Base64字符串,您必须先对其进行解码,可以为此使用url.PathUnescape()

一旦有了未转义的字符串,就可以使用base64.StdEncoding编码器对其进行解码。请注意,仅因为它是/属于URL的一部分,并不能使它成为使用URL安全版本的Base64的字母的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键输入结果。

答案 1 :(得分:1)

输入字符串有三个问题

首先在其中间的+号

第二个在末尾有垃圾(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))

}