仓库地址:https://github.com/guofei9987/HideInfo
Info Hiding Library
一些原理简洁的信息隐藏方法
算法 | 说明 |
---|---|
幻影坦克 | 使图片在不同的背景下显示不同的图片 |
化物为图 | 把数据以图片形式存放 |
藏物于图 | 把数据藏在图片中 |
图种 | 把图片和文件黏在一起,并存为图片 |
EXIF | 把一段信息放到图片的EXIF中 |
藏物于音 | 把数据隐藏在音频文件中 |
化物为音 | 把数据以音频的形式存放 |
藏物于文 | 把数据隐藏在文本中 |
安装
pip install HideInfo
幻影坦克
功能:一个带透明通道的图片,使其在黑色背景下显示图片A,在白色背景下显示图片B
说明
- 一般情况下,手机/浏览器的预览和点击大图分别使黑色背景和白色背景,因此有”预览是一张图片,点开是另一张图片”的效果
- 例子:example/example_mirage_tank.py
原理:
- 对于每一个像素,符号表示如下:最终生成的图片像素值为 P,透明通道值为 a
- 联立方程:
- 白色背景下显示 A:
aP + (1-a)白 = A
- 黑色背景下显示 B:
aP + (1-a)黑 = B
- 白色背景下显示 A:
- 其中 白色 = 255,黑色 = 0,代入方程,解得
a = 1 - (A - B)
P = B/a
- 因为 a 个取值范围为 0-1,因此需要 B 图较暗,A 图较亮
彩色图片方案:
- 对于1个像素点而言,RGB三通道得到 6 个方程,而只有 4 个未知数
- 方程大概率是无解的
- 方案1:用运筹学方法使 6 个方程尽可能的近似成立
- 方案2:作为近似,计算 a 的时候,使用 A 和 B 对应的 grey 值,用得到的 a 计算 P
hide_as_img:化物为图
功能:把文件/文本/bytes 类数据,转换为图片
原理:图片 1 个像素的 1 个通道可以存放 0-255 的数字,也就是一个字节。因此可以用来存放数据。
使用场景:
- 信息隐藏、隐蔽传输
- 在只能发送图片的场景下(例如社交软件),发送任意信息
说明
- RGB 3个通道都用来存放数据
-
使用前4个字节记录数据的大小,因此要求总的数据量小于 4G
- 代码:example_hide_as_img.py
hide_in_img:藏物于图
功能:文件/文本/bytes 类数据,藏进一个 PNG 图片中,并且用肉眼无法看出区别 原理:(LSB算法)根据信息的二进制形式,改变像素数据的最低位,肉眼是无法察觉 使用场景: - 信息隐藏、隐蔽传输 - 在只能发送图片的场景下(例如社交软件),发送任意信息 - 盲水印、图片溯源、版权保护
说明
- 使用 LSB 算法
- 解原始数据时,无需原图参与,只看最低位
- 使用前4个字节存放数据的大小
- 使用位运算,提高一定的性能
- LSB算法对压缩、转格式等攻击脆弱
- 例子:example_hide_in_img.py
img_seed:图种
功能:把图片和文件连接起来,以图片的形式存下来(目前还不完善)
img_exif:把信息隐藏在图片的EXIF中
功能:把图片和文件连接起来,以图片的形式存下来(目前还不完善)
hide_in_music: 藏物于音
功能:把一段信息(文件/文本/bytes),藏进一个音乐文件中
例子:
hide_as_music:化物为音
功能:把一段信息(文件/文本/bytes),转为声音
说明
- 用 16 种音表示四进制。每个音持续 0.05 秒,因此每秒对应 10 字节。
- 例子:hide_as_music.py
hide_in_text:藏物于文
功能:把一段信息(文件/文本/bytes),藏进一段文本中
说明
- 实测在苹果设备 Macbook、IOS 上,隐藏前后的文本看不出区别。但是 Windows 和某些安卓系统上,会有空格
- 例子:hide_in_text.py
缩放藏图
效果:一张图片缩放后,变成另一张图片
原理:
- 缩小图片时,如果使用近邻法,缩放过程就是把指定的像素提取,然后组成一个新图片。
- 如果事先把这些像素找到,并替换成另一个图片,那么就能够得到“缩放前是图片A,缩放后是图片B”的效果了
限制:
- 必须是 PNG,不能是JPG格式
- 缩放后的大小是确定的,才能显示图片B
- 缩放算法必须是近邻法
- 操作系统自带的缩放算法未必和嵌入算法一致,因此最好用代码来统一(这样做这算法好像使用范围很窄了)
额外
- 可以做多层嵌套,效果是:缩小图片后得到图片B,再次缩小后得到图片C
代码示例:https://github.com/3150601355/SimpleScaleDown