Base64算法小结(Java)
一、Base64定义
Base64是一种基于64个字符的编码算法, 根据RFC 2045 的定义: Base6内容传送编码是一种以任意8位字节序列组合的描述形式,这样形式不易被人直接识别,常用于电子邮件、密钥等场景。
经过编码后的数据是原来的4/3倍,经过Base64转码后的字符长度为4的倍数。
RFC 2045 规定 每行76个字符,每行行末需添加一个换行符("\r\n")
Base64编码后的字符常见=号在末尾,等号是用来补位。。
URL Base64主要是将”+“ 和 ”/“ 替换成 ”-“ 和”_“ 对于补位 bouncyCastle使用 ”.“补位,其他不再使用补位符。
二、Base64实现
1、Base64目前有两种规范:
- 一般Base64标准
- RFC 2045标准
2、Base64实现方式
2.1 目前支持Base64的工具
bouncy castle 、Commons Codec、sun.misc、java.util(jdk1.8)
bouncy castle支持一般Base64标准,
Commons Codec 两种标准都支持
sun.misc sun公司内部API,不建议使用
java.util java8新特性,效率最高,推荐使用
2.2 commons Codec实现
@Test
public void testBase64() throws Exception{
BASE64Encoder encoder = new BASE64Encoder();
String str ="Base64编码测试";
byte[] bytes = str.getBytes("UTF-8");
String encode = encoder.encode(str.getBytes());
System.out.println("base64加密后:"+encode);
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytes1 = decoder.decodeBuffer(encode);
String decodeStr = new String(decoder.decodeBuffer(encode));
System.out.println("base64解密:"+decodeStr);
}
java8 java.util实现
@Test
public void testJAVA8Base64() throws Exception{
java.util.Base64.Encoder encoder = java.util.Base64.getEncoder();
String str ="Base64编码测试";
String s = encoder.encodeToString(str.getBytes());
System.out.println("javaUtilbase64加密:"+s);
java.util.Base64.Decoder decoder = java.util.Base64.getDecoder();
byte[] decode = decoder.decode(s);
System.out.println("javaUtilbase64解密:"+new String(decode));
}
Base64实现原理
看一下Base64的索引表,字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符。数值代表字符的索引,这个是标准Base64协议规定的,不能更改。
数值 | 字符 |
---|---|
0 | A |
1 | B |
2 | C |
3 | D |
4 | E |
5 | F |
6 | G |
7 | H |
8 | I |
9 | J |
10 | K |
Base64核心原理:
-base64的编码都是按字符串长度,以每3个8bit的字符为一组,
-1、首先获取每个字符的ASCII编码,
-2、将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节
-3、再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节
-4、将这4个8bit的字节转换成10进制,对照Base64编码表,得到对应编码后的字符。
如果异常,则使用等号替换。
参考:https://www.cnblogs.com/diligenceday/p/6002382.html
参考:https://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html