图片隐写术,是一种将信息藏在图片中的技术。这个技术的前景非常广阔,在网络安全、神经网络对抗攻击等都有一定应用。
2020年7月10日,我开发出图片隐写工具——TPEncoder v1.0.2,可以将海量信息藏匿在图片中。写完还迫不及待地跟别人试了试。
今天山东还在高考,所以标题没啥毛病。(狗头)
据计算,大小为
比如下图:
这张图藏着dio的著名台词:
ジョジョ、人間ってのは能力に限界があるな。俺が短い人生で学んだことは、人間は策を弄 すれば弄するほど、予期せぬ事態で策が崩れ去るってことだ。人間を超えるものにならねばな。俺は、人間をやめるぞ、ジョジョ!
工程源代码与可执行程序:
Text-Picture Encodergithub.com理论基础
首先,无论是中文、日文、英文还是什么其他语言的字符,在计算机中都有对应的二进制编码方式,如unicode:
而位图中每一个像素也是二进制的,根据RGB的值存储的——第一个字节是B的值,范围为
如果我们将每一个字符的值直接输出到位图的RGB中,最简单的文本转图片编码器就完成了。不过根据像素的值很容易推断出其内容,比如下图中,用工具直接加密源代码:
细心的朋友可以看出,由于一个像素是三个字节,即三个字符的编码值共同决定的,因此最接近灰色的位置可能是由小写字母字符('a'-'z',ASCII取值范围
再比如这篇我的这篇关于摇滚音乐文化的论文:
因此我们希望在这个最简单的编码器中有所加强,使得输出的图片尽可能地接近纯色;或者换句话说,相邻两个像素之间颜色的变化不能太过明显。
有三个维度扰动限制的文本图片编码器
没有扰动限制时,每个像素的取值范围为
因此,如果将每个像素RGB值的可变范围从
虽然需要更大的图片来存储,但有两点更加显著的变化:
- 每个字符占8或16个比特,若每个像素储存的比特数为24,有一个很大的公约数8,这样的话像素和像素之间的关联性就会变得很大,比如全篇文章如果都是汉字,那么,整个图片都会显得很亮。但如果每个像素只储存15个比特有效字符,那么公约数只剩下了1,像素间的关联性被降到了最低。
- 每个像素的变化变得更小,甚至人眼难以观察,进一步降低了隐写被察觉的风险。
如果仅仅是全黑的图片就没意思了,我们还可以修改默认像素颜色。
默认像素颜色的加入
这一步就非常容易了,只需要用户自定义基础值,而不是简单的RGB全0即可。不过需要检查基础值与扰动最大限度的和不能超过255:
工具的展望
除纯色图片隐写之外,编码器工具还可以实现彩色位图的隐写——即默认RGB值并非固定,而是根据额外输入图片里每个位置的RGB值而变化。这样生成的fake image,隐写更难被发现。
图片隐写的起点也未必是左上角像素,可以是任意指定的位置(只要没有超过图片大小),其余像素也可以是随机噪声,以混淆视听。
这些功能,工具暂时还没有实现,不过也比较容易去完成。敬请期待!