一文彻底看懂Base64原理(并使用java实现)
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实现)相关推荐
- c++ socket线程池原理_一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题...
编辑:业余草来源:https://www.xttblog.com/?p=4946 一篇文章看懂 ThreadLocal 原理,内存泄露,缺点以及线程池复用的值传递问题. ThreadLocal 相信不 ...
- 一个动画看懂网络原理之CSMA/CD的工作原理
一个动画看懂网络原理之CSMA/CD的工作原理 CSMA/CD协议是以太网传输中的一个重要协议,由于线路中同一时间只能允许一台电脑发送信息,否则各计算机之间就会产生干扰,为了解决这个问题,采用了CSM ...
- 计算机网络原理fin,一个动画看懂网络原理之TCP建立和释放过程
一个动画看懂网络原理之TCP建立和释放过程 一.TCP的概念 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.T ...
- 2017春运抢票软件哪个好,教你看懂刷票原理!| 宅客周刊
2017年第一天,当你从跨年的宿醉中逐渐清醒.你可能意识到自己搬砖的薪水还不够发几个红包,你可能意识到而十多天后回家的票还没抢到. 没问题,本期雷锋网(公众号:雷锋网)宅客周刊就给你终极解决方案.如何 ...
- 计算机网络中的网桥,一个动画看懂网络原理之网桥的工作原理
一个动画看懂网络原理之网桥的工作原理 一.网桥是干什么的 网桥工作在OSI参考模型数据链路层的两端口或多端口二层网络设备,是用来连接不同网段的存储转发设备.使用网桥能扩展网络的距离或范围,还可以提高网 ...
- 计算机网络中 中继器的作用是,一个动画看懂网络原理之中继器工作过程
一个动画看懂网络原理之中继器工作过程 我们在学习计算机网络技术时,涉及到网络设备时,书本上往往在介绍网卡之后,就会给大家介绍中继器,那么中继器是什么,它的作用是什么,它的工作过程又是怎样的,下面就这些 ...
- base64编码_几分钟看懂Base64编码原理
Base64简介 Base64是基于64个可打印字符(小写字母a-z,大写字母A-Z,数字0-9,符号"+","/" 再加上作为垫字的"=" ...
- mysql 大量数据 更改索引_一文看懂ICP原理--MySQL用索引去表里取数据的一种优化...
概述 今天主要介绍一下mysql的ICP特性,可能很多人都没听过,这里用一个实验来帮助大家加深一下理解. 一.Index_Condition_Pushdown Index Condition Push ...
- Google深度揭秘TPU:一文看懂内部原理,以及为何碾压GPU
搜索.街景.照片.翻译,这些Google提供的服务,都使用了Google的TPU(张量处理器)来加速背后的神经网络计算. △ 在PCB板上的Google首款TPU和部署了TPU的数据中心 去年Goog ...
- 用python语言实现喇叭发声原理_一文看懂音频原理
笔者博客:mwhitelab.com 笔者公众号:技术杂学铺 前言 笔者最近正好在做和声音处理有关的项目,突然对音频数字化感兴趣,想了解一下基本原理.可网上文章知识都很散.排版也不美观.因此笔者便决定 ...
最新文章
- Java中的显示锁 ReentrantLock 和 ReentrantReadWriteLock
- QT精彩实例分析第5章-0
- 安装确认书模板_Aion S车讲堂 | 关于充电桩安装的N个问题
- matlab用regress方法求ln函数_数学篇|高中数学48条秒杀型公式与方法,一定要掌握!...
- pytorch-pretrained-bert的模型下载慢的问题
- java中nonce_java如何获取微信timestamp,nonceStr,signature参数
- 后台报错java.lang.IllegalArgumentException: Invalid character found in the request target.
- springMVC的文件上传于下载
- Matplotlib笔记(1)——文字、绘图、背景(颜色对照表)
- python采用面向对象编程模式吗_python基础5-面向对象编程
- Linux之unzip命令
- htc x920e刷android7.0,HTC X920e(Butterfly)第三方recovery刷入教程
- 每日一记:查看Oracle补丁更新情况
- 什么是MBR/DPT/DBR/BPB?
- 网页类参考文献的引用格式
- python一天学费多少_自学python一天的小项目实战
- 华为日历怎么显示一月_华为P20使用感受
- 1 dB压缩点_噪声系数_小信号非线性的数学描述
- 29岁的人生并不是那么平平淡淡_20190308
- ffmpeg实现g711音频和H264,H265封装mp4(整理,非原创)