数据源:我们通过BIO_new申请了内存的BIO对象,表示我们把数据写入到BIO中。
过滤器:通过过滤器处理数据,提供了多种方法。比如一个数据进入之后,先做md5,做完md5之后,再交给Base64来生成最终数据,md5是哈希值,生成二进制,通过Base64处理为字符,进行输出。
BIO链:BIO_PUSH使得数据形成了一个链表。对这个链表数据进行读写操作。
如下代码:

#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <iostream>using namespace std;int Base64Decode(const char* in, int len, unsigned char* out_data)
{if (!in || len <= 0 || !out_data)return 0;//内存源(密文)auto mem_bio = BIO_new_mem_buf(in, len);if (!mem_bio)return 0;//base64过滤器auto b64_bio = BIO_new(BIO_f_base64());if (!b64_bio){BIO_free(mem_bio);return 0;}//形成BIO链BIO_push(b64_bio, mem_bio);//默认读取换行符做结束BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL);//读取 解码 4字节转3字节size_t size = 0;BIO_read_ex(b64_bio, out_data, len,&size);BIO_free_all(b64_bio);return size;
}int Base64Encode(const unsigned char* in, int len, char* out_base64)
{if (!in || len < 0 || !out_base64)return 0;//内存源 sourceauto mem_bio = BIO_new(BIO_s_mem());if (!mem_bio)return 0;//base64 filterauto b64_bio = BIO_new(BIO_f_base64());if (!b64_bio){BIO_free(mem_bio);return 0;}//形成BIO链表//b64-memBIO_push(b64_bio, mem_bio);//超过64字节不添加换行符(\n),编码的数据在一行中BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL);//写入到base64_filter进行编码,结果会传递到链表的下一个结点//到mem中读取结果(链表头部代表了整个链表)//BIO_write 编码 3字节=>4字节,不足3字节补充0和=//注意:编码数据每64字节会加\n换行符,默认结尾处是有换行符的,超过64位的时候再添一个int re = BIO_write(b64_bio, in, len);if (re < 0){//清空整个链表结点BIO_free_all(b64_bio);return 0;}//刷新下缓冲,写入链表的memBIO_flush(b64_bio);int outsize = 0;//从链表源内存读取BUF_MEM* p_data = 0;BIO_get_mem_ptr(b64_bio, &p_data);if (p_data){memcpy(out_base64, p_data->data, p_data->length);outsize = p_data->length;}BIO_free_all(b64_bio);return outsize;
}int main()
{cout << "first openssl BIO based!" << endl;unsigned char data[] = "测试64数据你好哈你好哈你好哈你好哈你好哈你好哈你好哈你好哈你好哈";int len = sizeof(data);char out[1024] = { 0 };unsigned char out2[1024] = { 0 };cout << "source:" << data << endl;int re = Base64Encode(data, len, out);if (re > 0){out[re] = '\0';cout <<"encode:["<< out << "]" << ";;;;" << endl;}re = Base64Decode(out, re, out2);cout <<"decode:" << out2 << endl;getchar();return 0;
}

C++安全方向(二):2.4 openssl_BIO接口解析相关推荐

  1. 【连载】人类唯一的出路:变成人工智能(二)脑机接口

    在一个由人工智能和"其他所有生物"组成的未来, 人类只有一条出路:"变成人工智能." 本长文作者是Tim Urban,之前火热的文章<为什么有很多名人让人 ...

  2. PC端微信扫码支付二维码生成接口的调整

    目前原有的example下面的在线二维码生成接口被微信取消了,从而需要各个电商系统自己生成. 可参考开发文章demo中的phpqrcode.php程序进行生成并保存到电商系统本身的服务器上,然后取出进 ...

  3. Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)

    说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...

  4. 工行二维码支付接口及回调接口

    工行的接口文档详见:工行开放平台地址 生成二维码 /*** 获取支付二维码* * @param outTradeNo* @param orderAmt* @param attach* @param n ...

  5. FPGA实现的SPI协议(二)----基于SPI接口的FLASH芯片M25P16的使用

    写在前面 SPI协议系列文章: FPGA实现的SPI协议(一)----SPI驱动 FPGA实现的SPI协议(二)----基于SPI接口的FLASH芯片M25P16的使用 在上篇文章,简要介绍了SPI协 ...

  6. 好用的二维码API接口

    使用方法很简单,替换 https://www.pandajack.top 为想要生成的文字或链接即可. https 二维码生成 api (如果二维码不显示,说明接口已失效) 1.搜狐视频提供的二维码 ...

  7. 微信支付之01------获取订单微信支付二维码的接口------Java实现

    [ 前言:以前写过一个获取微信二维码支付的接口,发现最近公司新开的项目会经常用到,现在我又翻出代码看了一遍,觉得还是把整个代码流程记下来的好 ] 借鉴博客: 他这篇博客写得不错,挺全的:https:/ ...

  8. 分享腾讯官方二维码生成接口地址

    分享腾讯官方二维码生成接口地址 接口抓包来自腾讯QQ群的二维码生成接口,非常稳定,可以长期使用!除非腾讯不做了!! https://qun.qq.com/qrcode/index?data=

  9. 小程序带参数二维码生成接口

    获取二维码 通过后台接口可以获取小程序任意页面的二维码,扫描该二维码可以直接进入小程序对应的页面.目前微信支持两种二维码,小程序码(左),小程序二维码(右),如下所示: 获取小程序码 我们推荐生成并使 ...

最新文章

  1. 模板引擎(smarty)知识点总结II
  2. Android ADB Server启动失败
  3. 汇编实验 分类统计字符个数(debug中查看统计结果)
  4. 技术解析系列 | PouchContainer 富容器技术
  5. Java多线程之CountDownLatch用法
  6. idea中Java项目连接服务器进行debug查看
  7. 如何解决Filezilla 与虚拟机连接不上的问题
  8. 巧用windows xp远程桌面web连接
  9. 韩顺平.2011最新版.玩转oracle视频教程笔记,韩顺平.2011最新版.玩转oracle视频教程(笔记)...
  10. python123判断字符串结尾_Python学习教程:在字符串的开头和结尾处做文本匹配
  11. 第十一章、认识与学习BASH
  12. c语言函数调用求阶乘和
  13. 百度文库和豆丁网的在线文档阅读功能
  14. 报错---qt.qpa.plugin
  15. 通过mac地址查找ip
  16. EditPlus代码补全设置
  17. 北大药学院院长被指涉嫌学术造假,同组院士做出回应
  18. R语言:rJava包的安装
  19. easyPR车牌识别分析与测试结果
  20. 如何做好Clickhouse集群的监控覆盖?

热门文章

  1. django 定制admin
  2. Epos消费管理系统复制迁移SQL SERVER 2005数据库
  3. MvcMusicStore学习中常出现的一个BUG
  4. 2014.8.20日结
  5. ZOJ3545——AC自动机+状态dp
  6. 一个完整的项目流程图_工程建设项目史上最完整的全流程图,必收藏备用!
  7. Python使用Condition对象实现多线程同步
  8. Python使用正则表达式处理字符串
  9. 学习Python的好去处,微信公众号“Python小屋”
  10. python os write_Python 3:写入方法与os.write返回的字节数