[把文字写进像素里] 基于像素微调实现的文字隐写术 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Aaron99
V2EX    分享创造

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

  •  1
     
  •   Aaron99 2017-01-27 13:25:40 +08:00 8627 次点击
    这是一个创建于 3231 天前的主题,其中的信息可能已经有所发展或是发生改变。

    引言

    先看下面这张图像:

    870308089_result.png

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

    70127131046717.jpg

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

    原理

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

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

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

    原图:

    qww.jpg

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

    963573080_result.png

    源代码

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

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

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

    第 1 条附言    2017-01-27 16:30:40 +08:00
    刚刚服务器被 D ,所以演示站暂时无法访问
    第 2 条附言    2017-01-28 07:59:48 +08:00
    感谢大家支持,看到大家的回复,发现这个技术的确很早前就有了,但此帖是我受同学启发,并独立思考出来的结果,就当是做了个在线版的方便大家使用吧!
    64 条回复    2018-04-15 15:52:08 +08:00
    kid740246048
        1
    kid740246048  
       2017-01-27 13:30:09 +08:00 via Android
    以后开车更方便更隐蔽了(大雾
    Aaron99
        2
    Aaron99  
    OP
       2017-01-27 13:31:02 +08:00
    @kid740246048 为什么你们第一反应全是开车用。。←_←
    bdbai
        3
    bdbai  
       2017-01-27 13:31:32 +08:00 via Android
    压缩一下图片就没用了吧,一定要原图才可以
    Aaron99
        4
    Aaron99  
    OP
       2017-01-27 13:33:06 +08:00
    @bdbai 是这样 但是有些压缩技术是无损压缩的,可以大大减小图像体积
    starvedcat
        5
    starvedca  
       2017-01-27 13:43:46 +08:00
    某知名企业内网论坛的背景是不是就用了类似的技术。。?这样就可以查出是哪个账号截的图
    wujunze
        6
    wujunze  
       2017-01-27 13:50:33 +08:00
    不错 感谢分享
    xenme
        7
    xenme  
       2017-01-27 13:54:57 +08:00 via iPhone   2
    应该具有鲁棒性,抗污损、裁剪。
    然后世界上的所有图片里面全部是种子,以后拿手机拍张照就能开车是多么壮观
    Baymaxbowen
        8
    Baymaxbowen  
       2017-01-27 13:59:56 +08:00 via Android
    真正意义上的图种
    loading
        9
    loading  
       2017-01-27 14:01:18 +08:00 via Android
    比 copy 大法高明不少。
    a87150
        10
    a87150  
       2017-01-27 14:11:54 +08:00
    随便选了几张 jpg 图片读取发现会出现 badii 这个词。
    Aaron99
        11
    Aaron99  
    OP
       2017-01-27 14:12:15 +08:00
    @a87150 手抖,已修复
    Aaron99
        12
    Aaron99  
    OP
       2017-01-27 14:17:26 +08:00
    Laynooor
        13
    Laynooor  
       2017-01-27 14:24:59 +08:00 via Android
    把账号密码什么的写进图片然后做桌面壁纸..
    distant1219
        14
    distant1219  
       2017-01-27 14:27:40 +08:00
    厉害了我的哥
    RqPS6rhmP3Nyn3Tm
        15
    RqPS6rhmP3Nyn3Tm  
       2017-01-27 14:37:43 +08:00 via iPhone
    压缩是大头啊,在互联网上传播的图片少有不压缩的
    Aaron99
        16
    Aaron99  
    OP
       2017-01-27 14:39:23 +08:00
    @BXIA 的确是这样
    netpart1
        17
    netpart1  
       2017-01-27 14:46:13 +08:00 via iPhone
    有什么意义,对比度,亮度,随便处理一下,就没了,只有作为暗号有意义,
    Quaintjade
        18
    Quaintjade  
       2017-01-27 14:49:13 +08:00
    是不是可以理解成 RGBA 32-bit 中每个通道拿出 1 个 bit 来存放信息?那样的话理论上能放 4 倍信息量。
    如果不用校验的话,我觉得没必要每个通道都拿出一个 bit 。从 alpha 通道或 blue 通道拿一个就行了。
    Aaron99
        19
    Aaron99  
    OP
       2017-01-27 14:49:52 +08:00
    @Quaintjade 嗯 的确是这样 可以降低图像品质损耗
    XiaoXiaoNiWa
        20
    XiaoXiaoNiWa  
       2017-01-27 14:56:00 +08:00 via Android
    CTF 中用的隐写?
    netpart1
        21
    netpart1  
       2017-01-27 15:03:51 +08:00 via iPhone
    这个东西修改一下,就有意义,利用 16 数字存放文字, 16 个字节,,表示两个字节完整文字,也就是 4 个像素,这样计算机可以通过图片,直接获取图片图像意义
    netpart1
        22
    netpart1  
       2017-01-27 15:09:16 +08:00 via iPhone
    你这个东西除了发暗杀 令,而且逃避责任,有用,其他没有意义
    Aaron99
        23
    Aaron99  
    OP
       2017-01-27 15:10:04 +08:00
    @netpart1 本来就是。。搞着玩的 = =
    creamiced
        24
    creamiced  
       2017-01-27 15:27:07 +08:00
    数字水印
    netpart1
        25
    netpart1  
       2017-01-27 15:33:54 +08:00 via iPhone
    楼主,你可以申请专利了,用这个 js 加密,绝对不会被破解,代码写在图片中, flash 加载图片,解码,运行代码,然后 flas 写很复杂,而且混淆,这样代码被破解可能性,大大减小
    Aaron99
        26
    Aaron99  
    OP
       2017-01-27 15:37:15 +08:00
    @netpart1 用单纯的图像存放代码国外之前有人搞过 QAQ
    aitaii
        27
    aitaii  
       2017-01-27 15:59:03 +08:00
    porn 可是推动互联网技术发展的一大动力呀
    netpart1
        28
    netpart1  
       2017-01-27 16:31:45 +08:00 via iPhone   1
    想想希拉里被黑,就是通过这种方式,俄罗斯黑客先上传,足够多代码图片,然后经过一个可执行漏洞,然后就被黑了,而且找不到证据
    Daniel65536
        29
    Daniel65536  
       2017-01-27 17:24:22 +08:00 via iPhone
    如果想做图种的话,直接搞二维码的模式啊,用偶数方块代表黑色区域,奇数方块代表白色区域,鲁棒性好很多的。

    另外一个有效的思路是搞傅立叶变换来写,鲁棒性更好
    ashfinal
        30
    ashfinal  
       2017-01-27 18:25:34 +08:00
    关注一下
    imn1
        31
    imn1  
       2017-01-27 19:23:19 +08:00 via Android
    linux, android, windows 都已经有现成的了,果家不清楚,你这个比起人家有什么优势么?
    Aaron99
        32
    Aaron99  
    OP
       2017-01-27 19:46:10 +08:00
    @imn1 什么?
    Aaron99
        33
    Aaron99  
    OP
       2017-01-27 20:05:15 +08:00
    @imn1 我们说的。。是一个东西吗?
    maomo
        34
    maomo  
       2017-01-27 21:26:33 +08:00
    建议百度一下图像隐写,学术界论文一大把。你这个就是最简单的 LSB 隐写,毫无优势
    kaneg
        35
    kaneg  
       2017-01-27 21:27:41 +08:00 via iPhone
    据说有公司在内部论坛里启用了此类技术来标示个人信息,无论截图, ps ,还是压缩,信息都不会丢失,如果网上有人传播,只要一还原就知道是谁泄密的。
    Aaron99
        36
    Aaron99  
    OP
       2017-01-27 21:39:01 +08:00
    @kaneg 哪个是把图像隐藏在其中,大众点评用过
    lslqtz
        37
    lslqtz  
       2017-01-27 21:45:36 +08:00 via iPhone
    群里看到的 支持
    Arcus
        38
    Arcus  
       2017-01-27 21:47:57 +08:00 via Android
    感觉鲁棒性不强
    xuboying
        39
    xuboying  
       2017-01-27 21:48:32 +08:00 via Android
    数字水印不是干这个的么,楼主造轮子么
    Aaron99
        40
    Aaron99  
    OP
       2017-01-27 21:52:31 +08:00
    @xuboying 可能的确有不足的地方,但确实是我自己想出来的
    tankcong
        41
    tankcong  
       2017-01-27 23:35:53 +08:00
    楼主造轮子了,隐写术,有很多算法了,[Steganography]( https://en.wikipedia.org/wiki/Steganography)
    Aaron99
        42
    Aaron99  
    OP
       2017-01-27 23:41:02 +08:00
    @tankcong 同上
    eyp82
        43
    eyp82  
       2017-01-27 23:46:22 +08:00   1
    还是鼓励一下楼主, 现在各行各业科学家这么多, 很难想出一个完全独创别人没搞过的领域, 能自己想出这个也确实很有创意. 大家不要打击. 个人很喜欢这类的帖子. 比口水贴好多了.
    sivacohan
        44
    sivacohan  
    PRO
       2017-01-27 23:59:46 +08:00 via Android
    能做出来挺了不起的。
    独立思考很重要。

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

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

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

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

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

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

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

    另外你 at 错人了
    Aaron99
        59
    Aaron99  
    OP
       2017-01-28 16:17:56 +08:00 via Android
    @unsec 编程也没学过,只是业余爱好
    netpart1
        60
    netpart1  
       2017-01-28 16:48:38 +08:00 via iPhone
    @unsec 看楼主言谈举止就像,大学生,我也脑补成,计算机大学生了,看来这里面,水很深啊
    Aaron99
        61
    Aaron99  
    OP
       2017-01-28 16:49:59 +08:00
    @netpart1 高三狗
    yukiww233
        62
    yukiww233  
       2017-01-28 22:28:32 +08:00
    高三狗 厉害了
    http://www.yixieshi.com/54464.html 看了下某厂的数字水印,除了屏摄,抗干扰力很强啊
    基于像素的这方面应该还有些问题
    panda1001
        63
    panda1001  
       2017-02-02 19:29:27 +08:00 via Android
    以前在实验楼里看到的
    https://zhuanlan.zhihu.com/p/22834362
    V9527
        64
    V9527  
       2018-04-15 15:52:08 +08:00
    @starvedcat 看来钉钉 APP 的聊天界面(澡堂模式除外)用 ID 水印还算正大光明的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1115 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 17:41 PVG 01:41 LAX 09:41 JFK 12:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86