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

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.