Base64编码和解码

时间:2014-02-17 13:04:40

标签: encoding character-encoding cryptography base64

如果有人可以向我解释,我将不胜感激。

我遇到了这个post(不重要的只是引用)并看到了一个用base64编码的令牌,其中该家伙对其进行了解码。

EYl0htUzhivYzcIo+zrIyEFQUE1PQkk= -> t3+(:APPMOBI

然后我尝试使用base64编码t3 +(:APPMOBI),看看我是否会得到相同的结果,但是很惊讶得到:

t3+(:APPMOBI - > dDMrKDpBUFBNT0JJ

完全不同的令牌。

然后我尝试解码原始令牌EYl0htUzhivYzcIo+zrIyEFQUE1PQkk=并得到t3 +(:APPMOBI之间有随机字符。(我得到◄ëtå╒3å+╪═┬(√:╚╚APPMOBI可能是错的,我很快就把它从头顶上掉了下来)

令牌不同的原因是它们不应该是相同的吗?

2 个答案:

答案 0 :(得分:2)

问题在于显示输出的编码,或者用于将数据输入到base64的编码。这实际上是发明base64编码以帮助解决的问题。

不要尝试复制和粘贴非ASCII字符,而是将输出保存为二进制文件,然后检查它。然后,编码二进制文件。你会看到相同的base64字符串。

c:\TEMP>type b.txt
EYl0htUzhivYzcIo+zrIyEFQUE1PQkk=

c:\TEMP>base64 -d b.txt > b.bin

c:\TEMP>od -t x1 b.bin
0000000 11 89 74 86 d5 33 86 2b d8 cd c2 28 fb 3a c8 c8
0000020 41 50 50 4d 4f 42 49

c:\TEMP>base64 -e b.bin
EYl0htUzhivYzcIo+zrIyEFQUE1PQkk=

od是一个工具(八进制转储),它使用十六进制表示法输出二进制数据,并显示每个字节。

编辑:

你在评论中询问了一个不同的字符串,dDMrKDpBUFBNT0JJ,为什么解码到同一个东西?好吧,它不能解码同样的事情。它解码为这个字节串:74 33 2b 28 3a 41 50 50 4d 4f 42 49.你的原始字符串被解码为这个字节串:11 89 74 86 d5 33 86 2b d8 cd c2 28 fb 3a c8 c8 41 50 50 4d 4f 42 49。

注意区别:原始字符串解码为23个字节,第二个字符串解码为12个字节。原始字符串包括非ASCII字节,如11,d5,d8,cd,c2,fb,c8,c8。这些字节在每个系统上的打印方式不同。你把它们称为“随机字节”,但它们不是。它们是数据的一部分,而base64旨在确保它们可以传输。

我想要理解为什么这些字符串不同,你需要先了解字符数据的性质,base64是什么,以及它存在的原因。请记住,计算机只能处理数字,但人们需要使用熟悉的概念,如字母和数字。因此,ASCII被创建为一个“编码”标准,它代表一个小数字(我们将这个小数字称为“字节”)作为字母或数字,以便我们人类可以读取它。如果我们排列一组字节,我们可以拼出一条消息。 41 50 50 4d 4f 42 49是表示APPMOBI一词的字节。我们将这样一组字节称为“字符串”。

来自A-Z的每个字母和0-9中的每个数字都有一个用ASCII表示的数字代表它。但是有许多额外的数字不在标准中,并且并非所有数字都代表可见或合理的字母或数字。我们说他们不可打印。您的较长消息包含许多不可打印的字节(您称之为随机。)

当电子邮件等计算机程序处理字符串时,如果字节是可打印的ASCII字符,则很容易。电子邮件程序知道如何处理它们。但是如果您的字节代表图片,则字节可能具有非ASCII值,并且各种电子邮件程序将不知道如何处理它们。创建Base64是为了获取各种字节,包括可打印和不可打印的字节,并将它们转换为仅代表可打印字母的字节字符串。因为它们都是可打印的,所以像电子邮件或网络服务器这样的程序可以轻松处理它们,即使它不知道它们实际上包含图片。

这是你的新字符串的解码:

c:\TEMP>type c.txt
dDMrKDpBUFBNT0JJ

c:\TEMP>base64 -d c.txt
t3+(:APPMOBI
c:\TEMP>base64 -d c.txt > c.bin

c:\TEMP>od -t x1 c.bin
0000000 74 33 2b 28 3a 41 50 50 4d 4f 42 49
0000014

c:\TEMP>type c.bin
t3+(:APPMOBI
c:\TEMP>

答案 1 :(得分:2)

base64编码的全部目的是将二进制数据编码为文本表示,以便它们可以通过网络传输或显示而不会损坏。但具有讽刺意味的是,你所指的是原帖,

EYl0htUzhivYzcIo + zrIyEFQUE1PQkk =不解码为t3 +(:APPMOBI

相反,它包含一些你正确显示的二进制字节(不是随机顺便说一句)。因此问题是由于原始帖子,其中使用的作者或工具/浏览器“已清理”,或者说已损坏已解码的二进制数据。

编码和解码数据之间始终存在一对一的关系(前提是使用相同的“基数”,即同一组字符用于编码文本。)

t3 +(:APPMOBI确实将被编码为dDMrKDpBUFBNT0JJ