亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用空格解碼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 關注
  • 234 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號