Base64编码详解

Base64编码

Base64是一种编码方式,将字节数组按照规则转换成可见字符,并不属于加密的范畴。虽然Base64不是一种加密算法,但Base64在加密中却很常用,往往作为最后一步,将加密后的数据进行Base64编码,转换成可见字符。

原理

Base64编码,是将原字节数组按照3byte8bit转换成4byte6bit,将这4byte对应的值作为下标,在可见字符表中得到对应的可见字符。也就是将3byte转成4byte,不足4byte补’=’,最多补两个’=’。这也就是为什么Base64出来的结果在结尾处经常有’=‘或者’=='的原因。

示例

下面通过示例,演示一下Base64的编码过程(比直接看代码更直观):

待编码字符:
"admin"

对应的字节数组:
[97,100,109,105,110]

对应的二进制表示:
[01100001,01100100,01101101,01101001,01101110]

重新按照6bit进行分组(最后一组不足6bit,在后面补0):
[011000,010110,010001,101101,011010,010110,1110 00]

转换成整数表示:
[24,22,17,45,26,22,56]

查表得到对应字符(不足4byte,补'='):
['Y','W','R','t','a','W','4','=']

可见字符表(大写字母 + 小写字母 + 数字 + '+' + '/'):
['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/']

因此,字符串“admin”对应的Base64编码值为“YWRtaW4=”。如果是“admi”,那么对应的Base64编码值为“YWRtaQ==”。所以,Base64编码之后,长度一定是4的倍数。

代码实现

代码实现的核心围绕着怎么把字节数组重新安装6bit进行重组。其实从上面例子中的二进制表示法中很容易看出规律。这里就不再给出代码实现了,留给大家作为巩固的练习吧。(提示:这种位操作,当然是采用位运算最是方便快捷)

如果你已经完成了代码实现,那么回过头来看一下,如果只知道Base64的原理和代码实现,其实并不是很好理解其操作过程,毕竟人类习惯了10进制,对于二进制的位运算,并没有直观的感受(本人就是先看了原理和代码,发现不好理解,于是才有了上面的示例过程【哈哈】)。所以,对于位运算,往往二进制表示法更直观。

总结

  • Base64是一种编码方式,主要用于将一个字节数组(一般包含不可见字符)转化成可见字符(Java中一般转成String),方便查看和在代码中传递。
  • Base64编码之后,数据会变长,变为原来的(4.0/3倍),为了便于使用,一般封装的Base64编码函数需要返回编码后的长度。
  • Base64不是一种加密算法,不可用于数据加密,但可以用于将加密后的数据转换成可见字符(很多加密算法得到的结果都包含不可见字符)。
  • 由Base64数据长度,可以推算出Base64之前的数据长度,也就是加密后的数据长度,对于密码破解有一定参考价值。

你可能感兴趣的:(base64,加密解密,编码学)