浅谈base64
☆base64介绍:
①base64不是加密算法,是可读性算法
②base64的目的不是保护我们的数据,目的是为了可读性(比如对一段信息进行加密后形成了乱码(因为编码表上找不到字符),可以通过base64来使其转化为我们可读的信息)
③base64是由64个字符组成:大写A-Z(26个),小写a-z(26个),数字0-9(10个),两个符号:+和/(2个)
☆base58和base64的区别
base58是一种一般用在比特币里面的编码方式,在base58里面,没有数字0,也没有字母o,没有大写字母I和小写字母i,也没有+和/(也就是一共由58个字符组成)。
☆base64原理
base64是3个字节为一组,一个字节是8位,一共就是24位
base64把三个字节转换成4组,每组6位(一个字节是8位,缺少2位,在高位进行补0,这样做的好处是:base64取后面6位,前面的2位会去掉,这样就可以控制在0-63之间,也就对应ASCII码表里面的A-Z,a-z,0-9,+,/)
具体的流程如下图所示:
☆base64补等号规则说明
这里存在一个问题,使用base64里面有个等号=,以下图为例(使用DES算法进行加密和解密):
但是base64中的64个字符对应的ASCII码表里面并没有等号=。这个地方需要注意,因为base64是三个字节一组,如果在输出的时候不够三个字节,会使用等号=来补齐,直到补到3个字节为止。
话不多说,上测试代码:
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
/**
* 当字节不够的时候,需要使用=来补齐
*/
public class TestBase64 {
public static void main(String[] args) {
//1表示一个字节,不够3个字节
//MQ==:需要注意,在使用base64进行编码的时候,如果字节不够3个字节,需要使用=来补齐,直到补齐至3个字节为止
System.out.println(Base64.encode("1".getBytes()));
//如果是2个字节,就补齐一个=
System.out.println(Base64.encode("12".getBytes()));
//三个字节,无需补齐
System.out.println(Base64.encode("123".getBytes()));
//“三金哥”:是9个字节,9*8=72,刚好被3整除,也无需补齐
System.out.println(Base64.encode("三金哥".getBytes()));
}
}