一看就懂的Base64算法原理及应用

简介: Base64是一种基于64个字符的编码算法,根据RFC 2045的定义:“Base64内容传送编码是以一种任意8位字节序列组合的描述形式,这种形式不易被人直接识别"。经过Base64编码后的数据会比原始数据略长,为原来的4/3倍。字符串的字符数是以4位单位的整数倍。

一、Base64简介



Base64是一种基于64个字符的编码算法,根据RFC 2045的定义:“Base64内容传送编码是以一种任意8位字节序列组合的描述形式,这种形式不易被人直接识别"。经过Base64编码后的数据会比原始数据略长,为原来的4/3倍。字符串的字符数是以4位单位的整数倍。


二、实现原理



  1. 将给定的字符串以字符为单位,转换为对应的字符编码(ASCII)
  2. 将获得的字符编码转换为二进制码
  3. 对获得的二进制编码做分组操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)
  4. 对获得的4-6二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码
  5. 将获得的4-8二进制码转换为十进制码
  6. 将获得的十进制码转换为Base64字符表中对应的字符


三、Base64字符映射表



640.png

在这里插入图片描述


1. ASCII码加密推导演示


字符          B
ASCII码       66(不足24位)
二进制码      01000010
4-6二进制码   010000     100000 (不足低位补0)
4-8二进制码   00010000   00100000 (高位补0)
十进制码      16         32
字符表映射码  Q          g      =    =  (不足4个的补=)


2. UTF-8码介绍


UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。


如表(补位): 
1字节 0xxxxxxx 
2字节 110xxxxx 10xxxxxx 
3字节 1110xxxx 10xxxxxx 10xxxxxx 
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx


3. UTF-8加密推导演示


字符          爱
utf-8         %u7231
二进制转换    0111(7)    0010(2)    0011(3)    0001(1)  //括号对应上面的utf-8码
二进制码      (1110)0111 (10)001000 (10)110001  //括号里为填充码
4-6二进制码   111001     111000     100010     110001
4-8二进制码   00111001   00111000   00100010   00110001
十进制码      57         56         34         49
字符映射码    5          4          i          x


四、Base64算法两大实现比较



Bouncy CastleCommons Codec两大开源组件提供了一般Base64算法的实现。


1. 区别:


  1. Bouncy Castle遵循的是一般Base64算法,也就是简单的根据字符映射表做了编码转换。
  2. Commons Codec遵循RFC 2045的相关定义,同时也支持一般Base64算法的实现。
  3. Commons Codec还提供了Base64算法的定制实现,可以自定义字符数和行末符号。
  4. Commons Codec还提供了输入输出流的实现


2. Bouncy Castle代码演示:


//jar包引入
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.61</version>
</dependency>
//Castle工具类
import org.bouncycastle.util.encoders.Base64;
public class CastlesUtil {
    //字符编码集
    public static final String ENCODING = "UTF-8";
    /**
     * 将字符串类型进行Base64编码
     * @param data 明文
     * @return 密文
     * @throws Exception
     */
    public static String encode(String data) throws Exception {
        //执行编码
        byte[] bytes = Base64.encode(data.getBytes(ENCODING));
        return new String(bytes,ENCODING);
    }
    /**
     * 解码
     * @param data 密文
     * @return 明文
     * @throws Exception
     */
    public static String decode(String data) throws Exception {
        //执行解码
        byte[] bytes = Base64.decode(data);
        return new String(bytes,ENCODING);
    }
}
//单元测试
@Test
public void test(){
    try {
        //加密
        String str = "梵如花";
        System.out.println("原文:"+str);
        str = CastlesUtil.encode(str);
        System.out.println("密文:"+str);
        //解密
        System.out.println("解密:"+CastlesUtil.decode(str));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
//打印结果
原文:梵如花
密文:5qK15aaC6Iqx
解密:梵如花


3. Commons Codec代码演示:


//引入jar包
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.12</version>
</dependency>
//Commons工具类
import org.apache.commons.codec.binary.Base64;
public class CommonsUntils {
    //字符编码集
    public static final String ENCODING = "UTF-8";
    public static String encode(String data) throws Exception {
        //执行编码
        byte[] bytes = Base64.encodeBase64(data.getBytes(ENCODING));
        return new String(bytes,ENCODING);
    }
    public static String encodeSafe(String data) throws Exception {
        //执行编码
        byte[] bytes = Base64.encodeBase64(data.getBytes(ENCODING),true);
        return new String(bytes,ENCODING);
    }
    public static String decode(String data) throws Exception {
        //执行解码
        byte[] bytes = Base64.decodeBase64(data);
        return new String(bytes,ENCODING);
    }
}
//单元测试
@Test
public void test(){
    try {
        //加密
        String str = "梵如花是一个好的县令,没有错的哈哈哈哈哈哈哈哈哈哈或或";
        System.out.println("原文:"+str);
        str = CommonsUntils.encode(str);
        System.out.println("普通加密:"+str);
        str = "梵如花是一个好的县令,没有错的哈哈哈哈哈哈哈哈哈哈或或";
        str = CommonsUntils.encodeSafe(str);
        System.out.println("安全加密:"+str);
        //解密
        System.out.println("解密:"+CommonsUntils.decode(str));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
//输出结果,注意的是,如果str比较短,则安全和非安全的输出结果是一致的
原文:梵如花是一个好的县令,没有错的哈哈哈哈哈哈哈哈哈哈或或
普通加密:5qK15aaC6Iqx5piv5LiA5Liq5aW955qE5Y6/5Luk77yM5rKh5pyJ6ZSZ55qE5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5oiW5oiW
安全加密:5qK15aaC6Iqx5piv5LiA5Liq5aW955qE5Y6/5Luk77yM5rKh5pyJ6ZSZ55qE5ZOI5ZOI5ZOI5ZOI
5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5oiW5oiW


五、Url Base64算法



Bouncy Castle遵从了RFC 4648的建议,使用"."做填充符,构建定长Url Base64编码;

Commons Codec舍弃了填充符,使用不定长Url Base64编码。


byte[] byts = Base64.encode("梵如花是一个好的县令,没有错的哈哈哈哈哈哈哈哈哈哈或或".getBytes("utf-8"));
System.out.println("普通加密:"+new String(byts,"utf-8"));
byte[] bytes = UrlBase64.encode("梵如花是一个好的县令,没有错的哈哈哈哈哈哈哈哈哈哈或或".getBytes("utf-8"));
System.out.println("url:"+new String(bytes,"utf-8"));
//打印结果:
普通加密:5qK15aaC6Iqx5piv5LiA5Liq5aW955qE5Y6/5Luk77yM5rKh5pyJ6ZSZ55qE5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5oiW5oiW
url:5qK15aaC6Iqx5piv5LiA5Liq5aW955qE5Y6_5Luk77yM5rKh5pyJ6ZSZ55qE5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5ZOI5oiW5oiW


六、应用场景



Base64算法广泛应用于电子邮件传输,网络信息传输,以及密钥和证书文件的文本式保存。在数据保密要求强度不高的情况下,可以使用Base64算法做简单的数据加密。

目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
117 65
|
3天前
|
存储 人工智能 自然语言处理
算法、系统和应用,三个视角全面读懂混合专家(MoE)
【8月更文挑战第17天】在AI领域,混合专家(MoE)模型以其独特结构成为推动大型语言模型发展的关键技术。MoE通过动态选择专家网络处理输入,实现条件计算。稀疏型MoE仅激活部分专家以减少计算负担;软MoE则加权合并专家输出提升模型稳定性。系统层面,MoE优化计算、通信与存储,利用并行化策略提高效率。在NLP、CV、推荐系统等领域展现强大应用潜力,但仍面临训练稳定性、可解释性等挑战。[论文链接: https://arxiv.org/pdf/2407.06204]
143 63
|
4天前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
5天前
|
算法 Java 测试技术
算法分析(蛮力法与减治算法应用实验报告)
这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。
算法分析(蛮力法与减治算法应用实验报告)
|
12天前
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
97 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】探讨最新的深度学习算法、模型创新以及在图像识别、自然语言处理等领域的应用进展
深度学习作为人工智能领域的重要分支,近年来在算法、模型以及应用领域都取得了显著的进展。以下将探讨最新的深度学习算法与模型创新,以及它们在图像识别、自然语言处理(NLP)等领域的应用进展。
16 6
|
1天前
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
|
2天前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
13 2
|
3天前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】机器学习的基本概念、算法的工作原理、实际应用案例
机器学习是人工智能的一个分支,它使计算机能够在没有明确编程的情况下从数据中学习并改进其性能。机器学习的目标是让计算机自动学习模式和规律,从而能够对未知数据做出预测或决策。
8 2
|
4天前
|
机器学习/深度学习 算法 数据可视化
决策树算法介绍:原理与案例实现
决策树算法介绍:原理与案例实现