基于 Python 实现「图片隐写术」

technics

隐写术(Steganographia)

隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganographia,该书书名源于希腊语,意为“隐秘书写”。

概要

一般来说,隐写的信息看起来像一些其他的东西,例如一张购物清单,一篇文章,一篇图画或者其他“伪装”(cover)的消息。
隐写的信息通常用一些传统的方法进行加密,然后用某种方法修改一个“伪装文本”(covertext),使其包含被加密过的消息,形成所谓的“隐秘文本”(stegotext)。例如,文字的大小、间距、字体,或者掩饰文本的其他特性可以被修改来包含隐藏的信息。只有接收者知道所使用的隐藏技术,才能够恢覆信息,然后对其进行解密。

现代隐写术

载体文件(cover file)相对隐秘文件的大小(指数据含量,以比特计)越大,隐藏后者就越加容易。
因为这个原因,数字图像(包含有大量的数据)在互联网和其他传媒上被广泛用于隐藏消息。这种方法使用的广泛程度无从查考。例如:一个24位的位图中的每个像素的三个颜色分量(红,绿和蓝)各使用8个比特来表示。如果我们只考虑蓝色的话,就是说有28种不同的数值来表示深浅不同的蓝色。而像11111111和11111110这两个值所表示的蓝色,人眼几乎无法区分。因此,这个最低有效位就可以用来存储颜色之外的信息,而且在某种程度上几乎是检测不到的。如果对红色和绿色进行同样的操作,就可以在差不多三个像素中存储一个字节的信息。
更正式一点地说,使隐写的信息难以探测的,也就是保证“有效载荷”(需要被隐蔽的信号)对“载体”(即原始的信号)的调制对载体的影响看起来(理想状况下甚至在统计上)可以忽略。这就是说,这种改变应该无法与载体中的噪声加以区别。
(从信息论的观点来看,这就是说信道的容量必须大于传输“表面上”的信号的需求。这就叫做信道的冗余。对于一幅数字图像,这种冗余可能是成像单元的噪声;对于数字音频,可能是录音或者放大设备所产生的噪声。任何有着模拟放大级的系统都会有所谓的热噪声(或称“1/f”噪声),这可以用作掩饰。另外,有损压缩技术(如JPEG)会在解压后的数据中引入一些误差,利用这些误差作隐写术用途也是可能的。)

项目地址

https://github.com/DioPong/Steganography

实现方法

库依赖

  • argparse:实现CLI方法,从控制台把内容填充到图片中。
  • os:获取图片路劲。
  • Pillow:实现对图片数据的操作。

实现思路

  1. 通过argparse模块,从控制台获取实现的方法是解码还是插入内容。
    如果是插入内容,同时需要传入图片的路径,以及插入的内容;如果是解密,指定图片路径后输出图片隐藏的信息。
  2. 若加密:
    • 传入图片,将图片各个值改为偶数,返回该副本,
    • 将文本转为固定长度的二进制,
    • 检查代码长度是否满足根据图片大小检查到的插入字符串最大合法长度,是则下一步,否则抛出异常,
    • 将最低有效位为0的位置插入数据,
    • 保存副本图片
  3. 解密:
    • 逆向操作上过程即可。

实现操作

$ run in terminal
python main.py [method] [args*]

加密 (decode)

python main.py -e /home/picture/Steganographia.png "Nice, Steganographia!"

解密 (encode)

python main.py -d /home/picture/Steganographia.png

BUG

目前仅支持拥有RGBT四通道的图片(eg: PNG,SVG,etc),仅有三通道(RGB)的图片会报错(eg: JPG)
解决方法: 稍微改一下 encode 方法,支持三通道,追加预判别是三通道还是四通道。

Author: DioPong

Permalink: https://blog.2to.fun/post/technics/Steganographia/

文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。

Comments

Unable to load Disqus, please make sure your network can access.