二值图像信息隐藏
本来是一个可以通过百度复制粘贴完成的作业,但是由于没意义的好奇心最后导致我学了一系列乱七八糟的东西并手动实现了一下。。。
多谢老国王带我光速进行了基础知识的学习
图片格式
图片主流格式有jpg png 和 bmp,前面两种都蛮复杂的,有数据压缩之类的的环节
可以在010editor里面下一个图片格式模板之类的东西,就能快速解析图片格式了,还挺好用的
bmp格式的图片就比较简单,也是最好分析的,图片头定义了图片的宽和高,再加上一点基本数据就直接是像素点的堆叠了,图像的数据部分就直接是代表每个像素点的字节,所以同样的一张图片,bmp格式就会占用更多的空间,毕竟完全不存在压缩操作
图片也有蛮多类型,二值图像,灰度图像,彩色图像等等
今天学习的是二值图像,就是图像只有黑白两色,图像处理经常会用到灰度图像,就是从白到黑一共256个颜色深度,彩色图像经典的就是RGB图像,其实就是红绿蓝三个色彩通道各自256个颜色深度,叠到一起凑出来256^3种颜色的彩色图像
那么显而易见,二值图像可以用1个bit,也就是一位01来表示一个像素点,灰度图像就需要1个byte,也就是8位01表示256种深度的一个像素点,彩色图像就得3个byte来表示一位像素点了,差不多
bmp为二值图像的时候还有一个很有意思的地方,他会在文件头处有8个字节表示这个图二值是哪两个颜色,0表示前4个字节对应的颜色,1表示后四个字节对应的颜色,如果我们修改这八个字节,他就会展现出别的颜色,比如红蓝的二值图像(原来二值图像不一定是黑白的,只是只有两个颜色而已)
试了一下发现jpg格式的好像不支持二值图像,只有bmp和png支持二值图像
二值图像隐写
原理也非常的简单,因为二值图像纯由黑白两色组成,我们可以把整个图像当成一个01序列,对相邻相同的字符数量(游程)进行统计
通过修改游程的奇偶性进行信息隐藏,游程为偶数表示0,游程为奇数表示1
把需要隐藏的内容01二进制编码塞进去就行了,因为每段只修改一个像素点,其实也很难被发现,如果图像方方正正的(比如我后面用来实验的是二维码,就有点明显,但是如果随便找个图像再转成二值的,那真是完全看不出来)
写了个垃圾脚本,可以完成二值图像的隐写,网上找的图像就算看上去是黑白的事实上也是RGB图像,所以处理完之后会变成三个图像,其实就是三个通道分开来的效果。并且截图什么的其实都是得到一个RGB图像,不过在后续健壮性测试的时候发现如果RGB图像是纯黑白两色的,在展开到三个通道的时候对应位好像也是全0和1也能把信息恢复出来,真是神奇
工具丢在GitHub上了,抄作业的时候给个star pls
binary_image_information_hidding