利用c++与opencv将文本、图像加密进另一张图片中

本文介绍了如何利用c++和opencv将文本和图像数据加密并隐藏到另一张图片中。通过将ASCII码转为01编码,并影响载体图片的RGB值,实现了数据的隐秘存储。在加密过程中,由于处理英文字符更为简单,所以选择了全英文文本。文章提到了在处理大量数据时,静态数组可能导致内存问题,提出了动态链表作为可能的解决方案。解密过程涉及对载体图片前几个像素的解析,以获取存储的数据量和图像尺寸信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用c++与opencv将文本、图像加密进另一张图片中

因为水平有限基本只利用了c++与opencv非常浅显简单的东西,实现所谓加密的方式是将文本或者图像的相关数据变为01编码,根据所得01编码影响载体图片的RGB数据,在测试下面代码时记得配置opencv

文本加密进载体图像
这是我所用的文本:
In the Age of Ancients,The
world was unformed,shrouded by fog.A land of grey crags,archtrees,and
everlasting dragons
But then there was Fire.And with Fire came
Disparity.Heat and cold,life and death,and of course…Light and Dark.
Then,from the Dark,They came,and found the
Souls of Lords within the flame.
Nito,the First of the Dead.
The Witch of Izalith,and herdaughters of Chaos.
Gwyn,the Lord of Sunlight,and his faithful knights.
And the furtive pygmy,so
easily forgotten.
With the Strength of Lords,they challenged the
dragons.
Gwyn’s mighty bolts peeled apart their stone
scales.The witches weaved great firestorms.Nito unleashed a miasma of death and
disease.
And Seath the Scaleless betrayed his own,and
the dragons were no more.Thus began the Age of Fire…But soon,the flames
will fade,and only Dark will remain.Even now,there are only embers,and man
sees not light,but only endless nights.
And amongst the living are seen,carriers ofthe accursed Darksign.,

首先是将文本中的数据提取转化为所需要的形式,从文本文件每录入一个字符,便将之转化为ASICII码对应的数字,再转化为01编码,因为ASCII码表示的最大符号~才126,所以将之写成8位的01编码完全够表示,我这里是先将01编码存储于一个8位的初始化为0的数组中,然后再赋值给一个大数组,同时设立一个初始化为0的变量,每当往大数组中赋一位值时便加一,用于记录需要塞进载体图片的数据的大小,之所以全是英文,是因为汉字是用两个位表示的,不能直接处理,要用到wchar等数据类型,这对于我有点复杂,做这个的时候又赶时间懒得研究,所以便调整成全英文的形式。

之所以设立一个大数组,则只是我为了应付作业偷懒而为,可以尝试改为动态链表的方式,若改为动态链表,则对大数组中有效数据终点的处理估计会更好

然后进行将数据塞进载体图片的操作,首先,从第8个像素开始,每当处理一个像素前,都预先将之RGB值变为偶数(RGB值减去其和2的余数),然后根据前面所得大数组的01编码数据按B、G、R的顺序(之所以要用BGR的顺序是因为在opencv中图像表示RGB数据的三项的数组[0]、[[1]]、[[2]]是按这个顺序的)依次改变像素RGB值的奇偶性(如果当前大数组数据是0,则B、G、或R值不变,为1,则则B、G、或R值加一)当前像素的RGB三个值都用完后则换下一个像素,2+2/3个像素表示一个文本文件中的字符。

在将大数组中的有效数据都录入完后,也将用于记录需要塞进载体图片的数据的大小的变量变为01编码再利用同样的方式录入图片前7个像素中,用前7个像素来表示塞进载体图片的数据的大小的话,则最多可表示2,097,151‬个01位,也就是约26w个字符

而在这里,我犯了一个错误,因为偷懒,所以十进制数据转换为二进制的数据的函数我是网络上随便找的一个,而这个函数是以整数形式保存二进制数据的,我只是根据需要在后面加了个整数拆分成数组的函数,例如50利用这个函数转化为二进制后为整数"11 0010",在先前ASCII码的转换这步中因为数据小,所以还正常,而在这里,直接将记录大小的变量换算成01编码用整数保存的话数字会特别大,会远大于2147483647这个int类型所能表示的最大的正数,而在找出这个错的过程中设立了cashfile.txt文件用于将提取的01编码保存下来,供我检测是那一部分出的错误,在找出这个错误后,重新编写了二进制转换函数,直接将ASCII码对应的数字转化为数组存储的01编码,这样我就不用再调用二进制转换函数后再调用整数拆分的函数了,省了整数拆分的步骤,算是意外之喜了

图像加密进载体图像
这与文本加密进载体图像的方式类似,先利用opencv技术将要加密的图像加载到内存中,读取该图像的长宽用9位表示,合用18位,依次存入大数组前18位中,然后按B、G、R的顺序依次读取每个像素rgb值,转化为8位01编码同样存储于大数组中,rgb值最大255正好8位够用

在将这个转化而来的数据塞进载体图像中可以直接利用前面加密文本时执行同样功能所用到的函数

而因为我偷懒直接设立的大数组,足足250w位,超过了所用IDE(VS2019)的默认堆栈大小(1MB),编译通不过,经过一番百度,将这大数组设为静态数组可以凑合凑合解决这个问题,在这里,我也才认识到或许可以用动态链表来做,就不会遇上这问题了,而且,250w个数组必然有非常多的位数用不到,很浪费内存,用动态链表也可以起到节约内存的作用

我测试所用的载体图片是分辨率为1920*1080p的bmp图像,它共有2,073,600‬个像素,8/3个像素存储一个数字,而三个数字组成待加密图像一个像素,所以待加密图像像素数不能大于259200,

之所以使用bmp图像而不使用使用频率更大的jpeg图像是因为后者会有压缩,造成误差,十分影响加密数据后对数据的解密

数据的解密
数据解密只需记住载体图像前七个像素用于存储数据量大小,要是解密出图像的话第8到第13个像素还用于存储图像大小,其余都是加密的反操作

确认加密有效
以加密图像为例,首先是待加密图像的相关数据:
在这里插入图片描述
加密后载体图像第8到第13个像素rgb值:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
根据按bgr的顺序奇偶型分布可得01编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值