使用空格解码base64
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用空格解码base64相关的知识,希望对你有一定的参考价值。
我有一个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”}
如何正确解密字符串?
您拥有的内容最有可能从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键中剩余的垃圾数据。
输入字符串有三个问题
首先是中间的+标志
第二,最后有垃圾(编号为+的网址)
第三,字符串看起来不是有效的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))
}
以上是关于使用空格解码base64的主要内容,如果未能解决你的问题,请参考以下文章