[把文字写进像素里] 基于像素微调实现的文字隐写术

2017-01-27 13:25:40 +08:00
 Aaron99

引言

先看下面这张图像:

这张看似“纯黑色”的图像中其实隐藏了一份完整版的 GPL V3 协议的中文译文,而且文字信息就隐藏在像素之间。想要获得这幅图像的密文信息,我们只需要打开( https://hide.aoaoao.me),选择这张图像,即可解密出完整内容:

如果想要生成这种带有密文的图像,只需要选择已有的图像,填写密文,即可生成。这样的隐写术不是直接讲内容写入文件数据,而是通过微调像素的色值来达到存放数据的目的,由于只是微调,因此正常人很难察觉其中的变化。

原理

  1. 将待处理文本转换为二进制格式,并补足 16 位连接起来
  2. 遍历图像的每个像素的每个色彩通道值,与之前的二进制数据相对应,如果为 1 ,则微调当前色彩值至最近的偶数,反之为奇数
  3. 在图像开始和文本写入结束时分别加入特殊标记以便后期读取识别

理论上一张图像可以存放的字数(中英文都算为1个字)=(图像长像素数X图像宽像素数-34)/16。比如:一张500像素X500像素的图像可以存放约15万字。

我用一些图像测试了一下,大家可以对比对比:

原图:

下图为写入《独立宣言》中文译文后的图像:

源代码

GitHub:https://github.com/HFO4/HideByPixel

Demo:https://hide.aoaoao.me/

(代码匆忙写成,有许多 Bug ,时不时会抽风,请多多包涵)

8048 次点击
所在节点    分享创造
64 条回复
tankcong
2017-01-27 23:35:53 +08:00
楼主造轮子了,隐写术,有很多算法了,[Steganography]( https://en.wikipedia.org/wiki/Steganography)
Aaron99
2017-01-27 23:41:02 +08:00
@tankcong 同上
eyp82
2017-01-27 23:46:22 +08:00
还是鼓励一下楼主, 现在各行各业科学家这么多, 很难想出一个完全独创别人没搞过的领域, 能自己想出这个也确实很有创意. 大家不要打击. 个人很喜欢这类的帖子. 比口水贴好多了.
sivacohan
2017-01-27 23:59:46 +08:00
能做出来挺了不起的。
独立思考很重要。

现在应该看看 digital watermarking
或者隐写

你的算法和上面提到的 LSB 很像。
想要实现抗裁剪,基本就是把 rgb 三个通道的参数当成三个波。然后根据需要,把自己的数据放在高频部分或者低频部分。
mritd
2017-01-28 00:29:06 +08:00
开车走起
scnace
2017-01-28 01:05:41 +08:00
之前有教授来讲过这个隐写技术…(话说我那时候竟然没有反应过来可以开车!
bellchu
2017-01-28 02:01:21 +08:00
https://github.com/guardianproject/pixelknot
想法不错,但是类似的东西早有很多, dos 视霸卡 win3.1 附近那年代就有了,当时也是为了开车,看 H 图(视频),小伙伴把自己的珍藏藏好, echo 路劲和密码在正常图片文件后面拷软盘刻光盘(贵)传阅。青春期第一次背着大人看 Playboy 女郎坐车,印象深刻。

后来上大学的时候计算机图形学课就搞 RGB,HSL 藏字游戏了。建议楼主看看 imagemagick 之类的大开源项目,会有启发。

我一直认为色情业推动人类社会发展进步。没有黄色网站哪里来那么多压缩技术,哪里来 YouTube …偏题了……
unsec
2017-01-28 02:27:37 +08:00
@eyp82 @sivacohan

这个技术早就很成熟了。我们至少五年前就已经应用。关键词: Steganography

另外看了下楼主的代码,应该是刚接触编程不久的
ryd994
2017-01-28 06:26:54 +08:00
主要应该还是用于水印
根据信息论,新图片压缩后大小越等于原图片压缩大小加数据大小
现在的无损压缩算法,压缩率基本上能逼近信息熵了
Aaron99
2017-01-28 07:58:10 +08:00
@ryd994 嗯。。 python 没系统学过
Zohar
2017-01-28 10:29:51 +08:00
活捉大佬一枚!滋辞滋辞ʕ•ٹ•ʔ
UnknownR
2017-01-28 10:32:59 +08:00
safari 打不开网站, ie, edge, chrome 和 firefox 都能打开。。。 windows , linux 和 mac 上都试过了
netpart1
2017-01-28 12:37:56 +08:00
楼主是初学者,能够捣鼓这个出来,说明了发散思维,还可以,但是你要抓住重点,由于像素小幅度值改变得,在颜色改变上人眼不明显,而计算机则非常敏感,这个才是原理,要明白重点
imn1
2017-01-28 13:12:13 +08:00
@Aaron99
如果你这个跟 steganography 没关系,那就请慎用"隐写"这个词,会误导
netpart1
2017-01-28 15:00:40 +08:00
@imn1 这个截图, ps ,缩放,压缩等等,稍微处理一下,信息就没了,要解决以上问题,比实现上面得,复杂许多
Rice
2017-01-28 15:17:32 +08:00
@starvedcat 某知名企业的是用傅立叶变换把信息加到频谱上吧?如果我没记错的话。
imn1
2017-01-28 15:25:16 +08:00
@netpart1
其实这个要根据场景,就像不同的话在不同语境意义相差甚远一样
隐写其实重点在于传送“隐”的内容,而不在图片,传送过程中各个环节都应该清楚这点,不会随意改变图片
如果传送的某个节点让外部随意改动,或者通过有可能会被改动的公众途径传送,他本身就有问题

其实我手机上也有用隐写图片,记录了几个银行帐号,密码我可以用脑记,但那一长串银行帐号还真是记不住,又不想随便写在一个 TXT 里面
unsec
2017-01-28 16:00:42 +08:00
@Aaron99 这个跟学没学过 Python 没关系。所有代码逻辑写一个 web.py 里还有 N 层级的 for ,这个不是语言问题,是编程思维还很初级

另外你 at 错人了
Aaron99
2017-01-28 16:17:56 +08:00
@unsec 编程也没学过,只是业余爱好
netpart1
2017-01-28 16:48:38 +08:00
@unsec 看楼主言谈举止就像,大学生,我也脑补成,计算机大学生了,看来这里面,水很深啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/337138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX