[英]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.