openssl3.2 - exp - zlib

文章目录

    • openssl3.2 - exp - zlib
    • 概述
    • 笔记
    • 命令行实现
    • 程序实现
    • 备注 - 压缩时无法base64
    • 压缩时无法带口令压缩
    • 实现 - 对buffer进行压缩和解压缩
    • 测试效果
    • 工程实现
    • main.cpp
    • COsslZlibBuffer.h
    • COsslZlibBuffer.cpp
    • 总结
    • 备注 - 解压可以替代完整性校验
    • 备注 - 多次压缩没作用
    • 备注 - 和7zip的压缩性能的比较
    • END

openssl3.2 - exp - zlib

概述

客户端和服务端进行数据交换时,如果压缩一下要交互的数据,可以节省带宽。
如果数据是文本型, 压缩率特别大。

以前用zlib库单独实验过,写起来还挺麻烦的。

正好这次已经将zlib特性加入了openssl(openssl3.2 - 编译 - zlib.dll不要使用绝对路径), 试一下用openssl来压缩/解压缩数据方便不?

笔记

命令行实现

// openssl zip help
openssl zlib --help// zip
openssl zlib -e -in test.txt -out test.txt.zlib -pass pass:my_pwd// unzip
openssl zlib -d -in test.txt.zlib -out test.txt.zlib.unzlib -pass pass:my_pwd

程序实现

先看一下openssl.exe的实现

备注 - 压缩时无法base64

如果选了zlib, 就不能选base64.
如果想zlib后,再base64, 需要单独对输出结果进行base64(https://lostspeed.blog.csdn.net/article/details/136881319).

		if (do_zlib)base64 = 0;

压缩时无法带口令压缩

压缩时口令不起作用,因为可以不带口令解开。

openssl zlib -d -in test.txt.zlib -out test.txt.zlib.unzlib

如果想将压缩后的内容加密,需要自己单独对压缩后的内容加密。

实现 - 对buffer进行压缩和解压缩

测试效果

org:
0000 - 68 65 6c 6c 6f 20 6f 70-65 6e 73 73 6c 33 2e 32   hello openssl3.2
0010 - 20 7a 6c 69 62 0a                                  zlib.
zip:
0000 - 78 9c cb 48 cd c9 c9 57-c8 2f 48 cd 2b 2e ce 31   x..H...W./H.+..1
0010 - d6 33 52 a8 ca c9 4c e2-02 00 5e 4e 07 a7         .3R...L...^N..
unzip:
0000 - 68 65 6c 6c 6f 20 6f 70-65 6e 73 73 6c 33 2e 32   hello openssl3.2
0010 - 20 7a 6c 69 62 0a                                  zlib.
free mem_hook map, g_mem_hook_map.size() = 0, no openssl API call memory leak

工程实现

test prj is exp034_zlib
在这里插入图片描述

main.cpp

/*!
* \file main.cpp
*/#include "ossl/my_openSSL_lib_v1.1.h"
#include <openssl/crypto.h>
#include <openssl/bio.h>#include <stdlib.h>
#include <stdio.h>
#include <assert.h>#include "COsslZlibBuffer.h"void my_openssl_app();int main(int argc, char** argv)
{setvbuf(stdout, NULL, _IONBF, 0); // 清掉stdout缓存, 防止调用printf时阻塞mem_hook();my_openssl_app();mem_unhook();return 0;
}void my_openssl_app()
{bool b_rc = false;int i_rc = 0;COsslZlibBuffer zlib;uint8_t szBuf[0x1000];int lenBuf = 0;uint8_t* pBufOut1 = NULL;int lenBufOut1 = 0;uint8_t* pBufOut2 = NULL;int lenBufOut2 = 0;strcpy((char*)szBuf, "hello openssl3.2 zlib\n");lenBuf = strlen((char*)szBuf);printf("org:\n");BIO_dump_fp(stdout, szBuf, lenBuf);b_rc = zlib.zip(szBuf, lenBuf, pBufOut1, lenBufOut1);assert(b_rc);printf("zip:\n");BIO_dump_fp(stdout, pBufOut1, lenBufOut1);b_rc = zlib.unzip(pBufOut1, lenBufOut1, pBufOut2, lenBufOut2);assert(b_rc);printf("unzip:\n");BIO_dump_fp(stdout, pBufOut2, lenBufOut2);assert(lenBufOut2 == lenBuf);i_rc = memcmp(szBuf, pBufOut2, lenBuf);assert(0 == i_rc);if (NULL != pBufOut1){OPENSSL_free(pBufOut1);pBufOut1 = NULL;}if (NULL != pBufOut2){OPENSSL_free(pBufOut2);pBufOut2 = NULL;}
}

COsslZlibBuffer.h

//! \file COsslZlibBuffer.h#ifndef __C_OSSL_ZLIB_BUFFER_H__
#define __C_OSSL_ZLIB_BUFFER_H__#include <stdlib.h>
#include <stdio.h>
#include <cstdint> // for uint8_t#ifndef IN
#define IN
#endif // !IN#ifndef OUT
#define OUT
#endif // !OUT#include "openssl/bio.h"class COsslZlibBuffer
{
public:COsslZlibBuffer();virtual ~COsslZlibBuffer();// 出参指针调用者负责释放(OPENSSL_free())bool zip(IN uint8_t* pBuf, IN int lenBuf, OUT uint8_t*& pBufOut, OUT int& lenBufOut);bool unzip(IN uint8_t* pBuf, IN int lenBuf, OUT uint8_t*& pBufOut, OUT int& lenBufOut);private:bool zipOpt(bool isZip, IN uint8_t* pBuf, IN int lenBuf, OUT uint8_t*& pBufOut, OUT int& lenBufOut);size_t bio_get_length(BIO* bio);bool bio_to_buf(BIO* bio, uint8_t*& pBuf, int& lenBuf);
};#endif // #ifndef __C_OSSL_ZLIB_BUFFER_H__

COsslZlibBuffer.cpp

//! \file COsslZlibBuffer.cpp#include "COsslZlibBuffer.h"#include "openssl/bio.h"
#include "openssl/comp.h"COsslZlibBuffer::COsslZlibBuffer()
{}COsslZlibBuffer::~COsslZlibBuffer()
{}bool COsslZlibBuffer::zip(IN uint8_t* pBuf, IN int lenBuf, OUT uint8_t*& pBufOut, OUT int& lenBufOut)
{return zipOpt(true, pBuf, lenBuf, pBufOut, lenBufOut);
}bool COsslZlibBuffer::unzip(IN uint8_t* pBuf, IN int lenBuf, OUT uint8_t*& pBufOut, OUT int& lenBufOut)
{return zipOpt(false, pBuf, lenBuf, pBufOut, lenBufOut);
}bool COsslZlibBuffer::zipOpt(bool isZip, IN uint8_t* pBuf, IN int lenBuf, OUT uint8_t*& pBufOut, OUT int& lenBufOut)
{bool b_rc = false;BIO* bio_zip = NULL;BIO* bio_in = NULL;BIO* bio_out = NULL;BIO* bio_read = NULL;BIO* bio_write = NULL;uint8_t szBuf[0x1000];int iCntRead = 0;int iCntWasWrite = 0;do {if ((NULL == pBuf) || (lenBuf <= 0)){break;}lenBufOut = 0;bio_zip = BIO_new(BIO_f_zlib());if (NULL == bio_zip){break;}bio_in = BIO_new_mem_buf(pBuf, lenBuf);if (NULL == bio_in){break;}bio_out = BIO_new(BIO_s_mem());if (NULL == bio_out){break;}if (isZip){bio_read = bio_in;bio_write = BIO_push(bio_zip, bio_out);  // write to bio link header, out form bio link tail}else {bio_read = BIO_push(bio_zip, bio_in);bio_write = bio_out;}do {iCntRead = BIO_read(bio_read, szBuf, (int)sizeof(szBuf));if (iCntRead <= 0){break;}iCntWasWrite = BIO_write(bio_write, szBuf, iCntRead);if (iCntWasWrite != iCntRead){goto END;}} while (true);if (!BIO_flush(bio_write)){break;}// 如果读bio_write, 得到的是写入的数据, 而不是处理完的输出数据if (!bio_to_buf(bio_out, pBufOut, lenBufOut)){break;}/*do_zlib = 1;enc = 1;saltlen = PKCS5_SALT_LEN;dgst = (EVP_MD *)EVP_sha256();iter = 1;if (do_zlib)base64 = 0;BIO *bzl = NULL;bzl = BIO_new(BIO_f_zlib()wbio = BIO_push(bzl, wbio);while (BIO_pending(rbio) || !BIO_eof(rbio)) {inl = BIO_read(rbio, (char *)buff, bsize);if (inl <= 0)break;if (!streamable && !BIO_eof(rbio)) {//	BIO_printf(bio_err, "Unstreamable cipher mode\n");//	goto end;//}//if (BIO_write(wbio, (char*)buff, inl) != inl) {//	BIO_printf(bio_err, "error writing output file\n");//	goto end;//}//if (!streamable)//break;//	}BIO_flush(wbio)if (enc)wbio = BIO_push(bzl, wbio);elserbio = BIO_push(bzl, rbio);*/b_rc = true;} while (false);END:if (NULL != bio_read){BIO_free_all(bio_read);bio_read = NULL;}if (NULL != bio_write){BIO_free_all(bio_write);bio_write = NULL;}return b_rc;
}size_t COsslZlibBuffer::bio_get_length(BIO* bio)
{size_t bio_length = 0;do {if (NULL == bio){break;}// BIO_seek(bio, 0);bio_length = BIO_ctrl_pending(bio);} while (false);return bio_length;
}bool COsslZlibBuffer::bio_to_buf(BIO* bio, uint8_t*& pBuf, int& lenBuf)
{bool b_rc = false;int i_rc = 0;do {if (NULL == bio){break;}lenBuf = (int)bio_get_length(bio);pBuf = (uint8_t*)OPENSSL_malloc(lenBuf + 1);if (NULL == pBuf){break;}pBuf[lenBuf] = '\0';i_rc = BIO_read(bio, pBuf, lenBuf);BIO_seek(bio, 0); // ! 读完了, 将数据读指针恢复.b_rc = (i_rc == lenBuf);} while (false);return b_rc;
}

总结

用openssl做zip操作比直接用zlib库操作方便多了。
openssl的封装真优秀。

备注 - 解压可以替代完整性校验

	// 测试zip内容变了之后,是否还能正常解压?// 实验过了, 随便改一个字节,都无法解压成功pBufOut1[lenBufOut1 / 2 - 1] = pBufOut1[lenBufOut1 /2 - 1] + 1;b_rc = zlib.unzip(pBufOut1, lenBufOut1, pBufOut3, lenBufOut3);assert(b_rc);

实验过了, 将压缩后的内容随便改一个字节(头部附近,尾部附近,内容中部附近),再解压都会失败。
如果这样的话,那就不用特意做hash来确认内容是否被无意中修改。

备注 - 多次压缩没作用

在第一次压缩后,尝试将压缩结果再压缩,长度反而增加了一点。
说明一次压缩就够了。

备注 - 和7zip的压缩性能的比较

		// 因为样本比较小(2816字节), 用7zip分别极限压缩成.7z和.zip, 好不多少// .zip = 1526字节// .7zip = 1481字节// 算了,就用openssl3.2自带的zip压缩吧// 用openssl自带的zip操作(2816 => 1391), 比7zip的极限压缩还优秀..., 惊讶

END

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

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

相关文章

Lambda表达式保姆级教程详解(二)

本系列文章简介&#xff1a; Lambda表达式在现代编程语言中越来越流行&#xff0c;如Java、Python等。它是一种简洁、灵活的编码方式&#xff0c;能够使代码更易读、更易编写&#xff0c;同时提高代码的可维护性和扩展性。 Lambda表达式的引入使得函数式编程思想在传统的面向对…

海外媒体发稿:探究7个旅游业媒体套餐背后的秘密-华媒舍

旅游业媒体套餐对于旅游行业来说扮演着重要的角色&#xff0c;帮助企业在竞争激烈的市场中宣传推广&#xff0c;吸引更多的游客。在这篇文章中&#xff0c;我们将深入探究7个旅游业媒体套餐背后的秘密&#xff0c;为您揭示其真正的价值和影响。 1. 平台选择的关键 在选择旅游业…

博士找教职--经验贴

目录 一、如何寻找教职&#xff1f; 二、海投还是多投&#xff1f; 三、博士什么时候找工作最好&#xff1f; 为什么9月份开始最好&#xff1f; 四、论文没有出来可以9月找工作吗&#xff1f; 五、其他的一些嘱咐 一、如何寻找教职&#xff1f; 上必应键入关键词&#xf…

leetcode最长有效括号

. - 力扣&#xff08;LeetCode&#xff09; 32. 最长有效括号 困难 相关标签 相关企业 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号 子串 的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输…

spring boot学习第十七篇:OAuth2概述及使用GitHub登录第三方网站

0. 导言 我们在浏览器上可以访问成百上千个网站&#xff0c;使用每个网站的服务一般都要先注册账号&#xff0c;那么我们为了更好地记忆&#xff0c;一般都会在多个网站使用相同的账号和密码进行注册。那么问题就来了&#xff0c;如果在你注册的网站中有某些个网站的系统设计不…

CentOS7里ifcfg-eth0文件不存在解决方案/Centos7修改网络IP解决方案

Centos7网络IP地址手动设置 1、centos7没有ifcfg-eth0&#xff0c;我的centos7也没有其他博客说的什么ifcfg-ens33、ifcfg-ens32&#xff0c;然后我打开了我这里的ifcfg-eno***&#xff0c;结果发现就是centos6里的ifcfg-eth0里的网络配置。2、vim ifcfg-eno***&#xff08;按t…

202203青少年软件编程(Scratch图形化) 等级考试试卷(四级)

第1题&#xff1a;【 单选题】 由1,2,3,4,5,0这六个数字经过排列组合能够组成多少个六位数偶数&#xff1f; 注意&#xff1a; 每一位都不相同&#xff0c; 最高位不能为0。&#xff08; &#xff09; A:720 B:360 C:312 D:88 【正确答案】: C 【试题解析】 : 逻辑知识…

10分钟带你学会配置DNS服务正反向解析

正向解析 服务端IP客户端IP网址192.168.160.134192.168.160.135www.openlab.com 一、首先做准备工作&#xff1a; 关闭安全软件&#xff0c;关闭防火墙&#xff0c;下载bind软件 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld [rootserver ~]# y…

【C++程序员的自我修炼】拷贝构造函数

心存希冀 追光而遇目有繁星 沐光而行 目录 拷贝构造函数概念 拷贝构造的特征 无穷递归的解释 浅拷贝 总结&#xff1a; 深拷贝 拷贝构造函数典型调用场景 总结 契子✨ 在生活中总有很多琐事&#xff0c;不做不行做了又怕麻烦&#xff0c;有时候想要是有个和自己一模一样的人就…

springboot中常见的设计模式

Spring Boot&#xff0c;作为基于Spring框架的扩展&#xff0c;广泛应用了多种设计模式来简化企业级应用开发。以下是在Spring Boot中常见的一些设计模式&#xff1a; 1. 单例模式&#xff08;Singleton Pattern&#xff09; 这是Spring框架中最常用的模式之一。Spring容器默…

每日一题 第八十九期 洛谷 [NOIP2017 提高组] 奶酪

[NOIP2017 提高组] 奶酪 题目背景 NOIP2017 提高组 D2T1 题目描述 现有一块大奶酪&#xff0c;它的高度为 h h h&#xff0c;它的长度和宽度我们可以认为是无限大的&#xff0c;奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系&#xff0c;在坐标系…

Go——面向对象

一. 匿名字段 go支持只提供类型而不写字段名的方式&#xff0c;也就是匿名字段&#xff0c;也称为嵌入字段。 同名字段的情况 所以自定义类型和内置类型都可以作为匿名字段使用 指针类型匿名字段 二.接口 接口定义了一个对象的行为规范&#xff0c;但是定义规范不实现&#xff…

搞懂docker一篇就够了

在数字化浪潮汹涌的今日,Docker以其独特的魅力,引领着容器技术的风潮,成为众多开发者、运维人员乃至架构师们心中的宠儿。今日就带领大家一同探寻Docker的奥秘,感受其带来的便捷与高效。 Docker,这个看似简单的词汇,却蕴含着无尽的智慧与力量。它就像一位高超的魔术师,…

FreeSWITCH 1.10.10 简单图形化界面17 - ubuntu22.04或者debian12 安装FreeSWITCH

FreeSWITCH 1.10.10 简单图形化界面17 - ubuntu22.04或者debian12 安装FreeSWITCH 界面预览00、先看使用手册0、安装操作系统1、下载脚本2、开始安装3、登录网页FreeSWITCH界面安装参考:https://blog.csdn.net/jia198810/article/details/132479324 界面预览 http://myfs.f3…

Matlab之过球面一点的平面方程

这篇文章描述2件事情&#xff1a; 1、已知球面上任意点&#xff0c;求过该点、地心、与北极点的平面方程&#xff08;即过该点的经线平面方程&#xff09;&#xff1b; 2、绕过球心的任意轴旋转平面得到新平面的方程 一、已知球面上任意点&#xff0c;求过该点、地心、与北极点…

javase_进阶 day10 集合(泛型,数据结构)

1.泛型 1.1泛型概述 泛型的介绍 ​ 泛型是JDK5中引入的特性&#xff0c;它提供了编译时类型安全检测机制 泛型的好处 把运行时期的问题提前到了编译期间避免了强制类型转换 泛型的定义格式 <类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如:…

CopyTranslator下载地址及安装教程

CopyTranslator是一款免费且开源的机器翻译工具&#xff0c;旨在提供快速、便捷的翻译服务。它采用了先进的神经网络机器翻译技术&#xff0c;能够提供准确、流畅的翻译结果。 CopyTranslator的特点和功能如下&#xff1a; 多语言翻译&#xff1a;支持多种常见的语言对&#…

【随笔】Git 高级篇 -- 项目里程碑 git tag(二十)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

CuraEngine之代码阅读(1)之路径优化函数 PathOrderOptimizer::optimize

CuraEngine之代码阅读&#xff08;1&#xff09;之路径优化函数 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的 STL CuraEngine之代码阅读&#xff08;1&#xff09;之路径…

leetcode142 环形链表2

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部…