基于openssl的base64加解密是怎样的

1.什么是base64 

base64指64个可打印字符,“A-Z” 、“a~z”、 “0~9” 、 “+” 、“/” 共64个。一般使用base64来表示二进制数据(二进制流的每个字节不可能全部是可见字符,所以就传送不了,可以采用base64转换后传输)。

2.使用openssl的库封装base64的加解密库

    1. 使用动态内存分

      /***********************************************
      * @Filename: base64_1_by_openssl.c
      * @Author:edwin
      * @Description: ---
      * @Create: 2020-12-21 10:19:20
      * @Last Modified: 2020-12-21 10:31:39
      ***********************************************/
      
      #include <string.h>
      #include <stdio.h>
      #include <stdbool.h>
      
      #include "openssl/evp.h"
      #include "openssl/bio.h"
      #include "openssl/buffer.h"
      
      char * base64_encode(const char *input, int length, bool newLine);
      char * base64_decode(const char *input, int length, bool newLine,int *outLength);
      
      int main(int argc, char* argv[])
      {
          bool newLine = false;
          char input[64] = "test string";
          int outlength;
          char * encode = base64_encode(input, strlen(input), newLine);
          char * decode = base64_decode(encode, strlen(encode), newLine,&outlength);
      	
          printf("base64 encode:%s\n",encode);
          printf("base64 decode:%s\n,output length:%d\n",decode,outlength);
          free(encode);
          free(decode);
          return 0;
      }
      
      // base64编码,输出长度为字符串的长度,如果需要可以再使用strlen获取
      char * base64_encode(const char *input, 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, input, 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 * base64_decode(const char *input, int length, bool newLine,int *outLength)
      {
          BIO *b64 = NULL;
          BIO *bmem = NULL;
          char *buffer = (char *)malloc(length);
          if(buffer == NULL){
              return NULL;
          }
          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);
          *outLength = BIO_read(bmem, buffer, length);
          BIO_free_all(bmem);
      
          return buffer;
      }

      2.    使用数组,报文相对稳定,这样降低系统开销(虽然可能微不足道)

      /***********************************************
      * @Filename: base64_2_by_openssl.c
      * @Author:edwin
      * @Description: ---
      * @Create: 2020-12-21 10:19:20
      * @Last Modified: 2020-12-21 11:33:41
      ***********************************************/
      
      #include <string.h>
      #include <stdio.h>
      #include <stdbool.h>
      
      #include "openssl/evp.h"
      #include "openssl/bio.h"
      #include "openssl/buffer.h"
      
      char * base64_encode(const char *input, int inputLength, bool newLine,char *output,int outputMaxLength);
      char * base64_decode(const char *input, int inputLength, bool newLine,char *output,int outputMaxLength,int *outLength);
      
      int main(int argc, char* argv[])
      {
          bool newLine = false;
          char input[64] = "Hello World!i\nsddsdds";
          char output[64];
          char * encode = base64_encode(input, strlen(input), newLine,output,64); 
          printf("base64 encode:%s\n",encode);
          int  outlength=0;
          char * decode = base64_decode(encode, strlen(encode), newLine,output,64,&outlength);
          printf("base64 decode:%s\n,output length:%d\n",output,outlength);
          return 0;
      }
      
      // base64 编码
      char * base64_encode(const char *input, int inputLength, bool newLine,char *output,int outputMaxLength)
      {
          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, input, inputLength);
          BIO_flush(b64);
          BIO_get_mem_ptr(b64, &bptr);
          BIO_set_close(b64, BIO_NOCLOSE);
          
          if(bptr->length >= outputMaxLength){
              BIO_free_all(b64);
              return NULL;
          }
          memcpy(output, bptr->data, bptr->length);
          output[bptr->length] = '\0';
          BIO_free_all(b64);
      
          return output;
      }
      
      // base64 解码,输出数组的大小应大于输入字符串大小以保证有足够空间
      char * base64_decode(const char *input, int inputLength, bool newLine,char *output,int outputMaxLength,int *outLength)
      {
          BIO *b64 = NULL;
          BIO *bmem = NULL;
          b64 = BIO_new(BIO_f_base64());
          if (!newLine) {
              BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
          }
          bmem = BIO_new_mem_buf(input, inputLength);
          bmem = BIO_push(b64, bmem);
          *outLength = BIO_read(bmem, output, inputLength);
      	if(*outLength >= outputMaxLength){
          	BIO_free_all(bmem);
      		return NULL;
      	}
      	output[*outLength] = '\0';
          BIO_free_all(bmem);
          return output;
      }

       

原创文章,作者:RBJTD,如若转载,请注明出处:http://www.wangzhanshi.com/n/16326.html

(0)
RBJTD的头像RBJTD
上一篇 2025年1月2日 12:39:08
下一篇 2025年1月2日 12:39:10

相关推荐

  • 如何解析openssl1.0.1滴血漏洞复现

    首先用shadan进行搜索主机 搜索格式为 openssl 1.0.1a 然后随便找一个请求为200的主机进行漏扫 一、使用专门的工具进行扫描 219.117.252.132 发现…

    2025年1月2日
  • windows配置ssl证书错误应该如何处理

    ssl证书是一种安全证书,这种证书一般配置在网上服务器当中的,因此该证书又被称之为服务器证书。这种证书能够对网站的信息安全保驾护航,所以很多企业都会给网站配置ssl证书。但是,这些…

    2025年1月2日
  • ssl证书如果未完成身份认证有什么影响

    一、SSL证书未完成身份认证 如果说没有ssl证书的出现,那么也就不会有电子商务的出现,那么也就不会出现这么多微商,快手卖东西的人,所以说这个ssl证书对于我们的网络安全真的是特别…

    2025年1月2日
  • 证书认证指的是什么

    SSL证书非常安全,相信这是大部分人对于SSL的直观认识。但是很多人不知道SSL证书在使用和配置之前还需要经过证书认证的环节,那么什么是证书认证呢,下面就来看看吧。 SSL本身是一…

    2025年1月2日
  • ssl证书与单域名证书有什么不同

    互联网的安全在当下是越来越重要了,给网站安装SSL证书,也是为了提升网站的安全性,SSL证书是加密传输的协议,SSL证书的种类比较多,根据网站的域名数量被分为了单域名SSL证书、多…

    2025年1月2日
  • 如何购买ssl证书,ssl证书多少钱?

    如何购买ssl证书,ssl证书多少钱?首先你得了解ssl证书,今天小编为了让大家更加了解ssl证书,小编给大家总结了以下内容,一起往下看吧。 当下的时代,人们对于网络安全方面的意识…

    2025年1月2日
  • php7安装openssl扩展的方法是什么

    php7安装openssl扩展的方法:1、进入openssl扩展目录;2、运行phpize;3、通过“yum install openssl”执行安装;4、打开php.ini添加“…

    2025年1月2日
  • SSL证书对企业网站的优势

    目前网站使用最多的是HTTP协议,用于从www服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。但它有一个很大的缺点:传输过程中的所有信息和数据都是明…

    ssl证书 2025年1月2日
  • OpenSSl生成SSL证书(支持https)

    一:环境与安装说明      WIN7_64,Nginx服务器,OpenSSL_Win64。本人使用phpStudy集成开发环境,使用Nginx+PH…

    2025年1月2日
  • 怎么在startssl中申请SSL证书

    先在 startssl.com 这个站点上申请一个免费的1年的 ssl证书 申请步骤比较简单, 你要先验证一个使用这个证书的域名, 会把验证码发送到域名注册邮箱里. 接下来是输入完…

    2025年1月2日

发表回复

登录后才能评论