簡體   English   中英

用空格解碼 base64

[英]Decode base64 with white space

我有一個 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()使用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 鍵中得到剩余的垃圾數據。

輸入字符串存在三個問題

首先是中間的+號

其次,末尾有垃圾(一個 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))

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM