首页 > 编程语言 >20.1 OpenSSL 字符BASE64压缩算法

20.1 OpenSSL 字符BASE64压缩算法

时间:2023-10-28 09:02:39浏览次数:42  
标签:20.1 bmem b64 BASE64 BIO OpenSSL char length 压缩算法

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

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

如上所示的链接则是该库的官方网站,读者可自行下载对应版本的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;
}

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

标签:20.1,bmem,b64,BASE64,BIO,OpenSSL,char,length,压缩算法
From: https://www.cnblogs.com/LyShark/p/17793471.html

相关文章

  • 我的世界1.20.1模组开发---4.添加方块
    介绍  在游戏中添加方块的方法和之前添加物品的方法类似,都是先通过DeferredRegister.create方法获取对应类型的注册表,然后再把对应的方块添加到注册表中,最后在Mod事件总线上添加该注册表即可。但是由于是方块,会有一些地方和物品不太一样的地方。添加一个方块要分别注册方块和方......
  • Base64 编解码
    0.Base64的由来目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或再次Base64)传输。那么,Base64到底起到什么作用呢?在参数传输的过程中经常遇到的一种情况:使用全英......
  • 我的世界1.20.1模组开发---3.数据生成
    介绍  我们在模组里每添加一个物品或方块后,在游戏里显示的都只是马赛克,因为我们还没有为我们的物品或方块设置对应的模型贴图。我的世界游戏里,每一个物品和方块我们所看到的样子都是一张张贴图,就是画的像素画,贴在了一个模型表面。我们想设置对应的贴图,需要写一个对应的json文件......
  • 图片与Base64互转
    ///<summary>///Base64转图片///</summary>///<paramname="data"></param>publicImageBase64ToImage(stringdata){data=data.Replace("data:image/png;base64,","").Replace("data:image/jgp;b......
  • ubuntu 20.1 (linux) 下软件安装教程(基本上都是使用命令行安装)
    一、node1.安装教程#第二步,添加源后安装需要什么版本直接替换后面的数字即可,如果需要21,直接将20替换为21就可以了curl-sLhttps://deb.nodesource.com/setup_20.x|sudo-Ebash-#开始进行安装sudoaptinstall-ynodejs#https://learnku.com/articles/42581#......
  • Android 一例Base64错误问题
    在Android11下正常,8.1下不正常修改importimportorg.apache.commons.codec.binary.Base64;为importandroid.util.Base64;publicstaticStringencrypt(Stringdata){try{SecretKeysecretKey=newSecretKeySpec(SECRET_KEY.getBytes(),ENCRYPT......
  • java图片转base64(不换行)
    publicstaticStringImageToBase64(StringimgPath){InputStreamin=null;byte[]data=null;//读取图片字节数组try{in=newFileInputStream(imgPath);data=newbyte[in.available()];in.read(data);in.close();}catc......
  • vue中使用Base64加密、解密
    Base64加密、解密第一步:npminstalljs-base64--save下载依赖第二步:   直接引入即可import{Base64}from'js-base64';第三步:Base64.encode(xxxx)其中  .encode()加密       .decode()解密中间不需要使用加密的key等其他字符......
  • USACO 2020.12 Platinum Spaceship
    洛谷传送门LOJ传送门考虑剥路径最大值dp,设\(f_{k,i,j}\)为\(i\toj\)中按的最大的按钮\(\lek\)的方案数。转移枚举按下最大值按钮的点\(w\),有:\[f_{k,i,j}=\sum\limits_{(u,w),(w,v)\inE}f_{k-1,i,u}f_{k-1,v,j}\]在外层枚举\(w\),设\(g_i\)......
  • Base64初认识
    BASE64编码是一种将二进制数据转换为可打印字符的编码方式,解决文本协议中不能直接传输二进制数据的问题。以下是Base64编码的基本步骤:将数据划分为3个字节一组(24位)。将每个字节转换为8位二进制形式。将24位数据按照6位一组进行划分,得到4个6位的组。将每个6......