V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Aaron99
V2EX  ›  分享创造

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

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

    引言

    先看下面这张图像:

    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
    starvedcat  
       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  
       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   ·   实用小工具   ·   3269 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:38 · PVG 20:38 · LAX 04:38 · JFK 07:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.