隐写术,图片中隐藏的秘密!
仔细对比下面两张图片,你能发现什么异样么?
图片1:
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/1.jpg@!full)
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\a3bd762fcaad427ca681714f127f6f0a\1.jpg)
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/2-1.jpg@!full)
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\9d758a7bd8294e0f90032c87f54494f2\2.jpg)
如果你不是有啥超乎常人的特殊技能,应该看不出什么差别。即便能看出差别,也无法得知后背的含义。
其实,我在这里用了“数字隐写术”,在图片中添加了特别的文字信息。只有知道方法和密码的人才能解密。
隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganographia,该书书名源于希腊语,意为“隐秘书写”。
在物理世界中,我们可以用特殊的隐形药水来实现“隐写术”,历史上还有用后脑勺传递秘密的信息的。那么,在数字世界中,我们又是如何实现隐写术的呢?
基本原理
下面就简单的说一下原理。
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\627c195250704c2f936e6e383a1777df\clipboard.png)
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/3.png@!full)
我们知道数码图片由像素构成,而每个像素由RGB构成,R,G,B 都有256种状态。一般用1个十六进制或者,三个十进制来表示。比如上图中RGB(46,22,22),现在我们将这个颜色稍微调整一下,改成RGB(45,21,21)。再来对比一下,看看这两个颜色有什么差别。
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\3e5d5c0a95844bacb07f466245206f78\20220823134005.jpg)
可以看到两个颜色差别不是很大,不仔细看可以说看不出差别。在图片上实现隐写术,靠得就是这个原理。
具体实现中是使用了LSB 技术(Least Significant Bit)。 就是先把文字信息转换成二进制信息,然后将二进制信息写入到每一个RGB的最低位上。
比如6的二进制是:0110
一个像素点的RGB(46,22,22)转换成二进制是RGB(00101110,00010110,00010110)
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/5.jpg@!full)
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\27abe8cb82914895995baa2b1bcebb3e\20220823135604.jpg)
把被加密数字6的二进制信息,按顺序放到RGB的最后一位就好了。处理完之后这个像素点就变成了RGB(00101110,00010111,00010111)转换成十进制就是RGB(46,23,23)。
这里只用了一个像素点,只能放三位,像素点多了,就可以放很多信息。
具体实现方法
如果根据这个原理,自己去实现代码,我估计大部分人会放弃。好在,N年轻就已经有人将这个算法开源了。我们可以通过两个命令来实现加密和解密。下面就开始具体操作吧。
第一步,下载软件。
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\0b2352723cca4bc297d336a2465b2988\20220823123958.jpg)
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/6.jpg@!full)
第二步,准备素材
准备一张名为1.jpg格式的图片,一个名叫test.txt的文本文件,文件里输入想要加密的内容,比如666。这两个文件全部放在桌面上。
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/7.png@!full)
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\bfe921649a674320a2fa885c316db33a\clipboard.png)
第三步,加密。
WIN+R 打开运行窗口,输入cmd,点击确定,打开命令行工具。
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\1d75d85aa86541089bab7c8a883cb48d\clipboard.png)
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/8.png@!full)
输入如下命令:
cd Desktop .\steghide\steghide.exe embed -ef test.txt -cf 1.jpg -sf 2.jpg
注意是一行一行输入,中途会要求输入解密的密码,比如我输入的123,密码需要二次确认。
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/9.png@!full)
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\38b592c8d29d4a60aca48e9d03a8d4cb\clipboard.png)
命令执行完成后,会多出一张2.jpg的文件,就是加密后的图片。
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/10.png@!full)
对比两张图片,可以发现文件大小有些不一样,但是不会有巨大差异。因为整体来说只是改变了像素点的值,没有增加像素点。
第四步,解密。
假设,我们拿到了2.jpg的图片和解密密码,然后就可以对图片进行解密,获取到里面的文字信息了。为了不混淆,先把原先的test.txt删除。
然后用同样的方法打开命令行工具。输入命令:
cd Desktop
.\steghide\steghide.exe extract -sf 2.jpg
输入命令后,输入密码:123,输入成功后可以看到删除的test.txt文件被重新生成了。
![](C:\Users\tony\AppData\Local\YNote\data\526381222@qq.com\b3e540a27b8b42ad86dfcc85e659972f\20220823125820.jpg)
![](https://tonyisstark.oss-cn-hangzhou.aliyuncs.com/2022/08/11.jpg@!full)
打开文件可以看到里面有666!
用这种方式来传递信息,隐蔽性极高,大家可以发挥想象了!更牛逼的是对视频进行处理,那估计能在一部大片里藏下一部小电影。此时如果有一副能实时解码的眼镜,那么…
好了,现在可以尝试去解密我的图片了。
内容很精彩哦!
密码也是:123
————–
补充!!!
很不幸文章里的图片会被裁剪压缩导致信息丢失。
微信和QQ里尝试过没问题。
网盘里也可以!
图片链接:https://pan.baidu.com/s/1ycT6uv6s_E0FkMsp6niDAw?pwd=rcjr