ImageSteg · 在图片或音频文件中隐藏数据

steghide 0.5.1 的浏览器移植版,涵盖其两种方法:针对 BMP 和 PNG 的像素/LSB,以及针对 JPEG 的 DCT 系数——还加上 PCM WAV 和 MP3 音频载体。隐藏一个文件或一段消息,再用口令重新揭示。

100% 本地运行

你的文件与秘密绝不离开这台设备。解码、嵌入、加密与提取全部在这个浏览器标签页内运行。绝不会上传到服务器——因此也无可泄露。

1 · 载体图片或音频

拖入图片或音频文件 JPEG、PNG、WebP、GIF、BMP、PCM WAV 或 MP3 · 本地解码,绝不上传

容器越大容纳越多:图片大约每八个像素一字节,PCM WAV 每十六个样本一字节,MP3 则取决于其音频帧未使用的空间。

2 · 要隐藏的数据

未选择文件

3 · 口令与选项

三步搞定

如何把文件隐藏在图片或音频文件中

无需安装、无需上传:选一张图片、一个 WAV 或 MP3,加入你的秘密,保存结果。

1

选择载体图片或音频文件

上传、拖入或粘贴将承载数据的图片、WAV 或 MP3。文件越大容纳越多,细节丰富的照片或音乐最能隐藏变化。

2

添加秘密与口令

附上任意文件或输入一段消息,然后选择一个口令。口令决定数据散布在哪里,并可选地对其加密。

3

下载并分享

为兼容 steghide 保存为 BMP,或为更小体积保存为 PNG。任何拥有图片和口令的人都能揭示数据。

steghide 算法加上音频载体,尽在你浏览器

在像素、DCT 系数与音频样本上的图匹配

ImageSteg 是 steghide 0.5.1 的 TypeScript 移植版,涵盖其两个分支:针对 BMP 和 PNG 的像素/LSB 方法,以及针对 JPEG 的 DCT 方法。在此基础上,它以相同方式在 PCM WAV 音频中携带数据,也在 MP3 帧未使用的尾部携带。它们都不会简单地顺序遍历文件。

基于图的嵌入

样本被分组为顶点,由最小权重匹配决定修改什么,因此每个隐藏值大约只触及一个样本。

真正的 JPEG DCT 隐写

内置的 JPEG 熵编解码器读取量化后的 DCT 系数,把数据隐藏在它们的奇偶性中并重新编码——正是 steghide 的 libjpeg 停止的流水线位置。基线与渐进文件都能处理。

口令驱动的散布

由 MD5 加种的置换把数据散布到整张图片,因此隐藏载荷不会以可预测的顺序存储。

压缩与校验和

zlib 在嵌入前缩小载荷,可选的 CRC32 校验和能立即告诉你提取结果是否可信。

可选的 AES-256 加密

采用与 libmcrypt 相同密钥推导的 CBC 模式 Rijndael,即使有人怀疑某张图片,载荷仍保密。

你需要了解的

容量、速度与兼容性

在图片像素中隐藏数据的实际限制。

BMP · PNG像素 / LSB 分支
JPEGDCT 系数分支
0.2 %典型被触及样本占比
0 上传一切都留在你浏览器

兼容性:位布局、样本置换以及 Rijndael/CBC 加密均遵循 steghide 0.5.1,因此 BMP 和 JPEG 输出可用 steghide extract -sf image.bmp -p passphrase-sf image.jpg 读取,而 steghide 命令行工具生成的文件也能在此读取。输出格式总是与载体一致:JPEG 载体生成 JPEG,因为载荷位于只有 JPEG 才能携带的系数中。像素载体则在 BMP 之外提供 PNG;steghide CLI 不读取 PNG。

JPEG 分支详解

steghide 的 JPEG 支持调用 libjpeg 的 jpeg_read_coefficients(),它在 Huffman 解码后立即停止解码流水线——在反量化与 IDCT 之前。剩下的是原始量化 DCT 系数。浏览器没有提供获取它们的 API,因此本页面自带一个 JPEG 熵编解码器,而不使用原生解码器。它涵盖基线文件与渐进文件,包括它们的逐次逼近细化扫描。

将相同算法应用于 PNG

嵌入器从不关心文件格式——它只处理解码后的像素阵列,因此 steghide 的 BMP/LSB 方法原封不动地适用于 PNG。实际中有四个细节重要:

常见问题

ImageSteg 常见问题

ImageSteg 免费使用吗?

是的。隐藏与揭示数据都免费,无需注册、无水印,也没有人为的文件体积限制。

我的图片或秘密文件会被上传吗?

不会。解码、嵌入、压缩与加密全部在你浏览器中通过 JavaScript 和 WebCrypto 本地完成,不会发送任何内容到 73hi 服务器。

支持哪些图片格式?

任何你浏览器能解码的图片都可作为像素载体,基线或渐进 JPEG 文件则走 steghide 的 DCT 分支。输出格式跟随载体:JPEG 输入则 JPEG 输出;像素载体会生成 BMP 加一份 PNG。steghide 命令行工具能读取 BMP 和 JPEG 输出,但不支持 PNG。

JPEG 模式如何隐藏数据?

在量化后的 DCT 系数中,与 steghide 命令行工具完全一致。页面内置一个 JPEG 熵编解码器,把扫描解码到系数层,修改它们的奇偶性后重新编码。

可以使用渐进式 JPEG 吗?

可以。渐进式文件会通过其完整的扫描序列解码——频谱选择与逐次逼近细化——并以相同方式写回,因此结果仍是携带原始系数的渐进式 JPEG。

算术编码的 JPEG 呢?

支持读取。使用 QM(二进制算术)编码而非 Huffman 的文件——顺序型为 SOF9,渐进型为 SOF10——通过与 libjpeg 自身相同的算术解码器解码,因此得到的系数完全一致。结果以 Huffman 编码写回,与 steghide 一致。

我能隐藏多少数据?

大致每八个像素可容纳一字节载荷,再扣除头部、存储的文件名与可选加密开销所占空间。选定图片后工具会显示可用容量。

steghide 命令行工具能读取结果吗?

能,如果你下载的是 BMP。位布局、基于口令的样本置换以及 Rijndael/CBC 加密均遵循 steghide 0.5.1。

为什么编辑图片后提取会失败?

载荷存储在单个像素值中。重新压缩、缩放、滤镜或转换为 JPEG 等有损格式都会摧毁它。请保留原始 BMP 或一份无损 PNG。

能在同一张图片中隐藏两个秘密吗?

不能通过向同一文件嵌入两次来实现。第二次嵌入会在整个载体上选择自己的随机位置,覆盖第一次载荷的一部分;由于数据先压缩再加密,少量翻转的位就会使整条消息无法读取——你会完全丢失而非部分丢失。原版 steghide 命令行工具行为相同。重用相同口令也没用:它会从头重写相同位置,因此只有最新的消息能存活。若确实需要多层,请改用嵌套文件——先把第一个秘密隐藏在一张小图片中,下载该结果,再把整个文件在第二个口令下隐藏到一张更大的图片里。每一层都能逐字节保持完整,因为它作为受保护的数据传输,而非修改后的像素。

打开一张已含隐藏数据的图片会摧毁它吗?

不会。加载文件只读取其字节:JPEG 载体直接到量化 DCT 系数,不做反变换或重新量化;像素载体无损解码,因此隐藏数据完好无损。JPEG 因熵编码重写可能保存为略不同的体积,但不影响载荷。你可以安全打开别人准备的文件并揭示其中内容。

ImageSteg 能帮我保护版权吗?

能。把你的版权声明或所有权证明直接嵌入照片。数据存在像素(或 JPEG 系数)中,正常观看时保持不可见,因此你可以公开分享图片而无人察觉。如果有人未经许可使用,隐藏标记仍在文件里——当你在第三方平台发布同一张图片以记录侵权时,那份发布的副本也携带你的证明,为你发起下架或索赔提供有力证据。

我能隐藏一句不好意思当面说的话吗?

当然可以。把一句“我爱你”——或任何难以当面启齿的话——隐藏在一张日常生活的普通照片里,并把口令设为对方的生日。把照片发给他们,请他们在 ImageSteg(或访问 73hi.net/image-steg.html)上打开解锁。只有知道口令的人才能揭示这句话,因此你可以不必尴尬地说出口也能表达心意。