此脚本可将文件隐藏到图像中,并将修改后的图像保存到磁盘。
可隐藏在图像中的文件大小上限取决于图像的尺寸。
最大文件大小 = ( 图像高度 * 图像宽度 * 6 / 8 ) 字节
'100k words.txt' 被隐藏在 'original_image.png' 中,生成的文件名为 'image_with_100k words.png'。 去检查一下,看你能不能发现这两张图片之间的区别。 你可以使用此模块从 'image_with_100k words.png' 中提取 '100k words.txt'。
原始图像

修改后的图像

这张图片中隐藏了 10 万个单词(一个文本文件)!
它基于一个简单的原理:如果我们改变每个像素的最低有效位(LSB),那么这种变化不会很明显,人眼无法察觉。
因此,该模块从待隐藏文件中取出 2 位数据,并用这 2 位替换一个像素的最后 2 位,然后移动到下一个像素。 像素的最大变化可以是 4 个单位,而 PNG 图像中值的范围是 (0,255),所以这种变化不会很明显。
在 PNG 图像中,每个像素有 3 个通道:红、绿、蓝。(某些 PNG 图像有 1 个或 4 个通道,但此程序会将它们转换为 3 个通道) 一个典型的 PNG 图像像素如下所示:
一个像素 = (17,32,11) # (红, 绿, 蓝)
因此,我们可以在一个像素中保存 3 次 × 2 位,即每个像素 6 位。这就引出了可隐藏在图像中的文件大小上限:
最大文件大小 = ( 图像高度 * 图像宽度 * 6 / 8 ) 字节
我们通过一个例子来理解。要隐藏的数据是:
二进制数据 = 0b100111
让我们取出前两位,并用它们替换 '一个像素' 的红色通道。
一个像素 = (0b10001, 0b100000, 0b1011) # 像素值的二进制表示
# 改变像素的红色通道
# 0b10001 -> 0b10010 (前两位是 10)
一个像素 = (0b10010, 0b100000, 0b1011) # 修改后的像素
再从二进制数据中取出两位,并用它们替换绿色通道的最后两位。
一个像素 = (0b10010, 0b100000, 0b1011)
# 改变像素的绿色通道
# 0b100000 -> 0b100001 (两位是 01)
一个像素 = (0b10010, 0b100001, 0b1011) # 修改后的像素
再用蓝色通道重复一次,就完成了。
一个像素 = (0b10010, 0b100001, 0b1011)
# 改变像素的蓝色通道
# 0b1011 -> 0b1011 (两位是 11) ; 注意这次值没有改变
一个像素 = (0b10010, 0b100001, 0b1011) # 这次像素未被修改
所以,我们已经将 6 位信息隐藏在一个像素中,来看看像素的变化:
一个像素 = (0b10001, 0b100000, 0b1011) = (17, 32, 11)
包含数据的像素 = (0b10010, 0b100001, 0b1011) = (18, 33, 11)
如我们所见,这种变化在像素级别甚至不易察觉。本模块会重复这个过程,直到所有数据都保存到图像中。

注意:照片中的噪点会增加,如果使用任何照片编辑软件并将其与原始图像进行比较,那么这张图像会比原始图像有更多的噪点。
这个问题的解决方案:永远不要在互联网上上传/分享原始图像。
MIT
免费软件,太棒了!