/HideInfo

一些小而美的信息隐藏技术:幻影坦克、藏物于音等

Primary LanguagePythonMIT LicenseMIT

HideInfo

Info Hiding Library
一些小而美的信息隐藏方法

PyPI License Python Platform stars fork Downloads

算法 说明
幻影坦克 使图片在不同的背景下显示不同的图片
化物为图 把数据以图片形式存放
藏物于图 把数据藏在一个图片中
图片隐水印 图片空域上的隐水印
图种 把图片和文件黏在一起,并存为图片
EXIF 把一段信息放到图片的EXIF中
化物为音 把数据以音频的形式存放
藏物于音 把数据隐藏在一个音频中
回声水印 以回声的形式,把二进制嵌入到音频中
化物为文 把数据以文本文件的形式存放
藏物于文 把数据隐藏在一段文本中

安装

pip install HideInfo

幻影坦克

功能:把两个图片合并,使其在黑色背景下显示图片A,在白色背景下显示图片B

说明

  • 已支持彩色图片
  • 一般情况下,手机/浏览器的预览和点击大图分别使黑色背景和白色背景,因此有"预览和点击是两张不通的图"的效果
  • 短视频:B站
  • 例子:example/example_mirage_tank.py
from hide_info import mirage_tank

mirage_tank.mirage_tank('图片.png', 'img2.jpeg', '幻影坦克.png')

hide_as_img:化物为图

功能:把文件/文本/bytes 类数据,转换为图片
原理:图片 1 个像素的 1 个通道可以存放 0-255 的数字,也就是一个字节。因此可以用来存放数据。 使用场景: - 信息隐藏、隐蔽传输 - 在只能发送图片的场景下(例如社交软件),发送任意信息

说明

  • RGB 3个通道都用来存放数据
  • 使用前4个字节记录数据的大小,因此要求总的数据量小于 4G
  • 可以存放文件、文本、bytes 类数据,把它转化为一张图片
  • 代码:example_hide_as_img.py
from hide_info import hide_as_img

# 文件转为图片并存下来
hide_as_img.file_encode(filename='要隐藏的文件.zip', img_filename='化物为图.png')
# 把图片再转回文件
hide_as_img.file_decode(filename='化物为图-解出来的文件.zip', img_filename='化物为图.png')

hide_in_img:藏物于图

功能:文件/文本/bytes 类数据,藏进一个 PNG 图片中,并且用肉眼无法看出区别 原理:(LSB算法)根据信息的二进制,改变像素数据的最低位,肉眼是无法察觉这种改变 使用场景: - 信息隐藏、隐蔽传输 - 在只能发送图片的场景下(例如某社交软件),发送任意信息 - 盲水印、图片溯源、版权保护

说明

  • 解原始数据时,无需原图参与,只看最低位
  • 使用前4个字节存放数据的大小
  • 使用位运算,提高一定的性能
  • LSB算法对压缩、转格式等攻击脆弱
  • 例子:example_hide_in_img.py
from hide_info import hide_in_img

# 把文件隐藏到图片中
hide_in_img.file_encode(filename='要隐藏的文件.zip', img_filename='图片.png', img_filename_new='藏物于图.png')
# 从图片中提取文件
text_encode = hide_in_img.file_decode('藏物于图-解出的文件.zip', img_filename='藏物于图.png')

img_watermark: 图片空域上的隐水印

说明:

  • 同样使用 LSB 算法。
  • 水印是一个 二值图
  • 可对抗裁剪攻击
  • 如果图片有大片纯色区域,对这些攻击有一定的鲁棒性:缩放、转格式、截图、裁剪。如果没有大片纯色区域,则不能对抗这些攻击。
  • 例子:example/example_img_watermark.py

代码

from hide_info import img_watermark

# 嵌入隐式水印
img_watermark.file_encode(img_filename="图片.png", watermark_filename="watermark.png", img_filename_new="图片_打入水印.png")

# 提取隐式水印
img_watermark.file_decode(img_filename="图片_打入水印.png", wm_extract="解出的水印.png")

img_seed:图种

功能:把图片和文件连接起来,以图片的形式存下来(目前还不完善)

img_exif:把信息隐藏在图片的EXIF中

功能:把信息隐藏在图片的 EXIF 中,从而获得隐蔽信息、传输隐蔽信息的能力

hide_in_music: 藏物于音

功能:把一段信息(文件/文本/bytes),藏进一个音乐文件中

例子:

from hide_info import hide_in_music

# 把文件隐藏到某个音乐中
hide_in_music.file_encode(filename='要隐藏的文件.zip', music_filename="音乐.wav", music_filename_new="藏物于音.wav")
# 从音乐中提取文件
hide_in_music.file_decode(filename="藏物于音-解出的文件.zip", music_filename="藏物于音.wav")

hide_as_music:化物为音

功能:把一段信息(文件/文本/bytes),转为声音 原理:用 16 种音可以表示一个四进制。如果每个音持续 0.05 秒,那么每秒声音可以存放 10 字节 使用场景: - 信息隐藏、隐蔽传输 - 在只能发送图片的场景下(例如某社交软件),发送任意信息

说明

from hide_info import hide_as_music

# 文件转为声音并存下来
hide_as_music.file_encode(filename='要隐藏的文件2.zip', wav_filename='化物为音.wav')
# 把声音再转回文件
hide_as_music.file_decode(filename='化物为音-解出来的文件.zip', wav_filename='化物为音.wav')

echo_watermark: 回声水印

回声水印(Echo Watermarking)是一种音频水印技术,通过在原始音频信号中添加回声来嵌入信息。这种技术利用了人耳的心理声学特性,即人耳对于短时间内的回声延迟是不敏感的,因此可以将信息隐藏在音频信号的回声中而不影响听感。

回声水印的实现通常有两个重要参数:回声延迟和回声幅度。延迟时间决定了回声在原始信号之后多久发生,而幅度则影响回声的强度。通过巧妙地调节这两个参数,可以将数字信息(如比特流)编码到音频信号中。

例如,可以用短的延迟时间表示比特'0',用长的延迟时间表示比特'1',或者通过调整回声的幅度来表示不同的数据位。

回声水印技术对于音质的影响相对较小,同时具有较好的鲁棒性,能够在一定程度上抵抗压缩、转换等处理过程。这使得它适用于版权保护、内容认证、隐秘通讯等领域。

from hide_info.echo_watermark import EchoWatermark, get_error_rate
from hide_info import utils

ori_file = "sounds.wav"  # 载体
embedded_file = "sounds_with_watermark.wav"  # 嵌入水印后的文件名
wm_str = "回声水印算法,欢迎 star!"  # 水印

wm_bits = utils.bytes2bin(wm_str.encode('utf-8'))
len_wm_bits = len(wm_bits)

# 嵌入水印
echo_wm = EchoWatermark(pwd=111001)
echo_wm.embed(origin_filename=ori_file, wm_bits=wm_bits, embed_filename=embedded_file)

# 提取水印
echo_wm = EchoWatermark(pwd=111001)
wm_extract = echo_wm.extract(embed_filename=embedded_file, len_wm_bits=len_wm_bits)

wm_str_extract = utils.bin2bytes(wm_extract).decode('utf-8', errors='replace')
print("解出水印:", wm_str_extract)
# 错误率:
get_error_rate(wm_extract, wm_bits)

hide_in_text:藏物于文

功能:把一段信息(文件/文本/bytes),藏进一段文本中

说明

  • 实测在苹果设备 Macbook、IOS 上,隐藏前后的文本看不出区别。但是 Windows 和某些安卓系统上,会有空格
  • 例子:hide_in_txt.py
from hide_info import hide_in_txt

# 把一个文件隐藏在一段已有的文本中
hide_in_txt.file_encode(filename='要隐藏的文件2.zip', text_filename='一段文本.txt', text_filename_new='藏物于文.txt')
# 从文本中提取文件
hide_in_txt.file_decode(filename='藏物于文-解出的文件.zip', text_filename='藏物于文.txt')

hide_as_txt: 化物为文

功能:把一段信息(文件/文本/bytes),以文本的形式存放下来

说明

from hide_info import hide_as_txt

# 把一个文件转化为一段文本,并存下走
hide_as_txt.file_encode(filename='要隐藏的文件.zip', txt_filename='化物为文.txt')
# 从文本中提取文件
hide_as_txt.file_decode(filename='化物为文-解出的文件.zip', txt_filename='化物为文.txt')

其他算法

缩放藏图:提前计算用近邻法缩放时使用的时哪些像素点,然后把这些像素点变成另一个图。