C++文件加密篇(基于char数组进行可逆加密)

news/2024/5/19 9:22:54/文章来源:https://blog.csdn.net/a486259/article/details/130035648

严格意义上的加密算法有对称加密算法和非对称加密算法,对称加密算法是指加密与解密的key相同,而非对称加密算法是指加密(使用公钥,所有人都可以获取)与解密(使用私钥,只有指定方有私钥)的key不相同。这种严格的加密算法依赖于矩阵乘法进行数据加密,运算量较大,通常适用于短信息的加密,而针对于长信息(较大的文件)则不适用(具体可以参考压缩文件的加密)。

1、现有通行的加密方法

加密的本质就是对信息进行混淆,使拿到数据的人无法有效的识别出原始信息;而解密则是将混淆后的信息进行还原。因此,可以基于对信息的混淆进行数据加密。进行本工作前,博主进行粗略调查,c++实现文件加密的有以下方法:
1、基于异或操作的加密;https://blog.csdn.net/zhaxun/article/details/125027503
2、基于取反操作的加密;https://blog.csdn.net/weixin_50964512/article/details/123977481
3、基于ascall码表的加密;https://blog.csdn.net/weixin_46897073/article/details/110410141
这些加密方法的第一操作原理在于将文件以二进制的方式读取为char数组(每个char对应一个ascall值),相关c++代码如下

vector<char> read_file(string fname) {//读取文件ifstream inFile(fname, ios::in | ios::binary | ios::ate);long size = inFile.tellg();inFile.seekg(0, ios::beg);vector<char> buffers(size);inFile.read(buffers.data(), size);inFile.close();return buffers;
}

以上三个方法所存在的问题

  • 基于异或操作的加密 其加密与解密过程是一样的;进行异或操作的code只有8位,256个值;如果加密方式泄露,很容易通过碰撞检测进行解密;
  • 基于取反操作的加密 其加密与解密过程是一样的;不存在加密的code,针对整个文件进行取反很容易被识别出来
  • 基于ascall码表的加密 加密时的密码表必须为256,且不能重复(这对于使用上比较困难);通过很容易通过频率统计分析出密码表

2、所设计的加密方法

通过对现行三个文件加密方法的思考,认为实现加密解密算法的本质就是定义一个数据混淆规则,这个规则应该有一个人为参与的code,而且这个code不能太短。在进行加密时,根据code进行相应的操作。

2.1 可用的混淆操作

考虑到基于密码表的加密限制了code的范围;使用异或操作的加密则使code的值变得更小。博主以对vector的操作为思考起点。

共得出以下基本的数据混淆操作:

  • 取反操作 将数据进行取反;解密操作也是取反操作;以单个char为操作单元
  • 倒序操作 将数组的顺序进行翻转;解密操作也是倒序操作;以char数组为操作单元
  • 滑动操作 将数组首位相连,进行一定的转动;解密操作也是滑动操作;以char数组为操作单元;(如,滑动值为20%,则将数组前20%的数据截取下来放到最后面)
    以上三个操作的实现代码如下
//取反操作
void reverse_value(vector<char>& data) {for (int i = 0; i < data.size();i++) {data[i] = 255 - data[i];}
}
//倒序操作
void reverse_sort(vector<char>& data) {reverse(data.begin(), data.end());
}
//滑动操作
//根据start对vector进行截断, 让datain=dataout2+dataout1既实现了滑动操作
void vector_cut(vector<char>& datain, long start, vector<char>& dataout1, vector<char>& dataout2) {dataout1.assign(datain.begin(), datain.begin() + start);dataout2.assign(datain.begin() + start, datain.end());
}
//重载vector的运算符
template <typename T>
vector<T>& operator +(vector<T>& v1, vector<T>& v2)
{v1.insert(v1.end(), v2.begin(), v2.end());return v1;
}

2.2 加密方法

考虑到加密方法需要用户参与,将code设为多个数字。加密时,代码根据code中的数字对数据进行切分(用于实现滑动操作)得到切片1和切片2,对切片1进行取反操作,对切片2进行倒序操作;解密时,代码根据code中的数字对数据进行切分(用于实现滑动操作)得到切片1和切片2,对切片1进行倒序操作,对切片2进行取反操作。

由于加密和解密的基本操作都是一样,且都依赖于滑动操作。故,所实现的加密和解密方法如下。其中,datain表示输入的数据,start表示滑动的位置,encode=true表示进行加密操作,false表示进行解密操作。这里考虑到每个数据的size可能不一样,使用固定的start可能会超出数据的长度,故以百分比描述滑动的位置。当srart>=100时为无效值

void move_vector(vector<char>& datain, int start, bool encode = true) {vector<char> data1, data2;if (start >= 100) {//大于等于100不进行任何操作return;}start = int(start * datain.size() / 100);if (!encode) {//解码时的位置要调整start = datain.size() - start;}vector_cut(datain, start, data1, data2);if (!encode) {//解码时的位置要调整reverse_sort(data1);reverse_value(data2);}else {reverse_sort(data2);reverse_value(data1);}datain = data2 + data1;//交换这一段的位置
}

2.3 多轮加密

这里的设定是基于code进行加密,多个code则对应了多次加密次数,这使得数据基本上不可能被还原(打乱顺序比较简单,从混乱的数据中恢复顺序比较困难)。

加密函数

code为加密规则,示例:“13 41 54 19 12 4 42 54”,可以为任意长度,以空格分开每一个值

void encry_data(vector<char>& data, string code) {vector<string> codes = split_char(code, ' ');for (int i = 0; i < codes.size(); i++) {int offset;convertFromString(offset, codes[i]);move_vector(data, offset);}
}

解密函数

与encry_data函数共用相同的code,只是倒序进行操作

void decry_data(vector<char>& data, string code) {vector<string> codes = split_char(code, ' ');for (int i = codes.size() - 1; i >= 0; i--) {int offset;convertFromString(offset, codes[i]);move_vector(data, offset, false);}
}

3、加密示例

3.1 加密文本

这里对二进制文件进行加密示意。二进制文件的原始内容如下
在这里插入图片描述

加密解密代码如下:

#include "EncryFile.hpp" 
using namespace std;
int main() {string fname = "C:/Users/xxx/Pictures/a.txt";string codes = "18 5 63 41 22";//文件的加密码string fencry= "C:/Users/xxx/Pictures/a_en.txt";string fdecry = "C:/Users/xxx/Pictures/a_de.txt";encry_file(fname, codes, fencry);decry_file(fencry, codes, fdecry);return 0;
}

加密后的内容如下,可以看到部分内容已经倒序,部分内容已经取反;而且出现了空行,数据的行数与原来无法对应。在不知道数据混淆规则(code)的情况下对数据进行还原是异常困难的。
在这里插入图片描述

3.2 加密图片

具体加密代码如下

#include "EncryFile.hpp"
using namespace std;
int main() {string fname = "C:/Users/xxx/Pictures/bj.bmp";string codes = "18 5 63 41 22";//文件的加密码string fencry= "C:/Users/xxx/Pictures/bj_encry.bmp";string fdecry = "C:/Users/xxx/Pictures/bj_decry.bmp";encry_file(fname, codes, fencry);decry_file(fencry, codes, fdecry);return 0;
}

最终加密解密效果如下所示,可以看到计算机已经无法有效识别bj_encry.bmp(对于特定格式的文件,进行混淆后是无法被原来的软件进行解析的的(因为出现了数据错位、数据值部分取反、数据局部顺序翻转))。这表明这种数据加密规则是可以应用到绝大部分文件中。
在这里插入图片描述

补充:在本博文中有4个非重要函数并未公开。各位可以下载我的(付费资源)使用完整代码,或者自行根据以下代码提示补齐函数。
在这里插入图片描述

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

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

相关文章

Robosense激光雷达Linux配置

文章目录1.1 速腾rs16连接&#xff1a;1.2 网络配置1&#xff09;官方说明2&#xff09;设置网络3&#xff09;检查是否连接成功2.1 激光雷达ROS包下载/编译1)下载ROS包2&#xff09;安装libpcap依赖3&#xff09;修改编译模式4&#xff09;config文件配置5&#xff09;编译并运…

【数据结构与算法】一、数据结构的基本概念

文章目录一、数据结构的基本概念1.1 数据结构的研究内容1.2 数据类型和抽象数据类型1.3 算法和算法分析1.3.1 算法的时间复杂度1.3.2 算法时间效率的比较1.4 知识回顾一、数据结构的基本概念 1.1 数据结构的研究内容 1.2 数据类型和抽象数据类型 抽象数据类型&#xff08;ADT…

[入门必看]数据结构4.1:串的定义和实现

[入门必看]数据结构4.1&#xff1a;串的定义和实现第四章 串4.1 串的定义和实现知识总览4.1.1_串的定义和基本操作4.1.2_串的存储结构4.1.1_串的定义和基本操作串的定义串 V.S 线性表串的基本操作串的比较操作字符集编码4.1.2_串的存储结构串的顺序存储串的链式存储基本操作的实…

4月9日第壹简报,星期日,农历闰二月十九

4月9日第壹简报&#xff0c;星期日&#xff0c;农历闰二月十九坚持阅读&#xff0c;静待花开1. “2023中国品牌女性500强”榜单揭晓&#xff0c;屠呦呦、张桂梅、董明珠、刘洋、孟晚舟、谷爱凌等入选。2. 京东集团副总裁&#xff1a;将在今年发布“京东版”ChatGPT。3. 以冒名顶…

大数据Flink进阶(十八):Flink执行图和TaskSlot问题思考

文章目录 Flink执行图和TaskSlot问题思考 一、Flink执行图 二、TaskSlot问题思考 Flink执行图和TaskSlot问题思考 一、Flink执行图 Flink代码提交到集群执行时最终会被转换成task分布式的在各个节点上运行,在前面我们学习到DataFlow数据流图

智能座舱操作系统|Flyme Auto-魅族 Flyme Auto“上车”领克08,能帮助吉利汽车打赢智能座舱战吗

“没有手机软件赋能的汽车厂商都将逐渐掉队。” 3月30日晚,星际魅族集团董事长兼首席执行官沈子瑜在魅族领克无界生态发布会上直言,魅族Flyme Auto车机操作系统要让手机成为汽车的一部分,成为定义传统汽车五个域之外的第六域——手机域。 魅族Flyme Auto已经预热多时且备受…

什么是服务架构?微服务架构的优势又是什么?

文章目录1.1 单体架构1.2 微服务架构1.3 单体架构和微服务架构的区分1.4 两种服务架构的优劣点1.4.1 单体架构1.4.2 微服务架构1.5 总结1.1 单体架构 单体架构&#xff08;Monolithic Architecture&#xff09;是一种传统的应用程序架构模式&#xff0c;它指的是将一个应用程序…

Android 11.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(二)

1.前言 在11.0的系统rom定制化开发中,在原生系统SystemUI下拉状态栏的下拉通知栏的背景默认是白色四角的背景, 由于在产品设计中,在对下拉通知栏通知的背景需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 然后通过systemui的通知…

相机的内参和外参介绍

注&#xff1a;以下相机内参与外参介绍除来自网络整理外全部来自于《视觉SLAM十四讲从理论到实践 第2版》中的第5讲&#xff1a;相机与图像&#xff0c;为了方便查看&#xff0c;我将每节合并到了一幅图像中 相机与摄像机区别&#xff1a;相机着重于拍摄静态图像&#x…

2019年 团体程序设计天梯赛——题解集

前言&#xff1a; Hello各位童学大家好&#xff01;&#x1f60a;&#x1f60a;&#xff0c;茫茫题海你我相遇即是缘分呐&#xff0c;或许日复一日的刷题已经让你感到疲惫甚至厌倦了&#xff0c;但是我们真的真的已经达到了我们自身极限了吗&#xff1f;少一点自我感动&#xf…

Linux常用指令【文件目录操作】

linux 文件目录操作指令pwd 指令ls 指令cd 指令mkdir 指令rmdir 指令touch 指令cp 指令rm 指令mv 指令cat 指令more 指令less 指令> 和 >> 指令echo 指令head 指令tail 指令ln 指令history 指令pwd 指令 基本语法 pwd (显示当前工作目录的绝对路径) ls 指令 基本语法…

大数据项目实战之数据仓库:电商数据仓库系统——第2章 数据仓库建模概述

第2章 数据仓库建模概述 2.1 数据仓库建模的意义 如果把数据看作图书馆里的书&#xff0c;我们希望看到它们在书架上分门别类地放置&#xff1b;如果把数据看作城市的建筑&#xff0c;我们希望城市规划布局合理&#xff1b;如果把数据看作电脑文件和文件夹&#xff0c;我们希…

【低压】DC-DC 降压恒流 车灯12-100V 2.5A 高干扰 全亮 半亮方案

产品描述 特点 应用领域 应用原理图 AP5127 是一款 PWM 工作模式,高效率、外 围简单、内置功率管&#xff0c;适用于 12-100V 输入的高 精度降压 LED 恒流驱动芯片。输出最大功率可达 25W&#xff0c;最大电流 2.5A。 AP5127 可实现全亮/半亮功能切换&#xff0c;通过 MODE 切…

cgroups是linux内核中限制、记录、隔离进程组(process groups)所使用的物理资源的机制

容器虚拟化 可以实现应用程序的隔离 直接使用物理机的操作系统可以快速响应用户请求 不占用部署时间 占用少量磁盘空间 缺点∶学习成本增加、操作控制麻烦、网络控制与主机虚拟化有所区别、服务治理难。 微服务架构师需要会多门编程语言&#xff0c;才能治理各种服务 三种…

Java初始泛型

目录 一、包装类 1、基本数据类型和对应的包装类 2、装箱和拆箱 3、自动装箱和自动拆箱 二、什么是泛型 三、引出泛型 1、泛型的语法 四、泛型类的使用 1、语法 2、示例 3、类型推导(Type Inference) 六、泛型如何编译的 1、擦除机制 2、为什么不能实例化泛型类…

C指针的简介与应用

C指针 感谢b站up主江科大自化协的讲解&#xff1a;https://www.bilibili.com/video/BV1Mb4y1X7dz/?spm_id_from333.999.0.0 该学习笔记也是基于up课程做的笔记&#xff0c;我的个人能力及理解的局限&#xff0c;不足之处还望大佬指正~ 9.1 指针简介 指针(Pointer)是C语言的…

【NX2023/1847】UG软件安装详细指南教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录安装包一、安装包内容检查二、安装步骤1.安装JAVA_WIN64.exe2.运行Launch.exe3.安装许可3.直接重启电脑&#xff08;小白直接重启稳妥&#xff09;4.重启后继续运行L…

【案例实践】R语言多元数据统计分析在生态环境中的实践应用

查看原文>>>R语言生物群落分析绘图、多元统计分析、CMIP6、遥感碳储量、GEE林业、InVEST等 生态环境领域研究中常常面对众多的不同类型的数据或变量&#xff0c;当要同时分析多个因变量&#xff08;y&#xff09;时需要用到多元统计分析&#xff08;multivariate sta…

《计算机网络-自顶向下》05. 网络层-控制平面

文章目录路由控制方式每路由控制逻辑集中式控制路由选择算法LS —— 链路状态路由选择算法DV —— 距离向量路由选择算法LS 和 DV 算法的比较自治系统内部路由协议RIPOSPF自治系统外部路由协议&#xff1a;BGP通告 BGP 路由信息选择最好的路由相关术语热土豆选择路由选择算法&a…

使用向量机(SVM)算法的推荐系统

系统整体结构 运行环境 包括Python环境、TensorFlow环境、安装模块、MySQL数据库。 Python环境 需要Python 3.6及以上配置&#xff0c;在Windows环境下推荐下载Anaconda完成Python所需的配置&#xff0c;下载地址为https://www.anaconda.com/&#xff0c;也可下载虚拟机在Li…