Java 加解密技术系列之 BASE64

其实,严格来说,BASE64 是一种编码的方式,并不是真正意义上的加解密,不过,从另一个角度来考虑的话,就是把数据变为人不会用肉眼能分辨其真实性的角度来说,BASE64 也是属于加解密范畴的。而且,有的加密技术,也是需要通过 BASE64 来编码转换的。

那么,BASE64 到底是什么呢?下面我来大概的介绍一下 BASE64 的编码原理。

BASE64 的编码都是按字符串长度,以每 3 个 8 bit 的字符为一组,然后针对每组,首先获取每个字符的 ASCII 编码,然后将 ASCII 编码转换成 8 bit 的二进制,得到一组 3*8=24 bit 的字节。然后再将这 24 bit 划分为 4 个 6 bit 的字节,并在每个 6 bit 的字节前面都填两个高位 0,得到 4 个 8 bit 的字节,然后将这 4 个 8 bit 的字节转换成十进制,对照 BASE64 编码表 (下表),得到对应编码后的字符。

注:1. 要求被编码字符是8bit的,所以须在ASCII编码范围内,\u0000-\u00ff,中文就不行。
  2. 如果被编码字符长度不是3的倍数的时候,则都用0代替,对应的输出字符为=
public class Java8BASE64 {
	private static final Base64.Decoder decoder = Base64.getDecoder();
	private static final Base64.Encoder encoder = Base64.getEncoder();
	public static byte[] decryptBASE64(String text) {
		return decoder.decode(text);
	}
	
	public static String encryptBASE64(byte[] textByte) {
		return encoder.encodeToString(textByte);
	}
	public static void main(String[] args) {
//		String s = "Tom";
//		String s = "Lucy";
		String s = "贾伟成";
		String ss = encryptBASE64(s.getBytes());  //s虽然是中文,但是通过getBytes方法把它转换成了一个字节数组。
		System.out.println(ss);
	}
}




原理讲清楚了,下面举两个例子说明一下。

a) 字符长度为能被3整除时:比如“Tom” :



所以,btoa('Tom') = VG9t,也就是说,“Tom”的 BASE64 编码结果为 VG9t。

b) 字符串长度不能被3整除时,比如“Lucy”:



由于 Lucy 只有 4 个字母,所以按 3 个一组的话,第二组还有两个空位,所以需要用 0 来补齐。这里就需要注意,因为是需要补齐而出现的 0,所以转化成十进制的时候就不能按常规用 BASE64 编码表来对应,所以不是 a, 可以理解成为一种特殊的“异常”,编码应该对应“=”。


结束语


通过我上边说的这些,我想你已经了解了 BASE64 编码的原理,当然,如果你现在去看 Java 中有关 BASE64 编码源码的话,我想你一定能很快就搞明白的。不过,在此之前,推荐你还是要亲自试一下,用程序编码一个单词,然后使用上边提到的原理,人工编码相同的单词,你就会更加清楚是怎么回事。

顺带说一句,工作中,不能因为有了计算机,就什么事都要依赖它。有一句话,我想大家都知道,“用进废退”,就是这个道理。核心的东西掌握了,再来借助计算机,那就是事半功倍了,否则只会沦为高科技时代的奴隶。


引用自:https://blog.csdn.net/happylee6688/article/details/43950521

猜你喜欢

转载自blog.csdn.net/jiaweicheng77/article/details/80752432