PKI - 电子邮件传输算法 - Base64 - 二进制的可视化展示

2024-04-25 18:38

本文主要是介绍PKI - 电子邮件传输算法 - Base64 - 二进制的可视化展示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PKI - 电子邮件传输算法 - Base64 - 二进制的可视化展示

  • 1. 定义
  • 2. 实现原理
    • 2.1 ASCII码字符编码
    • 2.2 非ASCII码字符编码
  • 3. 算法实现
    • 3.1 Bouncy Castle
      • 3.1.1 Maven Configuration
      • 3.1.2 Sample Code
    • 3.2 Commons Codec
      • 3.3.1 Maven Configuration
      • 3.3.2 Sample Code
    • 3.3 Java 8
      • 3.3.1 Sample Code
  • 参考

1. 定义

Base64是一种基于64个字符的编码算法,根据RFC2045的定义:“Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别(The Base64 ContentTransfer Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable)”。经过Base64编码后的数据会比原始数据略长,为原来的4/3倍。经Base64编码后的字符串的字符数是以4为单位的整数倍。

2. 实现原理

Base64算法主要是对给定的字符以与字符编码(如ASCII码,UTF8码)对应的十进制数为基准,做编码操作:
1)将给定的字符串以字符为单位转换为对应的字符编码(如ASCII码)。
2)将获得的字符编码转换为二进制码。
3)对获得的二进制码做分组转换操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)。这是一个分组变化的过程,3个8位二进制码和4个6位二进制码的长度都是24位(3×8=4×6=24)。
4)对获得的4个6位二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码。
5)将获得的4个8位二进制码转换为十进制码。
6)将获得的十进制码转换为Base64字符表中对应的字符。

2.1 ASCII码字符编码

字符			A
ASCII码 	65
二进制码		01000001
4-6二进制码	010000 	  		010000
4-8二进制码	00010000  		00010000
十进制码		16        		16
字符表映射码	Q         		Q				=				=

2.2 非ASCII码字符编码

字符			密
UTF-8码		-27 			-81				-122
二级制码		11100101		10101111		10000110
4-6二级制码	111001			011010			111110			000110
4-8二进制码	00111001		00011010		00111110		00000110
十进制码		57				26				62				6
字符表映射码	5				a				+				G

3. 算法实现

3.1 Bouncy Castle

3.1.1 Maven Configuration

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.66</version>
</dependency>

3.1.2 Sample Code

org.bouncycastle.util.encoders.Base64

public String base64BcEncode(String data) throws UnsupportedEncodingException {final byte[] encode = Base64.encode(data.getBytes("UTF-8"));return new String(encode, "UTF-8");
}public String base64BcDecode(String data) throws UnsupportedEncodingException {final byte[] decode = Base64.decode(data.getBytes("UTF-8"));return new String(decode, "UTF-8");
}@Test
public void base64BcTest() throws UnsupportedEncodingException {String data = "我是阿汤哥";final String encoded = base64BcEncode(data);System.out.println(data + " after base64 encode : " + encoded);final String decoded = base64BcDecode(encoded);System.out.println(encoded + " after base64 decode : " + decoded);
}

运行结果

我是阿汤哥 after base64 encode : 5oiR5piv6Zi/5rGk5ZOl
5oiR5piv6Zi/5rGk5ZOl after base64 decode : 我是阿汤哥

3.2 Commons Codec

3.3.1 Maven Configuration

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version>
</dependency>

3.3.2 Sample Code

org.apache.commons.codec.binary.Base64

encodeBase64方法支持参数isChunked设置,如果设置isChunked = true,则经过base64编码的结果会分成大小76字符的字符块,以换行分隔。

public String base64CodecEncode(String data) throws UnsupportedEncodingException {final byte[] encode = Base64.encodeBase64(data.getBytes("UTF-8"), true);return new String(encode, "UTF-8");
}public String base64CodecDecode(String data) throws UnsupportedEncodingException {final byte[] decode = Base64.decodeBase64(data.getBytes("UTF-8"));return new String(decode, "UTF-8");
}@Test
public void base64BcTest() throws UnsupportedEncodingException {String data = "我是阿汤哥";final String encoded = base64CodecEncode(data);System.out.println(data + " after base64 encode : " + encoded);final String decoded = base64CodecDecode(encoded);System.out.println(encoded + " after base64 decode : " + decoded);
}

执行结果

我是阿汤哥 after base64 encode : 5oiR5piv6Zi/5rGk5ZOl5oiR5piv6Zi/5rGk5ZOlafter base64 decode : 我是阿汤哥

3.3 Java 8

Java8默认提供Base64编解码支持。java.util.Base64。

3.3.1 Sample Code

public String base64Jdk8Encode(String data) throws UnsupportedEncodingException {final byte[] encode = Base64.getEncoder().encode(data.getBytes("UTF-8"));return new String(encode, "UTF-8");
}public String base64Jdk8Decode(String data) throws UnsupportedEncodingException {final byte[] decode = Base64.getDecoder().decode(data.getBytes("UTF-8"));return new String(decode, "UTF-8");
}@Test
public void base64BcTest() throws UnsupportedEncodingException {String data = "我是阿汤哥";final String encoded = base64Jdk8Encode(data);System.out.println(data + " after base64 encode : " + encoded);final String decoded = base64Jdk8Decode(encoded);System.out.println(encoded + " after base64 decode : " + decoded);
}

执行结果

我是阿汤哥 after base64 encode : 5oiR5piv6Zi/5rGk5ZOl
5oiR5piv6Zi/5rGk5ZOl after base64 decode : 我是阿汤哥

参考

Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies

梁栋. Java加密与解密的艺术(第2版). 机械工业出版社. Kindle 版本.

这篇关于PKI - 电子邮件传输算法 - Base64 - 二进制的可视化展示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935477

相关文章

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

使用Folium在Python中进行地图可视化的操作指南

《使用Folium在Python中进行地图可视化的操作指南》在数据分析和可视化领域,地图可视化是一项非常重要的技能,它能够帮助我们更直观地理解和展示地理空间数据,Folium是一个基于Python的地... 目录引言一、Folium简介与安装1. Folium简介2. 安装Folium二、基础使用1. 创建

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1