这里提出了一个类似的问题:Is base64 encoding always one to one
显然,(类似问题的)答案是肯定的。我已经知道了,但是我很想知道为什么这两个字符串在被Base64解码后看起来是等价的:
cwB0AGQAAG==
cwB0AGQAAA==
还有一件事。当您选择去编码的字符串,然后重新编码,两个重新编码到相同的值: cwB0AGQAAA==。
发生了什么?
发布于 2018-11-09 13:01:48
base64不是一对一的,有多种方法来编码相同的字节.您看到的是对字符串末尾的填充进行编码的多种方法。
base64将字节(每个8位)编码为基数64。base64中的一个字符编码6位,因此四个base64字符可以处理三个字节。当输入的长度不是三个字节的倍数时,base64使用=作为填充字符来填充最后一组四个base64字符。XXX=表示只使用组的前两个字节(其中XXX表示三个任意base64字符),而XX==则表示只使用第一个字节。
示例中的最后一个组是AA==,它编码一个0字节。然而,AA部分可以编码12位,其中最不重要的4位在解码时被忽略,所以您可以使用A-P中的任何字符并获得相同的结果。当您使用编码器时,它总是为这四位选择零,所以您可以返回AA==。
在base64中填充实际上更复杂。从技术上讲,您可以排除=字符;字符串的长度将表示它们不存在(根据维基百科,并不是所有的解码器都支持这一点)。填充的有用之处在于它允许安全地连接base64字符串,因为每组四人都是以相同的方式解释的。但是,这意味着填充也可以出现在字符串的中间,这意味着可以以各种方式对字节序列进行编码。您还可以包括空格或换行符,它们都会被忽略。
尽管如此,base64仍然是内射的,这意味着如果x= y,那么base64(x) != base64(y);因此,您无法得到碰撞,并且始终可以获得原始数据。然而,base64并不是充满希望的:有许多方法可以编码相同的数据。
https://stackoverflow.com/questions/53225750
复制相似问题