簡體   English   中英

解碼 Base64 字符串時填充不正確

[英]Incorrect padding while decoding a Base64 string

我正在嘗試將 Base64 編碼的字節字符串解碼為有效的 HTTP URL。 我嘗試添加必要的填充(=)。 但它似乎仍然不起作用。

我已經嘗試了以下代碼。

import base64
encoded = b"aHR0cHM6Ly9mb3Jtcy5nbGUvWU5ZXQ0d2NRWHVLNnNwdjU="
decoded = base64.b64decode(encoded)
print(decoded)

encoded的字符串有一個缺失字符作為噪聲的一部分。 有沒有辦法檢測到丟失的字符然后執行解碼操作?

所以,你有一個 URL 編碼的aHR0cHM6Ly9mb3Jtcy5nbGUvWU5ZXQ0d2NRWHVLNnNwdjU= base64編碼,恰好缺少一個字符。

對於缺少的字符,您有64 個選項: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/ (對於base64 )和48 個可能的位置將缺少的字符放入-aHR-0-cHM-6-Ly-9-mb-3-Jtcy-5-nbGUvWU-5-ZXQ-0-d-2-NRWHVLNnNwdjU-=--表示可能的位置)

所以,你有64 * 48 = 3072 個可能的編碼字符串。 您可以嘗試手動生成它們,也可以編寫一些代碼來做同樣的事情。

生成它們后,您可以使用一些內置庫解碼字符串以獲取URL並檢查此URL是否有效 如果您還想知道這個URL是否存在,您可以向 URL 發出HTTP請求並檢查響應狀態碼

代碼:

package main

import (
    "encoding/base64"
    "fmt"
    "net/http"
)

func main() {
    encodedURL := "aHR0cHM6Ly9mb3Jtcy5nbGUvWU5ZXQ0d2NRWHVLNnNwdjU="
    options := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/"

    length := len(encodedURL)

    for i := 0; i <= length; i++ {
        for idx := 0; idx < 64; idx++ {
            tempEncoded := encodedURL[:i] + options[idx:idx+1] + encodedURL[i:]
            decodedURL, _ := base64.URLEncoding.DecodeString(tempEncoded)

            resp, err := http.Get(string(decodedURL))
            if err == nil && resp.StatusCode == http.StatusOK {
                fmt.Println("this URL is valid & exists: ", string(decodedURL))
            }
        }
    }
}

當未編碼輸入的長度不是三的倍數時,編碼的 output 必須添加填充,使其長度為四的倍數。

len(encoded)47 ,應該是48 ,所以 append 另一個=

encoded = b"aHR0cHM6Ly9mb3Jtcy5nbGUvWU5ZXQ0d2NRWHVLNnNwdjU=="
print(decoded)
b'https://forms.gle/YNY]\r\x1d\xd8\xd4V\x1dR\xcd\x9c\xdc\x1d\x8d'

暫無
暫無

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

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