PNG——藏在像素里的秘密
PNG像素隐写方式(主要是时域隐写)
emmm其实这个没什么好说的,就是藏在PNG像素里的一些人类肉眼比较难感知的方式,但是又可以从这些信息中重新复原隐藏的信息,常见的PNG像素隐写有:
- LSB
- 变种LSB
- 盲水印隐写
- 其他脑洞隐写术
PS:本人比较菜,如果有其他可以补充的,可以评论告诉我)
LSB
LSB全称leastsignificant bit,是一种基于图片最低有效位修改储存信息的隐写方法。一般我们看到的图像是由RGB三个颜色构成的,范围为(0-255,0-255,0-255),现在还有图像拥有alpha图层,也有的在alpha上用lsb的,但不多见。范围的255的范围用二进制表示00000000
~11111111
,而如果我们改变最后一个二进制位的数值,将其变成00000001
或是11111110
,在我们的感官上是几乎识别不出来的。这也就是隐写术中的最简单的隐写方式了。我们所需要做的只有将信息转化成二进制,再将其放入图像的最后一位(也就是RGB值+1或-1),解决方法也很简单,现在有一个工具可以直接检测所有层的LSB,方法是zsteg -v 图片.png
即可。但是有的将黑白图像像素转化成二进制,这个我们就用Stegsolve
这个工具检测就行,zsteg偏向于将二进制输出,而Stegsolve偏向于图像。正常情况下一张有信息隐藏的图像的低位像素是这样的
看到蓝色的最低位图层上有大堆乱码且与之前图层像素值不同就可以判断该图像有LSB数据在这。详细操作可以看看UNCTF信号不好我先挂了。
变种LSB
因为LSB在低像素位很容易会被检测出来,所有就衍生了各种变种的LSB隐写,但若是这种变种,大部分都会给出其加密脚本,看懂脚本即可解密。变种通常是在LSB的数据将其进行加密,使其更加倾向于随机数据来使用,导致无法从最根本的图层察觉上观察到LSB的加密。下面是一个例子:
这是第一图层:
这是第0图层:
查看LSB的二进制:
可以看出,这里几乎找不到任何的可能是信息的线索。
盲水印隐写
基于LSB的图像信息的隐藏,这种在空域里的方法有较大的缺陷,鲁棒性是比较差的。随便一个后期的都会造成水印的丢失。然后就有了频域隐写的盲水印隐写术。这种隐写的一般解密需要两张图,但是如果你有matlab,有加密图像即可。以下是解密脚本:
imageA = imread('3.bmp','bmp');
fftA = fft2(imageA);
imshow(fftshift(fftA))
imshow(fft(rgb2gray(imread('shimakaze.bmp'))), [1,2]);
但是如果有原图的话,可以用:
python decode.py --original <original image file> --image <image file> --result <result file>
例题可以看看。。。还是UNCTF信号不好我先挂了第二个。
检测是否是盲水印可以和LSB一样观察图层,若有如下一样的条纹,可以认为就是有盲水印的存在。
其他脑洞隐写
这就触及我的知识盲区了=。=,隐写之多,数是数不过来的只有在之后的比赛或学习中,遇到一个掌握一个才是正道。