stegify 是一个简单的命令行工具,能够将任意文件完全透明地隐藏在一张或多张图片内。这种技术被称为基于 LSB(最低有效位)的隐写术。
| 载体 | 数据 | 结果 |
|---|---|---|
![]() | ![]() | ![]() |
结果文件包含隐藏其中的数据文件。如你所见,它是完全透明的。
如果提供了多个载体文件,数据文件将被分割成若干片段,每个片段分别编码到对应的载体中。
| 载体1 | 载体2 | 数据 | 结果1 | 结果2 |
|---|---|---|---|---|
![]() |
结果1文件包含隐藏其中的一半数据文件,结果2则包含另一半。一如既往地完全透明。
go install github.com/DimitarPetrov/stegify@latest
brew tap DimitarPetrov/stegify
brew install stegify
或者你可以在这里下载适用于你系统的二进制文件。
stegify encode --carrier <文件名> --data <文件名> --result <文件名>
stegify decode --carrier <文件名> --result <文件名>
编码时,通过 --data 标志指定的文件将被隐藏在通过 --carrier 标志指定的文件中,结果文件以 --result 标志指定的名称保存在当前工作目录中。
注意: 结果文件不包含文件扩展名,因此应在
--result标志中显式指定。
解码时,给定一个之前编码过数据的载体文件名,数据将被提取出来,并以 --result 标志指定的名称保存在当前工作目录中。
注意: 结果文件不包含文件扩展名,因此应在
--result标志中显式指定。
在两种情况下,都可以省略 --result 标志,此时会使用默认值。
stegify encode --carriers "<文件名...>" --data <文件名> --results "<文件名...>"
或
stegify encode --carrier <文件名> --carrier <文件名> ... --data <文件名> --result <文件名> --result <文件名> ...
stegify decode --carriers "<文件名...>" --result <文件名>
或
stegify decode --carrier <文件名> --carrier <文件名> ... --result <文件名>
当将数据文件编码到多个载体中时,数据文件会被分割成 N 个块,其中 N 是提供的载体数量。每个块分别编码到对应的载体中。
注意: 解码时,载体的提供顺序必须与编码时完全一致,才能正确提取结果。
这种编码方式提供了额外的安全层,并在大小限制方面提供了更多灵活性。
在两种情况下,都可以省略 --result/--results 标志,此时会使用默认值。
注意: 编码时,结果文件的数量(如果提供)必须与载体文件的数量相等。解码时,期望只得到一个结果。
当使用混合类型的标志提供多个载体时,通过 carrier 标志提供的名称优先,其次是 carriers/c 标志提供的名称。result/results 标志同理。
stegify 也可以以编程方式使用,它提供了易于使用的函数,可以处理文件名或原始的 Reader 和 Writer。你可以在 steg 包下的 godoc 中查看详情。
如果载体文件是 jpeg 或 jpg 格式,编码后的结果文件图像将以 PNG 格式编码(因此文件可能更大),无论结果标志中指定的文件扩展名是什么。
stegify 被用于 Codefest’19 中的一项夺旗赛挑战题。
参赛者得到了一张照片,里面是一堆“无辜”的猫。没什么可疑的,对吧?再想想!
![]() |
![]() |
![]() |
![]() |