Java 加密框架 02 Base64

一段文字在经过 Base64 编码后面目全非,而经过Base64解码后又能恢复。这很有加密解密的意味。不过Base64 算法并不是加密算法,Base64 算法的转换方式很像古典加密算法中的单表置换算法。

Base64 算法最早用于解决邮件传输问题。在早期电子邮件只允许ASCII码字符。非ASCII码字符在传输时会有问题,所以出现了 Base64编码。

Base64 是一种基于64个字符的编码算法。经过Base64 编码后的数据会比原始数据略长,为原来的4/3倍。Base64 编码后的字符串的字符数是4的整数倍。

技术分享

这张映射表中,value 是十进制编码 ,Encoding 是字符。共映射了64个字符。最后一个=,是永远补位的。

Base64 有2个规范:
RFC 2045:规定每行位76个字符,每行末尾需添加一个回车换行符,即便是最后一行不够76个字符,也要加换行符
RFC 4648: 没有换行符

Base64 还有几个相近的算法如 Base32,Base16 。为了能在http中以get方式传输二进制数据,还衍生了 url Base64。

url Base64 算法只要是替换了Base64映射表中的第62和63个字符。将+ 替换成 -,/替换成_ 。对于补位号 = , Bouncy Castle 使用.做补位符。Commons Codec 不使用补位符。

Base64 算法有编码和解码操作可以充当加密和解码操作。可以用做简单的加密。但要认识到 Base64 不能算是一种加密算法。 Base64 常用做密钥,密文和证书的一种通用存储编码格式。


Base64编码的操作:
1 将给定的字符串以字符为单位,转换为对应的字符编码
2 将字符编码转换为二进制
3 对获得的二进制做分组转换操作:每3个8位二进制码为一组,转换为每4个6位二进制码位一组(不足6位时低位补0)
4 对4-6二进制码补位,高位补2个0 ,组成4个8位二进制
5 将4-8二进制转换为十进制
6 通过映射表得到对应字符,不够4组的补=

从jdk1.8起,java提供了Base64 的实现,可以直接使用java.util.Base64。在jdk1.8之前,Java 并没有提供公开的Base64 实现(在 sun.misc 包中有内部实现),一般是自己实现,或引用commons-codec包

String s = "Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一";
byte[] b = s.getBytes("UTF-8");
byte[] out = java.util.Base64.getEncoder().encode(b);
System.out.println(new String(out));
out = java.util.Base64.getMimeEncoder().encode(b);
System.out.println(new String(out));
out = java.util.Base64.getUrlEncoder().encode(b);
System.out.println(new String(out));



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。