openssl研发之base64编解码实例

一、base64编码介绍

Base64编码是一种将二进制数据转换成ASCII字符的编码方式。它主要用于在文本协议中传输二进制数据,例如电子邮件的附件、XML文档、JSON数据等。

Base64编码的特点如下:

  1. 字符集: Base64编码使用64个字符来表示二进制数据,通常使用字母(A-Z、a-z)、数字(0-9)和两个特殊字符(+ 和 /)。有时候,根据具体需求,可能会使用不同的字符集,比如URL安全的Base64编码会使用字符集 A-Za-z0-9-_,其中 “-” 和 “_” 替代了 “+” 和 “/”。

  2. 长度增加: Base64编码通常会导致编码后的数据长度略微增加。每三个字节的二进制数据编码成四个Base64字符。

  3. 填充字符: 如果最后一组不足三个字节,Base64编码会使用一个或两个等号 “=” 进行填充。

  4. 可逆性: Base64编码是可逆的,可以通过解码还原回原始的二进制数据。

  5. 广泛应用: Base64编码广泛应用于数据传输,特别是在文本协议中,以及在一些数据存储和表示的场景中。

下面是一个简单的示例,展示如何对字符串 “Hello, World!” 进行Base64编码:

原始字符串:Hello, World!

Base64编码:SGVsbG8sIFdvcmxkIQ==

二、base64编码原理

Base64编码的原理基于将二进制数据转换成一组可打印字符的过程。它是一种用64个字符来表示所有可能的6位二进制数的方法。以下是Base64编码的基本原理:

  1. 将数据划分成固定长度的块: 首先,将要编码的数据按照一定的规则划分成固定长度的块。通常是每三个字节划分为一组,因为每组有3个字节(24位),正好可以表示为4个Base64字符。

  2. 将块中的二进制数据转换为整数: 将每个块中的三个字节的二进制数据转换为一个24位的整数。这个整数的取值范围是0到2^24-1。

  3. 将整数按6位一组划分: 将上一步得到的整数按照6位一组划分成四组。因为2^6等于64,所以每组的取值范围是0到63。

  4. 将每组的值映射到Base64字符集: 将每一组得到的数值映射到Base64字符集。Base64字符集通常包含64个字符,例如字母A-Z、a-z、数字0-9,以及两个额外的字符(通常是"+“和”/")。这样就得到了四个Base64字符。

  5. 处理末尾的填充: 如果原始数据的长度不是3的倍数,那么最后一个块可能不足3个字节。在这种情况下,会使用一个或两个等号 “=” 进行填充,以保证每个块都是4个Base64字符。

举个例子,假设要编码的数据是"ABC",对应的ASCII码为65、66、67,转换成二进制分别是01000001、01000010、01000011。将这三个字节拼接在一起得到24位的二进制数,然后按照上述步骤转换为Base64编码。最后得到的Base64编码为"QUJD"。

这个过程是可逆的,也就是说,可以通过反向的过程将Base64编码解码回原始的二进制数据。在实际应用中,Base64编码常用于在文本协议中传输二进制数据,或者将二进制数据嵌入到文本文件中。

三、base64开发实例

#include <iostream>
#include <cstring>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>std::string base64_encode(const unsigned char* input, int length) {BIO* bio = BIO_new(BIO_f_base64());BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);BIO* bmem = BIO_new(BIO_s_mem());bio = BIO_push(bio, bmem);BIO_write(bio, input, length);BIO_flush(bio);BUF_MEM* bptr;BIO_get_mem_ptr(bio, &bptr);std::string result(bptr->data, bptr->length);BIO_free_all(bio);return result;
}std::string base64_decode(const char* input) {BIO* bio = BIO_new(BIO_f_base64());BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);BIO* bmem = BIO_new_mem_buf(input, -1);bio = BIO_push(bio, bmem);char buffer[1024];int length = BIO_read(bio, buffer, sizeof(buffer));BIO_free_all(bio);return std::string(buffer, length);
}int main() {const char* originalText = "Hello, Base64!";int originalLength = std::strlen(originalText);// Base64 编码std::string encodedText = base64_encode(reinterpret_cast<const unsigned char*>(originalText), originalLength);std::cout << "Base64 Encoded: " << encodedText << std::endl;// Base64 解码std::string decodedText = base64_decode(encodedText.c_str());std::cout << "Base64 Decoded: " << decodedText << std::endl;return 0;
}

编译

 g++ main.cpp -o main -lssl -lcrypto

运行结果如下:
在这里插入图片描述

四、源码地址

https://gitcode.net/arv002/qt/-/tree/master/Openssl/hash/base64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/138995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SparkSQL语法优化

SparkSQL在整个执行计划处理的过程中&#xff0c;使用了Catalyst 优化器。 1 基于RBO的优化 在Spark 3.0 版本中&#xff0c;Catalyst 总共有 81 条优化规则&#xff08;Rules&#xff09;&#xff0c;分成 27 组&#xff08;Batches&#xff09;&#xff0c;其中有些规则会被归…

uniapp——项目02

分类 创建cate分支 渲染分类页面的基本结构 效果页面,包含左右两个滑动区. 利用提供的api获取当前设备的信息。用来计算窗口高度。可食用高度就是屏幕高度减去上下导航栏的高度。 最终效果: 每一个激活项都特殊背景色&#xff0c;又在尾部加了个红条一样的东西。 export d…

python3GUI--QQ音乐By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;展示0.播放页1.主界面1.精选2.有声电台3.排行4.歌手5.歌单 2.推荐3.视频1.视频2.分类3.视频分类 4.雷达5.我喜欢1.歌曲2.歌手 6.本地&下载7.最近播放8.歌单1.一般歌单2.自建歌单3.排行榜 9.其他1.搜索词推荐2.搜索结果 三&#x…

ElasticSearch7.x - HTTP 操作 - 文档操作

创建文档(添加数据) 索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数 据库中的表数据,添加的数据格式为 JSON 格式 向 ES 服务器发 POST 请求 :http://192.168.254.101:9200/shopping/_doc 请求体内容为: {"title":"小…

智慧城市建设解决方案分享【完整】

文章目录 第1章 前言第2章 智慧城市建设的背景2.1 智慧城市的发展现状2.2 智慧城市的发展趋势 第3章 智慧城市“十二五”规划要点3.1 国民经济和社会发展“十二五”规划要点3.2 “十二五”信息化发展规划要点 第4章 大数据&#xff1a;智慧城市的智慧引擎4.1 大数据技术—智慧城…

智慧城市照明为城市节能降耗提供支持继电器开关钡铼S270

智慧城市照明&#xff1a;为城市节能降耗提供支持——以钡铼技术S270继电器开关为例 随着城市化进程的加速&#xff0c;城市照明系统的需求也日益增长。与此同时&#xff0c;能源消耗和环境污染问题日益严重&#xff0c;使得城市照明的节能减排成为重要议题。智慧城市照明系统…

Linux技能篇-yum源搭建(本地源和公网源)

文章目录 前言一、yum源是什么&#xff1f;二、使用镜像搭建本地yum源1.搭建临时仓库第一步&#xff1a;挂载系统ios镜像到虚拟机第二步&#xff1a;在操作系统中挂载镜像第三步&#xff1a;修改yum源配置文件 2.搭建本地仓库第一步&#xff1a;搭建临时yum源来安装httpd并做文…

javaEE案例,前后端交互,计算机和用户登录

加法计算机,前端的代码如下 : 浏览器访问的效果如图 : 后端的代码如下 再在浏览器进行输入点击相加,就能获得结果 开发中程序报错,如何定位问题 1.先定位前端还是后端(通过日志分析) 1)前端 : F12 看控制台 2)后端 : 接口,控制台日志 举个例子: 如果出现了错误,我们就在后端…

如何查看网站的https的数字证书

如题 打开Chrome浏览器&#xff0c;之后输入想要抓取https证书的网址&#xff0c;此处以知乎为例点击浏览器地址栏左侧的锁的按钮&#xff0c;如下图 点击“连接是安全的”选项&#xff0c;如下图 点击“证书有效”选项卡&#xff0c;如下图 查看基本信息和详细信息 点击详细信…

C/C++数字判断 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C数字判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C数字判断 2021年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个字符&#xff0c;如何输入的字符是数字&#x…

Spark的转换算子和操作算子

1 Transformation转换算子 1.1 Value类型 1&#xff09;创建包名&#xff1a;com.shangjack.value 1.1.1 map()映射 参数f是一个函数可以写作匿名子类&#xff0c;它可以接收一个参数。当某个RDD执行map方法时&#xff0c;会遍历该RDD中的每一个数据项&#xff0c;并依次应用f函…

Mac下eclipse配置JDK

一、配置JDK&#xff0c;需要电脑下载Java并且配置环境 Mac环境配置&#xff08;Java&#xff09;----使用bash_profile进行配置&#xff08;附下载地址&#xff09; (1)、左上角找到“Eclipse”-->“Preferences...” (2)、找到“Java”-->“Installde JREs”-->界…

S7-1200PLC和SMART PLC开放式以太网通信(UDP双向通信)

S7-1200PLC的以太网通信UDP通信相关介绍还可以参考下面文章链接: 博途PLC开放式以太网通信TRCV_C指令应用编程(运动传感器UDP通信)-CSDN博客文章浏览阅读2.8k次。博途PLC开放式以太网通信TSENG_C指令应用,请参看下面的文章链接:博途PLC 1200/1500PLC开放式以太网通信TSEND_…

AI:73-结合语法知识的神经机器翻译研究

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

HTTPS的工作流程

. HTTPS是什么&#xff1f; https是应用层中的一个协议&#xff0c;是在http协议的基础上引入的一个加密层。 为什么需要HTTPS 由于http协议内容都是按照文本的方式明文传输的&#xff0c;这就导致传输过程中会出现一些被篡改的情况。运营商劫持事件最开始百度&#xff0c;…

云栖大会丨桑文锋:打造云原生数字化客户经营引擎

近日&#xff0c;2023 云栖大会在杭州举办。今年云栖大会回归了 2015 的主题&#xff1a;「计算&#xff0c;为了无法计算的价值」。神策数据创始人 & CEO 桑文锋受邀出席「生态产品与伙伴赋能」技术主题&#xff0c;并以「打造云原生数字化客户经营引擎」为主题进行演讲。…

CSS特效006:绘制不断跳动的心形

css实战中&#xff0c;怎么绘制不断跳动的心形呢&#xff1f; 绘图的时候主要用到了transform: rotate(-45deg); transform-origin: 0 100%; transform: rotate(45deg); transform-origin: 100% 100%; 动画使用keyframes 时间上为infinite。 效果图 源代码 /* * Author: 大剑…

迅为龙芯3A5000主板,支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 VGA,可直连显示器

性能强 采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。 桥片 桥片采用龙芯 7A2000&#xff0c;支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 …

web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中

好 上文web3通过antd 在React dapp中构建订单组件基本结构我们算是把一个基本的订单组件展示做出来了 然后 我们继续 起一下环境先 ganache 终端运行 ganache -dMetaMask 登录一下 然后 打开项目 发布一下合约 truffle migrate --reset然后 运行一下 测试脚本 转入交易所 E…

excel中超级表和普通表的相互转换

1、普通表转换为超级表 选中表内任一单元格&#xff0c;然后按CtrlT&#xff0c;确认即可。 2、超级表转换为普通表 选中超级表内任一单元格&#xff0c;右键&#xff0c;表格&#xff0c;转换为区域&#xff0c;确定即可。 这时虽然已经变成了普通表&#xff0c;但样式没有…