输入字节2564错误消息中的非法base64数据

时间:2016-07-25 10:50:49

标签: go base64 decode encode

我得到了:

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
}

任何人都可以提出可能存在的问题吗?

2 个答案:

答案 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)