File Injector 是一个脚本,允许你将任何文件(.zip、.png、.txt、.gba...)及其文件名以噪声的形式存储在图像/音频中,使用的是隐写术。
你还可以选择在存储之前对输入文件进行加密。
然后,要提取修改后图像/音频中的文件,你不需要原始图像/音频,只需要加密密钥(如果文件已加密)。
python3 -m pip install -r requirements.txt
如果上述方法无效,可以尝试:
py -m pip install -r requirements.txt
python3 main.py
从 files/base 文件夹中选择一个用于存储文件的基础图像/音频。
你也可以将自己的图像/音频添加到此文件夹中。
.png 或(.jpg/.jpeg),但脚本运行时它们会被转换为 .png。.mp3 或 .wav,但脚本运行时它们会被转换为 .mp3。从 files/input 文件夹中选择要存储在图像/音频中的文件。
你可以将自己的文件添加到此文件夹中。它们可以是任何类型的文件。
从 files/modified 文件夹中选择一个用于提取文件的修改后图像/音频。
你也可以将自己的修改后图像/音频添加到此文件夹中。
你可以从 files/$encryption-keys 文件夹中选择一个密钥,也可以在那里生成一个。
密钥文件必须具有 .key 扩展名。
解密文件时不需要选择特定的密钥,它会自动从该文件夹中选取。
这张1710万像素的图像包含一个加密的 9MB .zip 文件及其文件名,以噪声形式存储。
<img src="https://raw.githubusercontent.com/carlospuenteg/file-injector/main/readme-assets/17"1MP_mod.png" width=500>
这张170万像素的图像包含一个加密的 0.93MB .zip 文件及其文件名,以噪声形式存储。
<img src="https://raw.githubusercontent.com/carlospuenteg/file-injector/main/readme-assets/1"7MP_mod.png" width=500>
这个42MB的音频文件包含一个加密的 9MB .zip 文件及其文件名,以噪声形式存储。
... File-Injector % python3 main.py
[0] 退出
[1] 注入文件
[2] 提取文件
选项: 1
要存储的文件: images.zip
基础图像的文件名: 2'2MP
是否加密文件?(y/n): y
你要使用现有密钥还是生成新密钥?
[0] 现有密钥
[1] 新密钥
选项: 1
新密钥文件的文件名(默认为空):
密钥已生成并保存到 files/$encryption-keys/key9.key
准备中...
每个通道修改的比特数: 2
图像修改比例: 1.56%
✅ 存储中... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [100.0%]
生成随机值...
存储随机值...
重塑...
修改后的图像已保存到 files/modified-images/2'2MP_mod.png
耗时 7.5892 秒
... File-Injector % python3 main.py
[0] 退出
[1] 注入文件
[2] 提取文件
选项: 2
修改后图像的文件名: 2'2MP_mod
准备中...
获取文件名...
获取输入文件...
使用 "files/$encryption-keys/key2.key" 解密
输出文件已保存到 files/output-files/images.zip
耗时 1.4083 秒
你可以在 config.py 文件中更改配置。
注入是通过将文件存储在图像/音频数组展平后每个元素的 X 个最低有效位中实现的。
| 选项 | 描述 |
|---|---|
| [0] 退出 | 退出脚本 |
| [1] 注入文件 | 调用 inject_file_func() |
| [2] 提取文件 | 调用 extract_file_func() |
inject_file_func()TEST_MODE == True,则使用预定义的基础图像/音频和输入文件。否则,询问基础图像/音频和输入文件。get_fernet() 获取密钥inject_file() 将文件和文件名注入图像/音频。
extract_file_func()TEST_MODE == True,则使用预定义的修改后图像/音频。否则,询问修改后图像/音频。extract_file() 提取文件和文件名(字节形式)gAAAAA 开头),则通过 decrypt_content 解密get_fernet()| 选项 | 描述 |
|---|---|
| [0] 现有密钥 | 使用现有密钥 |
| [1] 新密钥 | 生成新密钥 |
[0] 现有密钥
files/$encryption-keys 文件夹中选择一个要用的密钥[1] 新密钥
decrypt_content()files/$encryption-keys 文件夹中的每个密钥:
inject_file()返回修改后的图像/音频数组(np.ndarray,与 arr 形状相同)
extract_file()| 参数 | 类型 | 描述 |
|---|---|---|
mod_arr_flat | np.ndarray | 展平后的修改后图像/音频 |
返回一个字典,包含提取的文件和文件名,两者均为 bytes 格式
| 常量 | 描述 | 默认值 |
|---|
MOD_PREFIX | 修改后图像/音频的前缀 | "" |
MOD_SUFFIX | 修改后图像/音频的后缀 | "_mod" |
STORE_RANDOM | 在修改后图像中存储随机数据,使存储数据部分与未存储数据部分之间的界限不那么明显 | True |
TEST_MODE | 启用/禁用测试模式:使用预定义的图像/音频和文件进行测试 | True |
| 参数 | 类型 | 描述 |
|---|
arr | np.ndarray | 图像/音频的 numpy 数组 |
file | bytes | 文件(字节形式) |
filename | bytes | 文件名(字节形式) |
store_random | boolean | 是否在修改后的图像/音频中存储随机数据 |