Base64编码解码算是网络安全领域的很小而且很简单的一个知识点了,虽然简单但是应用场景却极其广泛,可以这样说,开发者要是不懂Base64,基本上可以告别程序猿生涯了。这篇文章从原理入手,并给出java的Base64实现。方便你掌握Base64。

一、Base64由来

很早之前,电子邮件刚刚问世,那时候消息的传递都是英文,后来中国开通了互联网之后,对邮件的使用量也大量增加,这时候电子邮件就有了中文的需求。但是中文在传输的时候不能被有效地处理,这时候Base就出来了,Base64通过对这些中文进行编码,转化为服务器和网关能够识别的数据。这时候就能够使用电子邮件有效地传输了。

上面的这个例子不是说Base64专门为电子邮件而生的,从其诞生之初,就开始在各大领域有了广泛的应用。比如说网络上传递图片,我们可以Base64先对图片进行处理,然后就可以有效的传输了。

OK,我们大致知道其用途,然后我们就好好的分析一下他的原理,到底是如何对这些数据进行编码的。

二、Base64原理

1、Base64编码

Base64的原理超级简单,相信我们都知道ASCII 编码,从A-Z、a-z、0-9和一些其他的特殊字符,这些字符都有唯一的一个数字来表示。比如说a是97,A是65。我们来截取一部分图看一下:

同理Base64也有这样一套编码。范围是”A-Z“、”a-z“、”0-9“、”+“、”/“一共64个字符。我们给出一个表格来看一下,这个比ASCII编码要简单多了,只有64个。

索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y

由于索引是从0开始,所以最后的索引是63。在编码的时候Base64就是通过上面的进行转换编码的。下面我们就来看看Base64编码的原理。

2、基本原理

比如说有一封邮件,我们想要对其使用Base64进行编码。怎么办呢?基本步骤如下:

(1)对邮件的数据进行切分,每三个字节一组,一共24个bit。

(2)对切分后的数据重组,24个bit重组为4组,每组6个bit。

(3)对重组后的数据处理,每组最前面添加两个“0”,构成每组8个bit。此时一共32个bit。

(4)根据Base64编码表,获取相应的编码值。

此时一封完整的邮件,被切分重组处理之后就变成了Base64编码了。基本原理其实很简单。不过你不理解也没关系,我们直接上个实例来解释一下。

3、实例验证

比如说电子邮件里面出现了三个字母sky。我们要对这个三个字符使用Base64进行编码。

(1)对邮件的数据进行切分,每三个字节一组,一共24个bit

数据 s k y
ASCII编码 115 107 121
二进制 01110011 01101011 01111001

(2)对切分后的数据重组,24个bit重组为4组,每组6个bit

(3)对重组后的数据处理,每组最前面添加两个“0”,构成每组8个bit。由于在最前面添加的0,所以对数值不构成影响。

(4)根据Base64编码表,获取相应的编码值

(5)完成编码的转换

到这我们基本上就是实现了Base64编码机制从sky到c2t5的转换。

有些地方需要我们去注意一下:

(1)在第三步中,最前面添加了两个0,所以最终编码之后要比之前多出三分之一的大小。

(2)上面的例子中,我们使用的是ASCII编码,但是如果我们使用UTF-8,对应Base64编码的结果是不一样的。

(3)Base64只是进行了编码,方便数据的传输而已。这可不是加密。

原理也搞清楚了,现在我们就实现一下。

三、代码实现

你可以自己去实现一个编码解码的完整过程,但是java已经为我们封装好了,我们直接只用别人造好的轮子多好。不管是自己写还是使用别人的,原理搞清楚就OK了。

public class Test {public static void main(String[] args) throws IOException {String str = "sky";//编码BASE64Encoder encoder = new BASE64Encoder();String encoderResult=encoder.encode(str.getBytes());System.out.println("编码结果为:" + encoderResult);//解码BASE64Decoder decoder = new BASE64Decoder();byte[] decoderResult=decoder.decodeBuffer(encoderResult);System.out.println("解码结果为:" + new String(decoderResult));}}
//编码结果为:c2t5
//解码结果为:sky

是不是很简单。其实java实现的方式有很多种,其他的还有Commons Codec和Bouncy Castle。实现的过程和JDK提供的类似,我们只需要导入相应的jar包即可。

Base64算法的应用场景有E-Mail、密钥、证书文件等等。这也只是入门,想要深入了解,可以看一些安全有关的书籍,不过很多都和数学有关,看的实在是难受,曾经看过,可惜没坚持住。惭愧,书到用时方恨少。

要导入相应的jar包即可。

Base64算法的应用场景有E-Mail、密钥、证书文件等等。这也只是入门,想要深入了解,可以看一些安全有关的书籍,不过很多都和数学有关,看的实在是难受,曾经看过,可惜没坚持住。惭愧,书到用时方恨少。

OK。有问题还请指正。

一文彻底看懂Base64原理(并使用java实现)相关推荐

  1. c++ socket线程池原理_一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题...

    编辑:业余草来源:https://www.xttblog.com/?p=4946 一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题. ThreadLocal 相信不 ...

  2. 一个动画看懂网络原理之CSMA/CD的工作原理

    一个动画看懂网络原理之CSMA/CD的工作原理 CSMA/CD协议是以太网传输中的一个重要协议,由于线路中同一时间只能允许一台电脑发送信息,否则各计算机之间就会产生干扰,为了解决这个问题,采用了CSM ...

  3. 计算机网络原理fin,一个动画看懂网络原理之TCP建立和释放过程

    一个动画看懂网络原理之TCP建立和释放过程 一.TCP的概念 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.T ...

  4. 2017春运抢票软件哪个好,教你看懂刷票原理!| 宅客周刊

    2017年第一天,当你从跨年的宿醉中逐渐清醒.你可能意识到自己搬砖的薪水还不够发几个红包,你可能意识到而十多天后回家的票还没抢到. 没问题,本期雷锋网(公众号:雷锋网)宅客周刊就给你终极解决方案.如何 ...

  5. 计算机网络中的网桥,一个动画看懂网络原理之网桥的工作原理

    一个动画看懂网络原理之网桥的工作原理 一.网桥是干什么的 网桥工作在OSI参考模型数据链路层的两端口或多端口二层网络设备,是用来连接不同网段的存储转发设备.使用网桥能扩展网络的距离或范围,还可以提高网 ...

  6. 计算机网络中 中继器的作用是,一个动画看懂网络原理之中继器工作过程

    一个动画看懂网络原理之中继器工作过程 我们在学习计算机网络技术时,涉及到网络设备时,书本上往往在介绍网卡之后,就会给大家介绍中继器,那么中继器是什么,它的作用是什么,它的工作过程又是怎样的,下面就这些 ...

  7. base64编码_几分钟看懂Base64编码原理

    Base64简介 Base64是基于64个可打印字符(小写字母a-z,大写字母A-Z,数字0-9,符号"+","/" 再加上作为垫字的"=" ...

  8. mysql 大量数据 更改索引_一文看懂ICP原理--MySQL用索引去表里取数据的一种优化...

    概述 今天主要介绍一下mysql的ICP特性,可能很多人都没听过,这里用一个实验来帮助大家加深一下理解. 一.Index_Condition_Pushdown Index Condition Push ...

  9. Google深度揭秘TPU:一文看懂内部原理,以及为何碾压GPU

    搜索.街景.照片.翻译,这些Google提供的服务,都使用了Google的TPU(张量处理器)来加速背后的神经网络计算. △ 在PCB板上的Google首款TPU和部署了TPU的数据中心 去年Goog ...

  10. 用python语言实现喇叭发声原理_一文看懂音频原理

    笔者博客:mwhitelab.com 笔者公众号:技术杂学铺 前言 笔者最近正好在做和声音处理有关的项目,突然对音频数字化感兴趣,想了解一下基本原理.可网上文章知识都很散.排版也不美观.因此笔者便决定 ...

最新文章

  1. Java中的显示锁 ReentrantLock 和 ReentrantReadWriteLock
  2. QT精彩实例分析第5章-0
  3. 安装确认书模板_Aion S车讲堂 | 关于充电桩安装的N个问题
  4. matlab用regress方法求ln函数_数学篇|高中数学48条秒杀型公式与方法,一定要掌握!...
  5. pytorch-pretrained-bert的模型下载慢的问题
  6. java中nonce_java如何获取微信timestamp,nonceStr,signature参数
  7. 后台报错java.lang.IllegalArgumentException: Invalid character found in the request target.
  8. springMVC的文件上传于下载
  9. Matplotlib笔记(1)——文字、绘图、背景(颜色对照表)
  10. python采用面向对象编程模式吗_python基础5-面向对象编程
  11. Linux之unzip命令
  12. htc x920e刷android7.0,HTC X920e(Butterfly)第三方recovery刷入教程
  13. 每日一记:查看Oracle补丁更新情况
  14. 什么是MBR/DPT/DBR/BPB?
  15. 网页类参考文献的引用格式
  16. python一天学费多少_自学python一天的小项目实战
  17. 华为日历怎么显示一月_华为P20使用感受
  18. 1 dB压缩点_噪声系数_小信号非线性的数学描述
  19. 29岁的人生并不是那么平平淡淡_20190308
  20. ffmpeg实现g711音频和H264,H265封装mp4(整理,非原创)

热门文章

  1. Hermite(埃尔米特)插值法
  2. 西瓜视频 iOS 播放器技术重构
  3. c#.net配置mysql数据库连接池_c# 创建 mysql数据库连接池
  4. cass软件yy命令_CASS快捷命令大全
  5. 2022年全栈开发者需要熟悉了解的知识列表
  6. 非极大值抑制(PyTorch-YOLOv3代码解析一)
  7. 灵格斯与众多常用软件的冲突问题
  8. 传统制造业和工业如何和大数据进行结合
  9. 通信电子线路——课程介绍
  10. 通信电子电路实验(三)——高频电容反馈型LC振荡器的设计与仿真