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字符串与图片互转的详细步骤

《使用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.

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl