20.1 OpenSSL 字符BASE64压缩算法

简介: OpenSSL 是一种开源的加密库,提供了一组用于加密和解密数据、验证数字证书以及实现各种安全协议的函数和工具。它可以用于创建和管理公钥和私钥、数字证书和其他安全凭据,还支持`SSL/TLS`、`SSH`、`S/MIME`、`PKCS`等常见的加密协议和标准。OpenSSL 的功能非常强大,可以用于构建安全的网络通信、加密文件和数据传输,还可以用于创建和验证数字签名、生成随机数等安全应用。它被广泛用于Web服务器、操作系统、网络应用程序和其他需要安全保护的系统中。

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;
}

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

目录
相关文章
|
3月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
3月前
|
算法 测试技术 C++
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
|
4月前
|
算法 测试技术 C#
【状态压缩】【动态规划】【C++算法】691贴纸拼词
【状态压缩】【动态规划】【C++算法】691贴纸拼词
|
1天前
|
机器学习/深度学习 人工智能 算法
【图像版权】论文阅读:CRMW 图像隐写术+压缩算法
【图像版权】论文阅读:CRMW 图像隐写术+压缩算法
7 0
|
6月前
|
存储 算法 NoSQL
Zstandard (zstd)压缩算法在JAVA上的使用
Zstandard (zstd)压缩算法在JAVA上的使用
290 0
|
7月前
|
算法
【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等
【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等
|
3月前
|
算法 测试技术 C++
【状态压缩】【动态规划】【C++算法】691贴纸拼词
【状态压缩】【动态规划】【C++算法】691贴纸拼词
|
4月前
|
SQL 存储 编解码
Hive中的压缩技术是如何实现的?请解释其原理和常用压缩算法。
Hive中的压缩技术是如何实现的?请解释其原理和常用压缩算法。
28 0
|
5月前
|
存储 设计模式 算法
【数据结构和算法】压缩字符串
给你一个字符数组chars,请使用下述算法压缩: 从一个空字符串s开始。对于chars中的每组连续重复字符: 如果这一组长度为1,则将字符追加到s中。 否则,需要向s追加字符,后跟这一组的长度。 压缩后得到的字符串s不应该直接返回,需要转储到字符数组chars中。需要注意的是,如果组长度为10或10以上,则在chars数组中会被拆分为多个字符。 请在修改完输入数组后,返回该数组的新长度。
68 1
|
5月前
|
存储 分布式计算 算法
MapReduce计数器,Tash的运行机制,shuffle过程,压缩算法
MapReduce计数器,Tash的运行机制,shuffle过程,压缩算法
22 0