我正在尝试解码Base64编码的字节字符串到有效的HTTP URL。我已经尝试追加必要的填充(=)。但它似乎仍然不起作用。
我试过下面的代码。
import base64
encoded = b"aHR0cHM6Ly9mb3Jtcy5nbGUvWU5ZXQ0d2NRWHVLNnNwdjU="
decoded = base64.b64decode(encoded)
print(decoded)
字符串encoded
有一个缺失字符作为噪声的一部分。是否有一种方法来检测缺失的字符,然后执行解码操作?
所以你有这个aHR0cHM6Ly9mb3Jtcy5nbGUvWU5ZXQ0d2NRWHVLNnNwdjU=
base64
对于缺失的字符,您有64abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/
(for base64)) and 48-a-H-R-0-c-H-M-6-L-y-9-m-b-3-J-t-c-y-5-n-b-G-U-v-W-U-5-Z-X-Q-0-d-2-N-R-W-H-V-L-N-n-N-w-d-j-U-=-
中缺失字符的可能位置(-
表示可能位置)
64 * 48 = 3072可能的编码字符串。您可以尝试手工生成它们,也可以编写一些代码来做同样的事情。
生成它们后,可以解码获取URL的字符串使用一些内置库&检查这个URL是否有效是与否。如果您还需要知道这个URL是否 或者不,你可以创建一个HTTP 到URL &检查响应 StatusCode .
代码:
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))
}
}
}
}
当未编码输入的长度不是3的倍数时,编码后的输出必须添加填充,使其长度为4的倍数。
len(encoded)
是47
,应该是48
,所以再添加一个=
encoded = b"aHR0cHM6Ly9mb3Jtcy5nbGUvWU5ZXQ0d2NRWHVLNnNwdjU=="
print(decoded)
b'https://forms.gle/YNY]rx1dxd8xd4Vx1dRxcdx9cxdcx1dx8d'