Java-Base64算法

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

你可能感兴趣的:(java,加密艺术)