openssl3.2 - exp - base64 / unbase64

文章目录

    • openssl3.2 - exp - base64 / unbase64
    • 概述
    • 笔记
    • 命令行实现
    • 程序实现
    • END

openssl3.2 - exp - base64 / unbase64

概述

想将2进制内容放到配置文件中, 作为配置项的值.
那先base64一下, 变成可见字符串后再写入配置文件.

先看了官方的命令行实现.
然后从官方命令行实现, 迁移出一个调用openssl API来干活的版本.

自己测试迁移后的版本时, 细节还是挺多, 不像记录官方实现那么容易.
对BIO_push()的使用有了进一步的认识.

笔记

命令行实现

// 做实验用的明文
echo this is pt > pt.txt// base64帮助
openssl base64 --help// base64 明文编码
openssl base64 -e -in pt.txt -out pt.txt.base64// 查看编码后的密文
more pt.txt.base64// base64 密文解码
openssl base64 -d -in pt.txt.base64 -out pt.txt.base64.unbase64// 查看解码后的明文
more pt.txt.base64.unbase64

程序实现

/*!
* \file exp033_base64.cpp
* \note openssl3.2 - exp - base64 / unbase64
* 用BIO链来完成base64/unbase64
*/#include "my_openSSL_lib.h"
#include <openssl/crypto.h>
#include <openssl/bio.h>#include <stdlib.h>
#include <stdio.h>
#include <assert.h>#include "CMemHookRec.h"#include <openssl/evp.h>void my_openssl_app();
bool base64(bool isEncode, UCHAR* pucBufIn, int lenBufIn, UCHAR*& pucBufOut, int& lenBufOut);int main(int argc, char** argv)
{setvbuf(stdout, NULL, _IONBF, 0); // 清掉stdout缓存, 防止调用printf时阻塞mem_hook();my_openssl_app();mem_unhook();/*! run resultbuffer original0000 - 00 01 02 03 04 05 06 07-08 09 0a 0b 0c            .............after base640000 - 41 41 45 43 41 77 51 46-42 67 63 49 43 51 6f 4c   AAECAwQFBgcICQoL0010 - 44 41 3d 3d 0a                                    DA==.after unbase640000 - 00 01 02 03 04 05 06 07-08 09 0a 0b 0c            .............ok : the same by org and unbase64free map, g_mem_hook_map.size() = 0D:\my_dev\my_local_git_prj\study\openSSL\exp\exp033_base64\x64\Debug\exp033_base64.exe (进程 305792)已退出,代码为 0。要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。按任意键关闭此窗口. . .*/return 0;
}void my_openssl_app()
{int i = 0;UCHAR ucBuf[0x10 - 3];UCHAR* pucBufOut = NULL;int iLenBufOut = 0;UCHAR* pucBufOut1 = NULL;int iLenBufOut1 = 0;for (i = 0; i < sizeof(ucBuf); i++){ucBuf[i] = (UCHAR)i;}printf("buffer original\n");BIO_dump_fp(stdout, ucBuf, sizeof(ucBuf));do {if (!base64(true, ucBuf, sizeof(ucBuf), pucBufOut, iLenBufOut)){assert(false);break;}printf("after base64\n");BIO_dump_fp(stdout, pucBufOut, iLenBufOut);if (!base64(false, pucBufOut, iLenBufOut, pucBufOut1, iLenBufOut1)){assert(false);break;}printf("after unbase64\n");BIO_dump_fp(stdout, pucBufOut1, iLenBufOut1);if (iLenBufOut1 != sizeof(ucBuf)){assert(false);break;}if (0 != memcmp(ucBuf, pucBufOut1, sizeof(ucBuf))){assert(false);break;}printf("ok : the same by org and unbase64\n");} while (false);if (NULL != pucBufOut){OPENSSL_free(pucBufOut);pucBufOut = NULL;}if (NULL != pucBufOut1){OPENSSL_free(pucBufOut1);pucBufOut1 = NULL;}
}bool base64(bool isEncode, UCHAR* pucBufIn, int lenBufIn, UCHAR*& pucBufOut, int& lenBufOut)
{bool b_rc = false;BIO* bio_container = NULL;BIO* bio_to_base64 = NULL;BIO* bio_header = NULL; // BIO链头BIO* bio_tail = NULL; // BIO链尾BIO* bio_to_write = NULL; // 将数据写入的BIO指针BIO* bio_read_from = NULL; // 将数据读出的BIO指针size_t sz_wt = 0;size_t sz_rd = 0;int i_rc = 0;int len = 0;do {pucBufOut = NULL;lenBufOut = 0;if ((NULL == pucBufIn) || (lenBufIn <= 0)){break;}bio_container = BIO_new(BIO_s_mem());if (NULL == bio_container){break;}bio_to_base64 = BIO_new(BIO_f_base64());if (NULL == bio_to_base64){break;}bio_header = BIO_push(bio_to_base64, bio_container);bio_tail = bio_container;if (isEncode){bio_to_write = bio_header;bio_read_from = bio_tail;}else {bio_to_write = bio_tail;bio_read_from = bio_header;}i_rc = BIO_write_ex(bio_to_write, pucBufIn, lenBufIn, &sz_wt);if ((1 != i_rc) || (lenBufIn != sz_wt)){break;}BIO_flush(bio_to_write); // 数据写完后, 必须对写入的BIO执行 BIO_flush.// 必须从bio_read_from读取处理完的数据长度, 才是处理之后的数据长度len = BIO_pending(bio_read_from); // 必须BIO_flush()之后, 才能读取到BIO内可以读出的数据长度. 否则读出的长度是0// 当解码时, 得到的处理完的长度还是没解码之前的长度, 不过不影响// 拿这个长度开buffer, 实际数据处理完的长度按照从bio_read_from()中累计出的数据长度为准// 将处理过的数据从bio_header中读出来pucBufOut = (UCHAR*)OPENSSL_malloc(len + 1); // 再多加1个字节的空间, 便于观察得到的可见字符串if (NULL == pucBufOut){break;}pucBufOut[len] = '\0';do {// 不能从bio_header读取, 因为读取后, 还是原来的数据长度i_rc = BIO_read_ex(bio_read_from, pucBufOut + lenBufOut, len - lenBufOut, &sz_rd);if (i_rc <= 0){// 多次读, 直到读空了, 不算错break;}lenBufOut += sz_rd;} while (true);b_rc = true;} while (false);if (NULL != bio_header){BIO_free_all(bio_header);bio_header = NULL;}return b_rc;
}

END

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

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

相关文章

五、Spring源码学习之postProcessBeanFactory方法

简介 在应用程序上下文完成其标准初始化后&#xff0c;修改其内部的BeanFactory。此时&#xff0c;所有的bean定义都已经加载完成&#xff0c;但还没有任何bean被实例化。这允许在某些ApplicationContext实现中注册特殊的BeanPostProcessor等。 在应用程序上下文的初始化过程…

RESTful架构

RESTful架构中的URI设计与传统的URL设计有一些区别。让我通过具体的例子来解释一下&#xff1a; 传统的URL设计通常将操作和资源混合在一起&#xff0c;例如&#xff1a; 获取所有图书&#xff1a;GET /getBooks获取特定图书&#xff1a;GET /getBookById/{id}创建新图书&…

IOS面试题编程机制 11-15

11. 简述对NSUserDefaults的理解?NSUserDefaults,官网上的定义是一个用户默认数据库的接口,在应用程序的启动过程中,持久地存储键值对。每个应用都有一个(也只有一个)NSUserDefaults对象。向NSUserDefaults类发送standardUserDefaults消息可以得到该对象。使用时需要通过键…

代码随想录算法训练营第十七天|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

代码随想录算法训练营第十七天|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true题解&#xff1a;平衡…

查看Scala类的方法

文章目录 一、概述如何查看Scala类的方法二、使用Scala文档查看类的方法三、使用反射机制查看类的方法 一、概述如何查看Scala类的方法 本文介绍了在Scala中查看Int类方法的两种方法&#xff1a;使用Scala标准库文档和使用反射机制。通过Scala标准库文档&#xff0c;您可以方便…

【C++庖丁解牛】二叉搜索树(Binary Search Tree,BST)

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 二叉搜索树概念2. 二叉…

Etcd Raft 协议(进阶篇)

前言 在正式开始介绍 Raft 协议之间&#xff0c;我们有必要简单介绍一下其相关概念。在分布式系统中&#xff0c;一致性是比较常见的概念&#xff0c;所谓一致性指的是集群中的多个节点在状态上达成一致。在程序和操作系统不会崩溃、硬件不会损坏、服务器不会掉电、网络绝对可靠…

建设工程(2)

建设工程(2) 单选题&#xff08;共10题&#xff0c;每题3分&#xff09; 1、《安全韧性城市评价指南》&#xff08;GB/T 40947-2021&#xff09;指出&#xff0c;&#xff08;&#xff09;城市是在灾害环境中能够承受、适应和恢复的城市。 正确答案&#xff1a;B、安全韧性 2、…

JavaScript之Promise补充与Dom操作

Promise过程分析 //按照顺序依次引入a-d.js&#xff0c;最后打印加载完毕load(a.js).then(()>{return load(b.js)//load方法返回Pomise对象//但是没有把这个对象返回//所以这个函数没有返回值//then方法会提供一个空对象作为返回值},()>{console.log(有错误)}).then(()&g…

【Linux】环境变量常见指令操作&基本实验(入门必看!)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

安卓实现翻转时间显示效果

效果 废话不多说上代码 自定义组件 import android.content.Context; import android.content.res.TypedArray; import android.graphics.Camera; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.…

BM83 字符串变形

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param s string字符串 * param n int整型 * return string字符串*/public String trans (String s, int n) {// write co…

RK3568驱动指南|第十三篇 输入子系统-第143章 多对多的匹配关系分析

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

一文全面了解 wxWidgets 的安装

目录 使用二进制文件 从源代码构建 获取源代码 选择构建系统 构建您的应用程序 Unix&#xff0c;命令行 Unix&#xff0c;使用GNU Make MSW&#xff0c;使用Microsoft Visual Studio Mac&#xff0c;使用Xcode 其他IDE wxWidgets的头文件和库必须可用&#xff0c;以便…

ubuntu20.04_PX4_1.13

说在前面&#xff1a;&#xff08;最好找一个干净的Ubuntu系统&#xff09;如果配置环境的过程中出现很多编译的错误或者依赖冲突&#xff0c;还是建议新建一个虚拟机&#xff0c;或者重装Ubuntu系统&#xff0c;这样会避免很多麻烦&#x1f490; &#xff0c; 安装PX4 1.13.2 …

小红书扫码登录分析与python实现

文章目录 1. 写在前面2. 接口分析3. 代码实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

变量的数据类型:基本数据类型和引用数据类型

数据分类 数据分为&#xff1a;静态数据、动态数据。 #静态数据 静态数据是指一些永久性的数据。一般是以文件的形式存储在硬盘上&#xff0c;比如文档、照片、视频等文件。 电脑关闭后&#xff0c;静态数据仍然还在。只要不主动删掉数据或者硬盘没损坏&#xff0c;这些数据…

SQL管理员高频面试问题

1.请你谈谈 MySQL 事务隔离级别&#xff0c;MySQL 的默认隔离级别是什么&#xff1f;为了达到事务的四大特性&#xff0c;数据库定义了 4 种不同的事务隔离级别&#xff1a; READ-UNCOMMITTED&#xff08;读取未提交&#xff09;&#xff1a;最低的隔离级别&#xff0c;允许脏…

代码随想录算法训练营第十七天(二叉树IV)| 110. 平衡二叉树、257. 二叉树的所有路径、404.左叶子之和(JAVA)

文章目录 110. 平衡二叉树解题思路源码 257. 二叉树的所有路径解题思路源码 404.左叶子之和解题思路源码 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7]输出&#xff1a;true 示例…

伊理威科技:抖音开网店新手刚做选啥品

在数字浪潮中&#xff0c;抖音不仅是展示才艺的舞台&#xff0c;更是创业者的新天地。新手若想在这片热土上开垦网店&#xff0c;选品便是首要课题。选择产品如同种下希望的种子&#xff0c;既要考量土壤肥沃度&#xff0c;也得预测风雨适宜期。 兴趣与专长是选品的罗盘。热爱所…