20.1 OpenSSL 字符BASE64压缩算法

OpenSSL 是一种开源的加密库,提供了一组用于加密和解密数据、验证数字证书以及实现各种安全协议的函数和工具。它可以用于创建和管理公钥和私钥、数字证书和其他安全凭据,还支持SSL/TLSSSHS/MIMEPKCS等常见的加密协议和标准。

OpenSSL 的功能非常强大,可以用于构建安全的网络通信、加密文件和数据传输,还可以用于创建和验证数字签名、生成随机数等安全应用。它被广泛用于Web服务器、操作系统、网络应用程序和其他需要安全保护的系统中。

  • 官方地址: https://slproweb.com/products/Win32OpenSSL.html

如上所示的链接则是该库的官方网站,读者可自行下载对应版本的OpenSSL库,并运行安装程序,该库默认会被安装在根目录下,通过点击下一步即可很容易的完成安装配置。

该库安装成功后我们可以打开OpenSSL-Win32根目录,在目录中bin目录是可执行文件,OpenSSL的运行需要依赖于这些动态链接库,在使用时需要自行将本目录配置到环境变量内,其次include头文件lib静态库文件,在使用时读者需要自行配置到开发项目中,如下图所示;

OpenSSL库其本身就是一种加密与解密算法库,运用该库我们可以实现各类数据的加解密功能,首先我们以简单的Base64算法为例对该库进行使用。

Base64算法是一种用于将二进制数据编码为ASCII字符的算法。该算法将三个字节的二进制数据转换成四个字符的ASCII字符串,使得数据在传输时能够避免出现非法字符、特殊字符等问题,同时也可以将二进制数据转换为文本形式,方便在文本协议中传输,但读者需要注意Base64编码虽然可以作为一种简单的加密方式,但是它并不是一种真正的加密算法,因为它只是将数据转换为另一种形式,而没有对数据进行加密处理。

在OpenSSL中,使用Base64加密可以调用BIO_f_base64函数实现,该函数是一种BIO过滤器,用于将数据进行Base64编码和解码,如下代码中笔者分别封装实现了这两种加解密方法,其中base64Encode接收一个字符串并将该字符串压缩为编码字符串保存,与之相反base64Decode则用于将压缩后的字符串恢复。

#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/crypto.h>#pragma comment(lib,"libssl.lib")
#pragma comment(lib,"libcrypto.lib")// base64 编码
char* base64Encode(const char* buffer, int length, bool newLine)
{BIO* bmem = NULL;BIO* b64 = NULL;BUF_MEM* bptr;b64 = BIO_new(BIO_f_base64());if (!newLine){BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);}bmem = BIO_new(BIO_s_mem());b64 = BIO_push(b64, bmem);BIO_write(b64, buffer, length);BIO_flush(b64);BIO_get_mem_ptr(b64, &bptr);BIO_set_close(b64, BIO_NOCLOSE);char* buff = (char*)malloc(bptr->length + 1);memcpy(buff, bptr->data, bptr->length);buff[bptr->length] = 0;BIO_free_all(b64);return buff;
}// base64 解码
char* base64Decode(char* input, int length, bool newLine)
{BIO* b64 = NULL;BIO* bmem = NULL;char* buffer = (char*)malloc(length);memset(buffer, 0, length);b64 = BIO_new(BIO_f_base64());if (!newLine){BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);}bmem = BIO_new_mem_buf(input, length);bmem = BIO_push(b64, bmem);BIO_read(bmem, buffer, length);BIO_free_all(bmem);return buffer;
}

上述代码的使用也非常简单,如下所示我们通过传入一个input字符串,并将该字符串压缩后输出,接着再把该字符串解密后输出。

int main(int argc, char* argv[])
{// flag == false 将编码数据压缩为一行,否则原格式输出bool flag = false;std::string input = "Hello lyshark!";// 输出编码内容char* encode = base64Encode(input.c_str(), input.length(), flag);std::cout << "Base64 编码后: " << encode << std::endl;// 输出解码内容char* decode = base64Decode(encode, strlen(encode), flag);std::cout << "Base64 解码后: " << decode << std::endl;system("pause");return 0;
}

运行上述代码,读者可看到如下图所示的输出效果;

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

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

相关文章

8类放球问题

放球问题简介 放球问题是一类很有意思的排列组合问题。通俗来说&#xff0c;就是把n个小球放到m个盒子里&#xff0c;问有几种放法。根据小球是否相同&#xff0c;盒子是否相同&#xff0c;是否允许有空盒&#xff0c;又可以把问题细分为8个具体的问题。其中有一些问题是非常简…

516 最长回文子序列(区间DP)(灵神笔记)

题目 最长回文子序列 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s …

shell实验

1&#xff0e;编写脚本for1.sh&#xff0c;使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如&#xff1a;test1、test2、test3、....、test10 编写脚本&#xff0c;使用read -p提醒用户从键盘输入账户名前缀以…

[论文笔记]GTE

引言 今天带来今年的一篇文本嵌入论文GTE, 中文题目是 多阶段对比学习的通用文本嵌入。 作者提出了GTE,一个使用对阶段对比学习的通用文本嵌入。使用对比学习在多个来源的混合数据集上训练了一个统一的文本嵌入模型,通过在无监督预训练阶段和有监督微调阶段显著增加训练数…

hdlbits系列verilog解答(移位寄存器)-23

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 您将获得一个具有两个输入和一个输出的模块 my_dff &#xff08;实现 D 触发器&#xff09;。实例化其中的三个&#xff0c;然后将它们链接在一起以形成长度为 3 的移位寄存器。端口 clk 需要连接到所有实例。…

三篇论文:速览GPT在网络安全最新论文中的应用案例

GPT在网络安全领域的应用案例 写在最前面论文1&#xff1a;Chatgpt/CodeX引入会话式 APR 范例利用验证反馈LLM 的长期上下文窗口&#xff1a;更智能的反馈机制、更有效的信息合并策略、更复杂的模型结构、鼓励生成多样性和GPT类似的步骤&#xff1a;Conversational APR 对话式A…

Windows VS C++工程:包含目录、库目录、附加依赖项、附加包含目录、附加库目录配置与静态库、动态库的调用——以OCCI的配置为例

文章目录 1 包含目录&#xff08;Include Directories&#xff09;/ 附加包含目录&#xff08;Additional Include Directories&#xff09;1.1 区别和作用1.2 设置路径 2 库目录&#xff08;Library Directories&#xff09;/ 附加库目录&#xff08;Additional Library Direc…

element ui el-table表格纵向横向滚动条去除并隐藏空白占位列

需求 当table内容列过多时&#xff0c;可通过height属性设置table高度以固定table高度、固定表头&#xff0c;使table内容可以滚动 现在需求是右侧滚动条不好看&#xff0c;需要去除滚动条&#xff0c;并隐藏滚动条所占列的位置 // ----------修改elementui表格的默认样式-…

Jquery 如何获取子元素。如何找到所有 HTML select 标签的选中项。jQuery 里的 ID 选择器和 class 选择器有何不同

可以使用 jQuery 的子选择器&#xff08;Child Selector&#xff09;或 find() 方法来获取子元素。 子选择器&#xff08;Child Selector&#xff09;&#xff1a; 使用父元素的选择器和 > 符号来选取该父元素的子元素。 例如&#xff1a;选取 id 为 parent 的元素内所有 cl…

Spring MVC的常用注解

目录 RequestMapping 例子&#xff1a; RequestMapping 支持什么类型的请求 使 RequestMapping 只支持特定的类型 RestController 通过 HTTP 请求传递参数给后端 1.传递单个参数 注意使⽤基本类型来接收参数的情况 2.传递多个参数 3.传递对象 4.RequestParam 后端参数…

配置Super-VLAN下的DHCP服务器示例

组网需求 如图1所示&#xff0c;某公司拥有两个部门&#xff0c;为了节省IP地址&#xff0c;部门A和部门B规划为同一网段&#xff1b;为了提升业务安全性&#xff0c;将不同部门的用户划分到不同VLAN中。企业管理员为了方便统一管理&#xff0c;希望部门内终端通过DHCP服务器动…

npm 彻底卸载

问题&#xff1a; 执行 npm -v 指令出现如下报错&#xff1a; ERROR: npm v10.2.1 is known not to run on Node.js v12.10.0. This version of npm supports the following node versions: ^18.17.0 || >20.5.0. 分析&#xff1a; 由于编译环境问题&#xff0c;需要更新…

[Linux]文件路径名称含有‘/‘以及‘.‘的书写规则

用Linux就少不了命令行&#xff0c;用命令行就少不了天天和各种奇奇怪怪的文件路径打交道&#xff0c;运行深度学习项目每次都会遇到找不到文件的问题&#xff0c;所以弄清楚文件路径到底怎么写是一个很重要的问题&#xff1b; /的用法&#xff1a;绝对路径与相对路径 通法&a…

Linux编译安装brpc

一、安装brpc依赖项目 &#xff08;1&#xff09;安装 protobuf wget https://github.com/protocolbuffers/protobuf/releases/download/v21.9/protobuf-cpp-3.21.9.tar.gz tar -zxvf protobuf-cpp-3.21.9.tar.gz cd protobuf-3.21.9/ mkdir build && cd build cmake…

NX二次开发后处理中保存tcl变量值到文本

直接上代码&#xff1a; static bool GetTclValue(UF_MOM_id_t mom_id, char *szName, char *szInfo, std::string &stValue,bool bShowValue /* false*/) {UF_MOM_ask_string(mom_id, szName, (const char **)&szInfo);if (szInfo){stValue szInfo;if (bShowValue){…

【Spring】快速入门Spring Web MVC

文章目录 1. 什么是Spring Web MVC1.1 MVC1.2 Spring MVC 2. 使用Spring MVC2.1 项目创建2.2 建立连接2.2.1 RequestMapping 注解2.2.2 RestController 注解2.2.3 RequestMapping 使⽤2.2.4 RequestMapping 是什么请求&#xff1f;POST&#xff1f;GET&#xff1f;…&#xff1…

FL Studio21最新中文版DAW数字音频工作站

大概从去年开始&#xff0c;“电子音乐制作技术”成为越来越常见的说法。一开始我们觉得这种说法太过于笼统&#xff0c;因为电子音乐制作的技术早已不限于用在电子音乐&#xff0c;它更像是现代音乐制作技术。毕竟现代化的90%的音乐都是这么做出来的。 对&#xff0c;我们说的…

ESP32-C3 低功耗懒人开关:传统开关轻松上云和本地控制

项目背景 随着科技的快速发展&#xff0c;智能家居已经成为我们日常生活的一部分。而对于基础设施已经配备完毕的家庭而言&#xff0c;对家居设备的智能化改造是一项相对困难的工作。本文将分享一款基于 Wi-Fi 的低功耗懒人开关—— “ESP32-C3 管灯熊猫”。将智能的 “ESP32-…

Spring概述

Spring概述 Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Java 平台&#xff0c;它最初是由 Rod Johnson 编写的&#xff0c;并且于 2003 …

【EI会议征稿】 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)

2024年遥感、测绘与图像处理国际学术会议(RSMIP2024) 2024 International Conference on Remote Sensing, Mapping and Image Processing 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)将于2024年1月19日-21日在中国厦门举行。会议主要围绕遥感、测绘与图像处理等研究领…