首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能与base64编码/解码发生碰撞?

是否有可能与base64编码/解码发生碰撞?
EN

Stack Overflow用户
提问于 2018-11-09 12:29:49
回答 1查看 4.9K关注 0票数 8

这里提出了一个类似的问题:Is base64 encoding always one to one

显然,(类似问题的)答案是肯定的。我已经知道了,但是我很想知道为什么这两个字符串在被Base64解码后看起来是等价的:

cwB0AGQAAG==

cwB0AGQAAA==

还有一件事。当您选择去编码的字符串,然后重新编码,两个重新编码到相同的值: cwB0AGQAAA==。

发生了什么?

EN

Stack Overflow用户

回答已采纳

发布于 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并不是充满希望的:有许多方法可以编码相同的数据。

票数 31
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53225750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档