
如果你不熟悉隐写术技术,我还写了一篇该领域的概述文章: Steganography: Hiding Data Inside Data。
该项目已上传至 PyPI,可通过以下命令安装:
pip install stego-lsb
或者,你也可以直接从本仓库安装:
git clone https://github.com/ragibson/Steganography
cd Steganography
python3 setup.py install
安装完成后,在终端中使用 stegolsb 命令,或在代码中从 stego_lsb 导入函数。
bit_manipulation 提供了将载荷字节快速交错插入载体字节序列最低有效位(LSBs)的能力。
具体来说,它包含四个主要函数:
# 将 payload 的字节交错插入 carrier 的 num_lsb 个最低有效位中。
lsb_interleave_bytes(carrier, payload, num_lsb, truncate=False)
# 从 carrier 的 num_lsb 个最低有效位中解交错取出 num_bits 位。
lsb_deinterleave_bytes(carrier, num_bits, num_lsb)
# 对 List[uint8] 类型的 carrier 执行 lsb_interleave_bytes。
lsb_interleave_list(carrier, payload, num_lsb)
# 对 List[uint8] 类型的 carrier 执行 lsb_deinterleave_bytes。
lsb_deinterleave_list(carrier, num_bits, num_lsb)
运行 bit_manipulation.py、直接调用其 test() 函数,或运行 stegolsb test 应产生类似以下的输出:
Testing 1.0 MB payload -> 10.0 MB carrier...
Progress: [################################]
----------------------------------------
| # LSBs | 编码速率 | 解码速率 |
| 1 | 60.6 MB/s | 95.9 MB/s |
| 2 | 56.6 MB/s | 52.7 MB/s |
| 3 | 82.5 MB/s | 77.4 MB/s |
| 4 | 112.4 MB/s | 105.9 MB/s |
| 5 | 135.9 MB/s | 129.8 MB/s |
| 6 | 159.9 MB/s | 152.4 MB/s |
| 7 | 181.7 MB/s | 174.6 MB/s |
| 8 | 372.8 MB/s | 1121.8 MB/s |
----------------------------------------
WavSteg 使用最低有效位隐写术将文件隐藏在 .wav 文件的样本中。
对于音频文件中的每个样本,我们用文件中的数据覆盖其最低有效位。
WavSteg 需要 Python 3。
使用以下命令行参数运行 WavSteg:
命令行参数:
-h, --hide 将数据隐藏在声音文件中
-r, --recover 从声音文件中恢复数据
-i, --input TEXT .wav 文件的路径
-s, --secret TEXT 要隐藏在声音文件中的文件路径
-o, --output TEXT 输出文件路径
-n, --lsb-count INTEGER 使用多少个最低有效位 [默认: 2]
-b, --bytes INTEGER 从声音文件中恢复多少字节
--help 显示此消息并退出。
示例:
$ stegolsb wavsteg -h -i sound.wav -s file.txt -o sound_steg.wav -n 1
# 或
$ stegolsb wavsteg -r -i sound_steg.wav -o output.txt -n 1 -b 1000
隐藏数据使用参数 -h、-i、-s、-o 和 -n。
以下命令会将 file.txt 的内容隐藏到 sound.wav 中,并将结果保存为 sound_steg.wav。该命令还会输出在理论最大值下已使用的字节数。
示例:
$ stegolsb wavsteg -h -i sound.wav -s file.txt -o sound_steg.wav -n 2
使用 2 个 LSB,最多可隐藏 6551441 字节
读取文件 耗时 0.01s
5589889 字节隐藏 耗时 0.24s
输出 wav 写入 耗时 0.03s
如果你尝试隐藏过多数据,WavSteg 会打印出隐藏你的数据所需的最小 LSB 数量。
恢复数据使用参数 -r、-i、-o、-n 和 -b。
以下命令会从 sound_steg.wav 中恢复隐藏的数据,并将其保存为 output.txt。这要求隐藏数据的大小(字节)准确,否则结果可能过短或包含多余数据。
示例:
$ stegolsb wavsteg -r -i sound_steg.wav -o output.txt -n 2 -b 5589889
读取文件 耗时 0.02s
恢复 5589889 字节 耗时 0.18s
写入输出文件 耗时 0.00s
LSBSteg 使用最低有效位隐写术将文件隐藏在 RGB 图像(.bmp 或 .png)的颜色信息中。
对于图像中每个像素的每个颜色通道(例如 R、G 和 B),我们用文件中的数据覆盖颜色值的最低有效位。为了更容易恢复这些数据,我们还将输入文件的大小隐藏在图像的前几个颜色通道中。
你需要 Python 3 和 Pillow(Python Imaging Library 的一个分支)。
使用以下命令行参数运行 LSBSteg:
命令行参数:
-h, --hide 将数据隐藏在图像文件中
-r, --recover 从图像文件中恢复数据
-a, --analyze 打印图像中可以隐藏多少数据 [默认: False]
-i, --input TEXT 位图图像(.bmp 或 .png)的路径
-s, --secret TEXT 要隐藏在图像中的文件路径
-o, --output TEXT 输出文件路径
-n, --lsb-count INTEGER 使用多少个最低有效位 [默认: 2]
-c, --compression INTEGER RANGE
1(最佳速度)到 9(最小文件大小) [默认: 1]
--help 显示此消息并退出。
示例:
$ stegolsb steglsb -a -i input_image.png -s input_file.zip -n 2
# 或
$ stegolsb steglsb -h -i input_image.png -s input_file.zip -o steg.png -n 2 -c 1
# 或
$ stegolsb steglsb -r -i steg.png -o output_file.zip -n 2
在将数据隐藏到图像之前,查看可以隐藏多少数据是很有用的。以下命令将实现此目的,并产生类似以下的输出:
$ stegolsb steglsb -a -i input_image.png -s input_file.zip -n 2
图像分辨率: (2000, 1100, 3)
使用 2 个 LSB,最多可隐藏: 1650000 B
输入文件大小: 1566763 B
文件大小标签: 3 B
以下命令会将数据隐藏到输入图像中,并将结果写入隐写后的图像,产生类似以下的输出:
$ stegolsb steglsb -h -i input_image.png -s input_file.zip -o steg.png -n 2 -c 1
读取文件 耗时 0.26s
1566763 字节隐藏 耗时 0.31s
图像覆盖完成 耗时 0.27s
以下命令会从隐写后的图像中恢复数据,并将结果写入输出文件,产生类似以下的输出:
$ stegolsb steglsb -r -i steg.png -o output_file.zip -n 2
读取文件 耗时 0.30s
1566763 字节恢复 耗时 0.28s
输出文件写入 耗时 0.00s
StegDetect 提供了一种检测图像中简单隐写术的方法。
你需要 Python 3 和 Pillow(Python Imaging Library 的一个分支)。
使用以下命令行参数运行 StegDetect:
命令行参数:
-i, --input TEXT 图像路径
-n, --lsb-count INTEGER 显示多少个最低有效位 [默认: 2]
--help 显示此消息并退出。
我们将每个像素的 RGB 颜色通道的最低 n 位相加,并将结果归一化到 0-255 范围。然后将此值应用于该像素的每个颜色通道。其中 n 是要显示的最低有效位数,以下命令将保存结果图像,并在文件名后附加 "_nLSBs",产生类似以下的输出:
$ stegolsb stegdetect -i input_image.png -n 2
运行时间: 0.63s