NIKJOO/ShadowBox

GitHub: NIKJOO/ShadowBox

一款隐写术 CLI 工具,利用自定义矩阵流密码将加密文件隐藏在 MP4 视频的 mdat 块中且不影响正常播放。

Stars: 0 | Forks: 0

ShadowBox Logo ## ShadowBox
使用自定义的基于矩阵的流密码,将加密的 PDF(更正一下,实际上是所有文件类型)隐藏在 MP4 视频文件中。这是一款用于隐写术的 Go CLI 工具,可以将受密码保护的文档嵌入到视频容器中,且不会改变视频的正常播放。 ## 目录 - [概述](#overview) - [功能](#features) - [工作原理](#how-it-works) - [安装说明](#installation) - [用法](#usage) - [嵌入 PDF](#embed-pdf) - [提取 PDF](#extract-pdf) - [架构](#architecture) - [矩阵密码](#matrix-cipher) - [MP4 结构](#mp4-structure) - [技术细节](#technical-details) - [示例](#examples) - [贡献](#contributing) - [许可证](#license) ## 概述 **ShadowBox** 是一款隐写术工具,可让您将加密的 PDF 文件隐藏在 MP4 视频文件中。该项目使用自定义的基于矩阵的流密码进行加密,并结合 MP4 容器操作,在不影响视频播放的情况下无缝嵌入数据。 非常适用于: - 通过视频文件分发机密文档 - 明面上的安全数据隐藏 - 注重隐私的文件共享 - 隐写术的概念验证研究 ## 功能 ✨ **自定义矩阵密码** - 专有的 4×4 基于矩阵的流密码 - 通过矩阵乘法(模 256)实现扩散 - 高效的基于 XOR 的加密/解密 🎬 **MP4 原生支持** - 将数据直接嵌入 MP4 `mdat` box(媒体数据)中 - 保留视频播放功能 - 对媒体播放器透明 🔐 **密码保护** - 从密码进行 PBKDF2 密钥派生 - SHA-256 哈希 - 4096 次迭代以增强安全性 🚀 **命令行界面** - 简单的双模式操作:`embed` 和 `extract` - 健壮的错误处理 - 基于文件的 I/O ## 工作原理 ### 嵌入过程 1. **加载文件**:读取载体 MP4 和机密 PDF 2. **派生密钥**:使用 PBKDF2 从密码生成加密密钥 3. **加密 PDF**:使用矩阵密码加密 PDF 数据 4. **定位 mdat box**:在 MP4 结构中查找媒体数据 box 5. **追加数据**:将带有元数据标记的加密 PDF 插入 mdat payload 中 6. **写入输出**:保存包含嵌入数据的已修改 MP4 ### 提取过程 1. **加载 MP4**:读取已嵌入数据的 MP4 文件 2. **查找标记**:在 mdat box 中定位 magic marker(“MPDP”) 3. **提取元数据**:读取原始 payload 大小和 PDF 大小 4. **恢复加密数据**:从 mdat 中提取加密的 PDF 5. **派生密钥**:根据密码重新生成加密密钥 6. **解密**:使用矩阵密码解密(对称操作) 7. **保存 PDF**:将解密后的 PDF 写入输出文件 ## 安装说明 ### 前置条件 - **Go** 1.16 或更高版本 - 已安装 **Linux**、**macOS** 或 **Windows** 系统及 Go 环境 ### 从源码构建 ``` # Clone 仓库 git clone https://github.com/NIKJOO/ShadowBox.git cd ShadowBox # Build 可执行文件 go build -o shadowbox main.go # 验证安装 ./shadowbox -h ``` ### 使用 make(可选) 如果项目中存在 Makefile: ``` make build ``` ## 用法 ### 通用语法 ``` ./shadowbox -mode -mp4 -pdf -output -password ``` ### 嵌入 PDF 将机密 PDF 嵌入到 MP4 载体文件中: ``` ./shadowbox \ -mode embed \ -mp4 carrier.mp4 \ -pdf secret.pdf \ -output embedded.mp4 \ -password "MySecurePassword123!" ``` **参数:** - `-mode embed`:激活嵌入模式 - `-mp4 `:载体 MP4 视频的路径 - `-pdf `:要隐藏的 PDF 的路径 - `-output `:保存嵌入后 MP4 的路径 - `-password `:加密密码(请牢记以便日后提取!) **输出:** - 已嵌入加密 PDF 的 MP4 文件(隐藏在 mdat box 中) - 视频可在标准媒体播放器中正常播放 - 原始视频功能得以保留 ### 提取 PDF 从已嵌入数据的 MP4 中提取并解密隐藏的 PDF: ``` ./shadowbox \ -mode extract \ -mp4 embedded.mp4 \ -output recovered.pdf \ -password "MySecurePassword123!" ``` **参数:** - `-mode extract`:激活提取模式 - `-mp4 `:已嵌入数据的 MP4 文件路径 - `-output `:保存恢复的 PDF 的路径 - `-password `:加密密码(必须与嵌入时使用的密码一致) **输出:** - 解密后的 PDF 文件 - 打印原始 mdat payload 大小以供验证 ## 架构 ### 矩阵密码 核心加密机制使用 4×4 基于矩阵的流密码: ``` State Matrix (4×4): Transformation Matrix A (4×4): [s00 s01 s02 s03] [2 3 1 1] [s10 s11 s12 s13] [1 2 3 1] [s20 s21 s22 s23] × [1 1 2 3] [s30 s31 s32 s33] [3 1 1 2] ``` **加密流程:** 1. 从 32 字节的派生密钥初始化状态矩阵 2. 对于每个 16 字节的块: - 从状态矩阵提取密钥流(行优先) - 将明文与密钥流进行 XOR 运算 - 更新状态:`state = (state × A) mod 256` 3. 重复上述步骤直到所有数据加密完成 **属性:** - **对称**:加密和解密使用相同的 XOR 操作 - **可逆**:矩阵 A 在模 256 下可逆以实现扩散 - **基于流**:块之间持续进行状态演化 - **高效**:每个块仅需一次矩阵乘法 ### MP4 结构 MP4 文件使用基于 box 的层次结构: ``` MP4 File ├── ftyp (File Type Box) ├── moov (Movie Box - metadata) │ ├── mvhd │ ├── trak │ └── ... └── mdat (Media Data Box) ← Hidden data embedded here ├── Original Video/Audio Data ├── Magic Marker: "MPDP" ├── Original Payload Size (8 bytes) ├── Encrypted PDF Size (8 bytes) └── Encrypted PDF Data ``` **为什么选择 mdat?** - 包含原始媒体样本 - 足够大,可以容纳额外数据 - 修改不会影响媒体播放结构 - magic marker 可确保安全验证提取 ## 技术细节 ### 密钥派生 ``` PBKDF2(password, salt, iterations=4096, length=32, hash=SHA256) Salt: "MatrixEncryptionSalt" (fixed) Output: 32-byte encryption key ``` ### Magic Marker - **值**:`"MPDP"`(4 字节) - **用途**:识别加密 PDF 在 mdat 中的位置 - **搜索方式**:从 payload 末尾使用 `LastIndex()` 进行查找 - **格式**:`[MPDP][OrigPayloadSize:8][PDFSize:8][EncryptedPDF:N]` ### Box Header 结构 **标准 Box(大小 < 4GB):** ``` [Size:4 bytes][Type:4 bytes][Data:variable] ``` **扩展 Box(大小 ≥ 4GB):** ``` [0xFFFFFFFF:4 bytes][Type:4 bytes][ExtendedSize:8 bytes][Data:variable] ``` ## 示例 ### 示例 1:基础用法 ``` # 创建嵌入式视频 ./shadowbox -mode embed \ -mp4 vacation.mp4 \ -pdf confidential.pdf \ -output vacation_secure.mp4 \ -password "VerySecure123!" # 随后,提取 PDF ./shadowbox -mode extract \ -mp4 vacation_secure.mp4 \ -output recovered_confidential.pdf \ -password "VerySecure123!" ``` ### 示例 2:安全文档共享 ``` # 通过执行单独的 embed 操作来嵌入多个文档 # (每个新的 embed 会追加到 mdat,最后提取一个) ./shadowbox -mode embed \ -mp4 base_video.mp4 \ -pdf contract.pdf \ -output temp1.mp4 \ -password "SecurePass123" ./shadowbox -mode embed \ -mp4 temp1.mp4 \ -pdf invoice.pdf \ -output shared_video.mp4 \ -password "SecurePass123" ``` ### 示例 3:使用强密码 ``` # 生成随机密码 PASSWORD=$(openssl rand -base64 32) ./shadowbox -mode embed \ -mp4 carrier.mp4 \ -pdf secret.pdf \ -output embedded.mp4 \ -password "$PASSWORD" # 安全地存储密码,然后提取 ./shadowbox -mode extract \ -mp4 embedded.mp4 \ -output recovered.pdf \ -password "$PASSWORD" ``` ## 项目结构 ``` ShadowBox/ ├── main.go # Main application code ├── README.md # This file ├── LICENSE # Project license └── .gitignore # Git ignore rules ``` ### 代码组织 - **矩阵密码**:`NewMatrixCipher()`, `XORStream()` - 加密/解密逻辑 - **MP4 解析**:`findMdat()`, `makeBoxHeader()` - MP4 box 操作 - **核心操作**:`embedPDF()`, `extractPDF()` - 主要工作流 - **CLI**:`main()` - 命令行界面 ## 构建与开发 ### 构建 ``` go build -o shadowbox main.go ``` ### 运行测试 ``` go test -v ./... ``` ### 交叉编译 ``` # 为 Linux Build GOOS=linux GOARCH=amd64 go build -o shadowbox-linux main.go # 为 macOS Build GOOS=darwin GOARCH=amd64 go build -o shadowbox-macos main.go # 为 Windows Build GOOS=windows GOARCH=amd64 go build -o shadowbox.exe main.go ``` ## 故障排除 ### "未找到 mdat box" - 确保 MP4 文件有效且包含媒体数据 - 尝试使用其他 MP4 文件 - 验证文件未损坏 ### "未找到隐藏的 PDF(缺少 magic marker)" - 确保您使用的是正确的已嵌入数据的 MP4 文件 - 验证文件在嵌入后未被修改 - 检查是否从正确的文件中提取 ### "password mismatch"(表现为输出错误) - 验证密码是否与嵌入时使用的密码完全一致 - 密码区分大小写 - 检查是否存在多余的空格或特殊字符问题 ### "truncated file" 错误 - MP4 文件可能已损坏或不完整 - 尝试使用其他 MP4 文件 - 如果是下载的文件,请确保已完整传输 ## 贡献 欢迎贡献代码!可以改进的方向包括: - [ ] 为密码和 MP4 解析添加单元测试 - [ ] 实现认证加密 - [ ] 添加带有 header 的随机盐支持 - [ ] 支持嵌入多个 PDF - [ ] GUI 界面 - [ ] 性能优化 - [ ] 更多隐写术技术 **如何贡献:** 1. Fork 该仓库 2. 创建一个功能分支 (`git checkout -b feature/amazing-feature`) 3. 提交更改 (`git commit -m 'Add amazing feature'`) 4. 推送到分支 (`git push origin feature/amazing-feature`) 5. 发起一个 Pull Request ## 许可证 该项目基于 GNU 许可证授权。 ## 免责声明 本工具仅供教育和授权使用。用户有责任确保其有权在他们用作载体的文件中嵌入数据。作者不对本工具的滥用承担责任。 ## 作者 **NIMA NIKJOO**
**有疑问或建议?** 请发起 [issue](https://github.com/NIKJOO/ShadowBox/issues) 或 [发起讨论](https://github.com/NIKJOO/ShadowBox/discussions)。
标签:DNS 反向解析, EVTX分析, Go, MP4处理, Ruby工具, 加密工具, 密码学, 手动系统调用, 数据隐藏, 文档结构分析, 日志审计, 隐写术