我得到了:
error: illegal base64 data at input byte 2564
当我解密两个编码的字符串时:
data1:="8uxiowaHGmt6usI7U2SErXwpi/JLKbdhI3o...."(encrypted data)
data2:="iqqtWBCW7Ih9GAXubtIoLjucdIDfWd+oo2j...."(encrypted data)
data:=data1+data2
value, err = base64.StdEncoding.DecodeString(data)
if err != nil {
log.Println(err)
return
}
任何人都可以提出可能存在的问题吗?
答案 0 :(得分:3)
您无法连接不同的base64编码字符串并将其解码为一个。 Base64编码可能不会使用结果字符串中的所有位,并且它可能使用填充,只有在末尾(但不在中间)找到它才有效。
你必须单独解码它们。
见这个例子:
d1 := []byte{1, 2}
d2 := []byte{3, 4}
s1 := base64.StdEncoding.EncodeToString(d1)
s2 := base64.StdEncoding.EncodeToString(d2)
fmt.Println(s1)
fmt.Println(s2)
d1d, err := base64.StdEncoding.DecodeString(s1)
if err != nil {
panic(err)
}
d2d, err := base64.StdEncoding.DecodeString(s2)
if err != nil {
panic(err)
}
fmt.Println(d1d)
fmt.Println(d2d)
d12d, err := base64.StdEncoding.DecodeString(s1 + s2)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(d12d)
}
输出(在 Go Playground 上试试):
AQI=
AwQ=
[1 2]
[3 4]
illegal base64 data at input byte 4
正如您所看到的,解码成功一个接一个,但在尝试解码连接字符串时失败。
注意:强>
请注意,在特殊情况下,可能会“正确”解码连接的base64字符串(即,如果第一个字符串不以填充字符结尾),但您绝不应该这样做。
例如,如果第一个数据是从长度可分为3的输入中编码的,则其Base64格式不包含填充:
d1 := []byte{1, 2, 3}
d2 := []byte{4, 5, 6}
使用此输入到上面的测试代码,它会产生成功(在 Go Playground 上尝试):
AQID
BAUG
[1 2 3]
[4 5 6]
[1 2 3 4 5 6]
答案 1 :(得分:3)
我遇到了一个类似的问题;我的解决方案是使用base64.RawStdEncoding
,因为我的编码字符串已经剥离了填充。
注意:正如另一个答案所提到的,如果padding没有被剥离:你不能连接两个base64encoded字符串。
来自文档:
RawStdEncoding是标准的原始,未填充的base64编码,如 在RFC 4648第3.2节中定义。这与StdEncoding相同,但是 省略填充字符。
var RawStdEncoding = StdEncoding.WithPadding(NoPadding)
RawURLEncoding 是RFC 4648中定义的unpadded alternate base64编码。它是 通常用于URL和文件名。这与URLEncoding相同 但是省略了填充字符。
var RawURLEncoding = URLEncoding.WithPadding(NoPadding)
StdEncoding是 标准的base64编码,如RFC 4648中所定义。
var StdEncoding = NewEncoding(encodeStd)
URLEncoding是替代品 RFC6448中定义的base64编码。它通常用于URL和 文件名。
var URLEncoding = NewEncoding(encodeURL)