nsf5stego 1.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nsf5stego-1.2.1/LICENSE +21 -0
- nsf5stego-1.2.1/PKG-INFO +317 -0
- nsf5stego-1.2.1/README.md +298 -0
- nsf5stego-1.2.1/pyproject.toml +31 -0
- nsf5stego-1.2.1/setup.cfg +4 -0
- nsf5stego-1.2.1/src/cppembed.py +146 -0
- nsf5stego-1.2.1/src/efficiency.py +113 -0
- nsf5stego-1.2.1/src/fsfeatures.py +121 -0
- nsf5stego-1.2.1/src/gui.py +321 -0
- nsf5stego-1.2.1/src/image_io.py +29 -0
- nsf5stego-1.2.1/src/make_dataset.py +109 -0
- nsf5stego-1.2.1/src/ml_predict.py +90 -0
- nsf5stego-1.2.1/src/ns5_core.py +424 -0
- nsf5stego-1.2.1/src/nsf5stego.egg-info/PKG-INFO +317 -0
- nsf5stego-1.2.1/src/nsf5stego.egg-info/SOURCES.txt +19 -0
- nsf5stego-1.2.1/src/nsf5stego.egg-info/dependency_links.txt +1 -0
- nsf5stego-1.2.1/src/nsf5stego.egg-info/entry_points.txt +2 -0
- nsf5stego-1.2.1/src/nsf5stego.egg-info/requires.txt +2 -0
- nsf5stego-1.2.1/src/nsf5stego.egg-info/top_level.txt +10 -0
- nsf5stego-1.2.1/src/steganalysis.py +250 -0
- nsf5stego-1.2.1/src/train_model.py +155 -0
nsf5stego-1.2.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yushitayuri <dev@example.com>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
nsf5stego-1.2.1/PKG-INFO
ADDED
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nsf5stego
|
|
3
|
+
Version: 1.2.1
|
|
4
|
+
Summary: nsF5 steganography tool: syndrome matrix coding (Hamming) + wet-paper coding + image-hash keying + blind steganalysis + GUI
|
|
5
|
+
Author-email: nsf5stego <dev@example.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Yushitayuri/nsf5-steganography
|
|
8
|
+
Project-URL: Repository, https://github.com/Yushitayuri/nsf5-steganography
|
|
9
|
+
Keywords: steganography,nsf5,f5,hamming,steganalysis,image
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Topic :: Security :: Cryptography
|
|
12
|
+
Classifier: Topic :: Multimedia :: Graphics
|
|
13
|
+
Requires-Python: >=3.9
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Requires-Dist: numpy
|
|
17
|
+
Requires-Dist: Pillow
|
|
18
|
+
Dynamic: license-file
|
|
19
|
+
|
|
20
|
+
# nsF5 图像隐写工具 (Steganography)
|
|
21
|
+
|
|
22
|
+

|
|
23
|
+

|
|
24
|
+

|
|
25
|
+

|
|
26
|
+
|
|
27
|
+
针对 **8bit 灰度/彩色图像** 的隐写研究工具,实现了基于**伴随式矩阵编码(二元汉明码)** 的
|
|
28
|
+
nsF5 隐写算法,并附带**盲隐写分析**、**图像哈希键控**与**码族/嵌入效率可视化**。
|
|
29
|
+
|
|
30
|
+
项目位于 `F:\Steganography`,核心为纯 Python(依赖 `numpy`/`Pillow`,GUI 使用标准库 `tkinter`);
|
|
31
|
+
另提供 **C++ 加速库**(`cpp/fsfeatures.dll` 特征提取、`cpp/nsf5embed.dll` 嵌入热路径 + 确定性置乱
|
|
32
|
+
`nsf5_permute`,MinGW 编译,跨语言校验与 Python 一致性一致;置乱在 DLL 缺失时自动回退到
|
|
33
|
+
Python 同算法,嵌入/解码两端序列恒定可逆)。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 功能总览
|
|
38
|
+
|
|
39
|
+
| 模块 | 说明 |
|
|
40
|
+
|------|------|
|
|
41
|
+
| **嵌入 / 解码** | 将 ASCII 字符串嵌入图像 LSB,解码还原;支持口令键控 |
|
|
42
|
+
| **伴随式矩阵编码** | nsF5 + F5 / LSB 矩阵编码,二元汉明码 `[n=2^p-1, k, 3]`,块内至多改 1 系数 |
|
|
43
|
+
| **湿纸编码** | nsF5 核心:预标记"减幅归零=湿"位置,在干位解 GF(2) 线性方程,无收缩 |
|
|
44
|
+
| **图像哈希键控** | 载入时计算 SHA-256;隐藏路径由"内容哈希+口令"唯一决定,解码端自同步并感知篡改 |
|
|
45
|
+
| **盲隐写分析** | 卡方检验(Westfeld) + RS 分析(Fridrich),输出 0–1 隐写倾向概率与判读 |
|
|
46
|
+
| **绘图** | 绘制码族(嵌入率 α vs 载荷)理论曲线 与 实测嵌入效率对比 |
|
|
47
|
+
| **GUI** | 载入图 → 嵌入/解码 → 分析 → 绘图 一体化界面 |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 安装与运行
|
|
52
|
+
|
|
53
|
+
### 方式 A:从源码运行
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
cd F:\Steganography
|
|
57
|
+
pip install numpy pillow
|
|
58
|
+
python src\gui.py
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
> 若系统默认 `python` 未带 tkinter,可用带 tkinter 的解释器(如 `C:\Python314\python.exe`):
|
|
62
|
+
> `C:\Python314\python.exe src\gui.py`
|
|
63
|
+
|
|
64
|
+
### 方式 B:安装打包的模块(wheel)
|
|
65
|
+
|
|
66
|
+
每个版本会以源码包发布,可构建并安装:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# 构建 wheel + sdist(需已安装 build)
|
|
70
|
+
python -m build
|
|
71
|
+
|
|
72
|
+
# 安装 wheel(核心模块:ns5_core / steganalysis / gui 等)
|
|
73
|
+
pip install dist\nsf5stego-1.1.0-py3-none-any.whl
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
> 注意:wheel 仅含纯 Python 核心;`cpp/` 下的 Windows DLL(特征提取/嵌入加速)随仓库源码发布,
|
|
77
|
+
> 运行 GUI/离线使用仍需项目源码目录内的 `cpp/`。
|
|
78
|
+
|
|
79
|
+
### 运行测试
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
python src\test_core.py # 核心算法自测(嵌入/解码 + 汉明矩阵 + 湿纸 + 口令)
|
|
83
|
+
python src\test_steg.py # 盲隐写分析自测(区分 干净/含密 图)
|
|
84
|
+
python src\run_e2e.py # 端到端验证(嵌入→保存→解码→分析→绘图)
|
|
85
|
+
python src\test_gui.py # GUI 冒烟测试(构建窗口/载入/预览)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## GUI 使用流程
|
|
91
|
+
|
|
92
|
+
1. 点击 **载入原始图 / 含密图** 选择 8bit 图像。
|
|
93
|
+
2. 选择 **算法**(`nsF5` 或 `matrix`)、**参数 p**(块比特数,越大效率越高)、可选**口令**。
|
|
94
|
+
3. 在文本框中输入待嵌入的 **ASCII 字符串**。
|
|
95
|
+
4. 点击 **1 嵌入并保存** → 生成 `output/stego_*.png`,右侧预览含密图。
|
|
96
|
+
5. 点击 **2 解码提取** → 从含密图还原字符串(须与嵌入使用相同 算法/p/口令)。
|
|
97
|
+
6. 点击 **3 分析** → 显示 SHA256、卡方统计、RS 缺口、估计嵌入率与隐写概率。
|
|
98
|
+
7. 点击 **生成码族与效率图** → 弹出理论 vs 实测效率对比图。
|
|
99
|
+
|
|
100
|
+
> 解码与嵌入参数(方法/p/口令)必须一致;口令或图像内容不匹配将无法正确解码。
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 目录结构
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
F:\Steganography
|
|
108
|
+
├── README.md
|
|
109
|
+
├── cpp
|
|
110
|
+
│ ├── fsfeatures.cpp # C++ 特征提取源
|
|
111
|
+
│ ├── fsfeatures.dll # 编译产物 (MinGW)
|
|
112
|
+
│ ├── nsf5embed.cpp # C++ nsF5/matrix 嵌入热路径源
|
|
113
|
+
│ └── nsf5embed.dll # 编译产物 (MinGW)
|
|
114
|
+
├── data/dataset.csv # 有监督训练数据集 (clean+stego 特征)
|
|
115
|
+
├── gpu
|
|
116
|
+
│ ├── make_imageset.py # GPU版数据集生成 (完整512, 1干净+4含密变体/照片)
|
|
117
|
+
│ ├── featurize_gpu.py # GPU批量向量化 11 维统计特征 (与 CPU 参考 bit 级一致)
|
|
118
|
+
│ ├── train_ml_gpu.py # GPU特征提取 + 按照片分组训练分类器
|
|
119
|
+
│ └── predict_gpu.py # 单图像 GPU 隐写检测
|
|
120
|
+
├── models # 训练出的分类器 stego_classifier.joblib / steg_classifier_gpu.joblib
|
|
121
|
+
└── src
|
|
122
|
+
├── ns5_core.py # nsF5 核心:汉明码、湿纸求解、哈希键控、嵌入/解码
|
|
123
|
+
├── cppembed.py # C++ 嵌入封装 (自校验与 Python 像素级一致)
|
|
124
|
+
├── steganalysis.py # 盲隐写分析:卡方 + RS 嵌入率估计
|
|
125
|
+
├── fsfeatures.py # C++ 特征库的 ctypes 绑定(含与 Python 一致性校验)
|
|
126
|
+
├── ml_predict.py # 有监督 ML 判定封装
|
|
127
|
+
├── make_dataset.py # 批量生成特征数据集
|
|
128
|
+
├── train_model.py # 训练/评估/保存分类器
|
|
129
|
+
├── efficiency.py # 码族与嵌入效率绘图
|
|
130
|
+
├── image_io.py # 图像读写工具
|
|
131
|
+
├── gui.py # tkinter GUI
|
|
132
|
+
├── run_e2e.py # 端到端验证脚本
|
|
133
|
+
├── test_core.py # 核心算法单测
|
|
134
|
+
├── test_steg.py # 隐写分析单测
|
|
135
|
+
├── test_false_positive.py # 误报回归测试
|
|
136
|
+
└── test_gui.py # GUI 冒烟测试
|
|
137
|
+
├── img # 示例封面图
|
|
138
|
+
└── output # 生成结果(含密图、效率图)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 技术细节
|
|
144
|
+
|
|
145
|
+
### 伴随式矩阵编码(nsF5)
|
|
146
|
+
|
|
147
|
+
二元汉明码 `[n,k,d]`,`n = 2^p - 1`,校验矩阵 **H** 的列向量取 GF(2)^p 全部非零向量。
|
|
148
|
+
载体系数 LSB 奇偶向量 `x` 的伴随式 `s = H·x (mod 2)`。
|
|
149
|
+
|
|
150
|
+
- 嵌入 `p` 比特消息 `m`:若 `s == m` 不改动;否则 `d = s ⊕ m`,
|
|
151
|
+
找到唯一列 `j`(`H_j == d`)翻转该系数 → **每块至多改 1 个系数**。
|
|
152
|
+
- 需要改动的概率 `(2^p-1)/2^p`,嵌入效率 `α(p) = p·2^p / (2^p-1)`,随 p 增大而提高。
|
|
153
|
+
|
|
154
|
+
### F5 → nsF5
|
|
155
|
+
|
|
156
|
+
- **F5**:直流/减幅归零时"收缩",该块整块重嵌、载荷下降。
|
|
157
|
+
- **nsF5**:用**湿纸编码**预标记"减幅会归零 = 湿"的位置,湿位不动,
|
|
158
|
+
在**干位**解 GF(2) 线性方程完成嵌入 → **无收缩**,效率与安全性更高。
|
|
159
|
+
|
|
160
|
+
### 图像哈希键控
|
|
161
|
+
|
|
162
|
+
载入原图计算 SHA-256(`cover_hash`):
|
|
163
|
+
|
|
164
|
+
- 头部区:用仅口令派生的种子预埋 `cover_hash`(认证头);
|
|
165
|
+
- 正文区:用 `cover_hash + 口令` 派生的种子键控置乱路径。
|
|
166
|
+
|
|
167
|
+
解码端先用口令种子读回头部,重算正文种子解码 → 隐藏路径由图像内容唯一决定,
|
|
168
|
+
改动任意像素会破坏解码结构,可经头部校验感知篡改。
|
|
169
|
+
|
|
170
|
+
### 盲隐写分析
|
|
171
|
+
|
|
172
|
+
- **卡方检验(Westfeld)**:相邻灰度对 `(2i,2i+1)` 频率在嵌密后趋近均衡,
|
|
173
|
+
p 值高表示该区已随机化/嵌入。
|
|
174
|
+
- **RS 分析(Fridrich-Goljan-Du)**:统计正/负掩码的常规-奇异缺口
|
|
175
|
+
`Gr`、`Gn`;干净图 LSB 平面有结构(Gn 明显为正),隐写使其随机化而下降。
|
|
176
|
+
- 综合多个统计量给出 **0–1 隐写倾向概率** 与判读(不太可能 / 可能 / 高度可能)。
|
|
177
|
+
|
|
178
|
+
> 盲隐写分析本质为启发式:没有原始封面时无法给出精确绝对概率,
|
|
179
|
+
> 此处概率供评估与教学参考。
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 有监督 ML 隐写分析(C++ 特征提取 + 校园照片训练)
|
|
184
|
+
|
|
185
|
+
将**特征提取**从 Python 移植到 **C++**(`cpp/fsfeatures.dll`,MinGW 编译),
|
|
186
|
+
可显著降低逐图统计开销;嵌入热路径同样提供 **C++ 版**(`cpp/nsf5embed.dll`,
|
|
187
|
+
经跨语言回环校验与 Python **像素级一致**,`cppembed.py` 封装)。
|
|
188
|
+
并用真实校园照片做**有监督训练**,得到一个可部署的分类器。
|
|
189
|
+
|
|
190
|
+
### 训练管线
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# 1) 用 F:\DCIM\Camera 下照片批量生成 干净/含密 特征数据集
|
|
194
|
+
# (每张降采样 512x512 灰度, 1 干净 + 6 含密变体, C++ 提取 11 维特征 + C++ 嵌入)
|
|
195
|
+
python src\make_dataset.py
|
|
196
|
+
|
|
197
|
+
# 2) 训练/评估 (预留 held-out 测试集 + 5 折 GroupKFold 交叉验证选模)
|
|
198
|
+
python src\train_model.py
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
- **特征 (全由 C++ 计算)**:`RS_Gn, RS_Gr, Rm, Sm, Rn, Sn`、
|
|
202
|
+
`chi2_pvalue, chi2_stat`、`diff_entropy、lsb_diff_entropy`、`median_prefix_p`。
|
|
203
|
+
- **6 档含密变体**:覆盖弱→强,`nsF5 p3`(弱密度)至 `matrix p2`(强)。
|
|
204
|
+
414 张照片 → 2898 样本(414 干净 + 2484 含密)。
|
|
205
|
+
- **5 折 GroupKFold**:按照片分组交叉验证选模(杜绝同源泄漏),
|
|
206
|
+
再在留出测试集上报综合指标与每密度层检出率。
|
|
207
|
+
|
|
208
|
+
### 在 GUI 中启用
|
|
209
|
+
|
|
210
|
+
GUI 新增 **判定灵敏度** 下拉框(严格 / 均衡 / 宽松),作用于 **3 分析**:
|
|
211
|
+
|
|
212
|
+
- **严格 (低误报)**:提高含密判定阈值 → 干净图更少被误判;
|
|
213
|
+
- **均衡**:默认。
|
|
214
|
+
- **宽松 (高检出)**:下调阈值 → 更易检出弱密度嵌入(代价是误报略升)。
|
|
215
|
+
|
|
216
|
+
它与下方 **ML 分类含密概率** 联动(同一张净图在三种灵敏度下阈值
|
|
217
|
+
0.95→0.77→0.57,ML 判决会由"干净"切换到"含密"),启发式概率也会围绕
|
|
218
|
+
0.5 上下牵引。GUI **3 分析**会在原有启发式结果下方追加一行 **ML 分类含密概率**,
|
|
219
|
+
输入图像会自动按训练一致的方式(转灰度→512 缩放→C++ 特征)送入模型。
|
|
220
|
+
模型未加载时会提示先运行 `train_model.py`。
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# 单独用 ML 判定单张图
|
|
224
|
+
python -c "import sys; sys.path.insert(0,'src'); from ml_predict import get_predictor; \
|
|
225
|
+
import numpy as np,os; from PIL import Image; from ns5_core import embed_string; \
|
|
226
|
+
a=np.asarray(Image.open(r'img/cover.png').convert('L').resize((512,512)).convert('L')); \
|
|
227
|
+
print(get_predictor().predict(a))"
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
> **局限**:真实 JPEG 照片的 LSB 位平面天然近乎随机,弱密度 nsF5 嵌入的
|
|
231
|
+
> 统计足印很弱;ML 概率应与启发式判读**交叉印证**,不宜单独作为铁证。
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## GPU 版 (v1.2):PyTorch 批量向量化的统计特征分析
|
|
236
|
+
|
|
237
|
+
`gpu/` 子目录提供一套 **GPU(CUDA) 加速**的隐写检测管线,复刻已验证的
|
|
238
|
+
**11 维统计特征**(RS、卡方、差分熵、LSB 熵、前缀中位 p,与 `src/fsfeatures.py`
|
|
239
|
+
参考实现 **bit 级一致**),把原来逐图 Python 循环(RS 逐组、20 段前缀卡方)
|
|
240
|
+
改写为 PyTorch 张量化算子,在 CUDA 上一批并行算完。
|
|
241
|
+
|
|
242
|
+
> **为什么是"特征法"而不是裸像素 CNN?** 实测表明:在 414 张校园照片上,
|
|
243
|
+
> 从头训练的整图深度卷积网络(多架构/输入/正则组合)均无法跨照片泛化
|
|
244
|
+
> (验证 AUC≤0.50)——有效独立样本只有照片数,弱 LSB 信号需数千张源图才能学稳。
|
|
245
|
+
> 统计特征法在相同数据上验证 AUC≈**0.79**,且特征提取可被 GPU 并行化,
|
|
246
|
+
> 因此 GPU 版选择**加速这条真正管用的路径**,而非裸 CNN。
|
|
247
|
+
|
|
248
|
+
### 管线
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
# 1) 生成数据集 (每张照片 1 干净 + 4 档含密变体, 完整 512x512, 不裁剪以保留统计)
|
|
252
|
+
python gpu\make_imageset.py [照片目录] [张数]
|
|
253
|
+
|
|
254
|
+
# 2) GPU 批量提取特征 + 按照片分组训练 + 评估
|
|
255
|
+
python gpu\train_ml_gpu.py # 输出 models\steg_classifier_gpu.joblib
|
|
256
|
+
|
|
257
|
+
# 3) 单张图像 GPU 检测
|
|
258
|
+
python gpu\predict_gpu.py <图像> [<图像>...]
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### 实测 (RTX 4060 Laptop, 按数据集区分)
|
|
262
|
+
|
|
263
|
+
AUC 随源图像**泛化难度**不同,故分数据集报告:
|
|
264
|
+
|
|
265
|
+
- **数据集 A — 自然校园照片(414 张 jpg / 2070 样本)**:特征 2070 张 512² 灰度
|
|
266
|
+
约 **5s(≈410 img/s)**,GPU 利用率峰值 **99% / 平均 75%**;验证 **AUC≈0.79**,
|
|
267
|
+
按档检出率(Youden 阈值)——`matrix p3`≈99%、`nsF5 p2`(强)≈89–93%、弱 `nsF5 p3`≈64%、干净误报可控。
|
|
268
|
+
- **数据集 B — 混合图像(414 jpg + 268 tif = 682 张 / 3410 样本)**:加入 DIP4E
|
|
269
|
+
教材字母/图表等**非照片** tif 后跨界泛化难度上升,特征 3410 张约 **10s(≈327 img/s)**,
|
|
270
|
+
验证 **AUC≈0.767**;`matrix p3 d0.50` 检出≈78%、`nsF5 p2`(d0.50/d0.95)≈74–77%、
|
|
271
|
+
弱 `nsF5 p3 d0.30`≈48%、干净误报≈29%。
|
|
272
|
+
- **一致性**:`python gpu\featurize_gpu.py` 自检,GPU 与 CPU 参考特征逐项一致
|
|
273
|
+
(RS 到 bit 级、浮点 ~1e-7)。
|
|
274
|
+
|
|
275
|
+
> 依赖:`torch`(CUDA)、`numpy`、`Pillow`、`scipy`、`scikit-learn`、`joblib`、
|
|
276
|
+
> `nvidia-ml-py`(可选,用于上报 GPU 利用率)。样本数据 `gpu/data/*.npz` 较大,不入库,可重生成。
|
|
277
|
+
|
|
278
|
+
> 同 CPU 版一样,GPU 检测器输出的是**统计含密概率**,弱密度嵌入应结合启发式判读
|
|
279
|
+
> 交叉印证。GPU 特征提取亦可作为大批量图片的批量分析入口复用。
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## 持续集成 & 发版
|
|
284
|
+
|
|
285
|
+
- **CI**(`.github/workflows/ci.yml`):任何对 `main` 的推送 / PR 都会自动运行
|
|
286
|
+
`test_core.py` 与 `test_steg.py`(Python 3.9 / 3.11),并构建 `wheel + sdist`。
|
|
287
|
+
- **自动发布**:推送形如 `v1.1.0` 的 tag 时,CI 会构建包并自动创建 **GitHub Release**,
|
|
288
|
+
附带 `wheel` 与 `sdist` 作为资产,同时自动生成发布说明。
|
|
289
|
+
- **发布流程**:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
# 提交改动并打 tag(本地)
|
|
293
|
+
git add -A && git commit -m "feat: v1.1"
|
|
294
|
+
git tag v1.1 && git push origin main --tags
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## 版本历史
|
|
298
|
+
|
|
299
|
+
- **v1.2.0**
|
|
300
|
+
- 新增 **GPU 版**(`gpu/`):PyTorch 批量向量化复刻 11 维统计特征(RS/卡方/熵/前缀 p,
|
|
301
|
+
与 CPU 参考实现 bit 级一致),GPU 提取 2070 张特征 ≈5s、利用率峰值 99%。
|
|
302
|
+
- 新增 GPU 训练/推理管线 `train_ml_gpu.py`、`predict_gpu.py`;验证 **AUC≈0.79**。
|
|
303
|
+
- 实测与文档说明了"裸像素深度 CNN 需海量独立源图、局部特征法更适合小样本隐写检测"。
|
|
304
|
+
- **v1.1.0**
|
|
305
|
+
- 新增 **C++ 嵌入加速** `cpp/nsf5embed.dll`(修复汉明缓存越界;与 Python 像素级一致并经回环校验)。
|
|
306
|
+
- 监督学习升级:数据集扩展为 **6 档密度变体**、构建提速约 8→**90 倍**,
|
|
307
|
+
`train_model.py` 改为 **5 折 GroupKFold** 交叉验证选模。
|
|
308
|
+
- 修复低误报阈值选择 bug(`threshold_for_fp` 取最低阈值而非最高,保障真实低误报检出率)。
|
|
309
|
+
- GUI 新增 **判定灵敏度**(严格 / 均衡 / 宽松),联动启发式与 ML 判决阈值。
|
|
310
|
+
- 新增 CI、MIT License、构建与发版说明。
|
|
311
|
+
- **v1.0.0**
|
|
312
|
+
- nsF5 伴随式矩阵编码 + 湿纸编码;图像哈希键控;盲隐写分析;GUI;码族与效率绘图。
|
|
313
|
+
- C++ 特征提取 `cpp/fsfeatures.dll`;一版有监督分类器(LR,AUC≈0.78)。
|
|
314
|
+
|
|
315
|
+
## 许可
|
|
316
|
+
|
|
317
|
+
本项目基于 **MIT License** 发布,详见 [LICENSE](LICENSE)。
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# nsF5 图像隐写工具 (Steganography)
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
针对 **8bit 灰度/彩色图像** 的隐写研究工具,实现了基于**伴随式矩阵编码(二元汉明码)** 的
|
|
9
|
+
nsF5 隐写算法,并附带**盲隐写分析**、**图像哈希键控**与**码族/嵌入效率可视化**。
|
|
10
|
+
|
|
11
|
+
项目位于 `F:\Steganography`,核心为纯 Python(依赖 `numpy`/`Pillow`,GUI 使用标准库 `tkinter`);
|
|
12
|
+
另提供 **C++ 加速库**(`cpp/fsfeatures.dll` 特征提取、`cpp/nsf5embed.dll` 嵌入热路径 + 确定性置乱
|
|
13
|
+
`nsf5_permute`,MinGW 编译,跨语言校验与 Python 一致性一致;置乱在 DLL 缺失时自动回退到
|
|
14
|
+
Python 同算法,嵌入/解码两端序列恒定可逆)。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 功能总览
|
|
19
|
+
|
|
20
|
+
| 模块 | 说明 |
|
|
21
|
+
|------|------|
|
|
22
|
+
| **嵌入 / 解码** | 将 ASCII 字符串嵌入图像 LSB,解码还原;支持口令键控 |
|
|
23
|
+
| **伴随式矩阵编码** | nsF5 + F5 / LSB 矩阵编码,二元汉明码 `[n=2^p-1, k, 3]`,块内至多改 1 系数 |
|
|
24
|
+
| **湿纸编码** | nsF5 核心:预标记"减幅归零=湿"位置,在干位解 GF(2) 线性方程,无收缩 |
|
|
25
|
+
| **图像哈希键控** | 载入时计算 SHA-256;隐藏路径由"内容哈希+口令"唯一决定,解码端自同步并感知篡改 |
|
|
26
|
+
| **盲隐写分析** | 卡方检验(Westfeld) + RS 分析(Fridrich),输出 0–1 隐写倾向概率与判读 |
|
|
27
|
+
| **绘图** | 绘制码族(嵌入率 α vs 载荷)理论曲线 与 实测嵌入效率对比 |
|
|
28
|
+
| **GUI** | 载入图 → 嵌入/解码 → 分析 → 绘图 一体化界面 |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 安装与运行
|
|
33
|
+
|
|
34
|
+
### 方式 A:从源码运行
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
cd F:\Steganography
|
|
38
|
+
pip install numpy pillow
|
|
39
|
+
python src\gui.py
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
> 若系统默认 `python` 未带 tkinter,可用带 tkinter 的解释器(如 `C:\Python314\python.exe`):
|
|
43
|
+
> `C:\Python314\python.exe src\gui.py`
|
|
44
|
+
|
|
45
|
+
### 方式 B:安装打包的模块(wheel)
|
|
46
|
+
|
|
47
|
+
每个版本会以源码包发布,可构建并安装:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# 构建 wheel + sdist(需已安装 build)
|
|
51
|
+
python -m build
|
|
52
|
+
|
|
53
|
+
# 安装 wheel(核心模块:ns5_core / steganalysis / gui 等)
|
|
54
|
+
pip install dist\nsf5stego-1.1.0-py3-none-any.whl
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
> 注意:wheel 仅含纯 Python 核心;`cpp/` 下的 Windows DLL(特征提取/嵌入加速)随仓库源码发布,
|
|
58
|
+
> 运行 GUI/离线使用仍需项目源码目录内的 `cpp/`。
|
|
59
|
+
|
|
60
|
+
### 运行测试
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
python src\test_core.py # 核心算法自测(嵌入/解码 + 汉明矩阵 + 湿纸 + 口令)
|
|
64
|
+
python src\test_steg.py # 盲隐写分析自测(区分 干净/含密 图)
|
|
65
|
+
python src\run_e2e.py # 端到端验证(嵌入→保存→解码→分析→绘图)
|
|
66
|
+
python src\test_gui.py # GUI 冒烟测试(构建窗口/载入/预览)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## GUI 使用流程
|
|
72
|
+
|
|
73
|
+
1. 点击 **载入原始图 / 含密图** 选择 8bit 图像。
|
|
74
|
+
2. 选择 **算法**(`nsF5` 或 `matrix`)、**参数 p**(块比特数,越大效率越高)、可选**口令**。
|
|
75
|
+
3. 在文本框中输入待嵌入的 **ASCII 字符串**。
|
|
76
|
+
4. 点击 **1 嵌入并保存** → 生成 `output/stego_*.png`,右侧预览含密图。
|
|
77
|
+
5. 点击 **2 解码提取** → 从含密图还原字符串(须与嵌入使用相同 算法/p/口令)。
|
|
78
|
+
6. 点击 **3 分析** → 显示 SHA256、卡方统计、RS 缺口、估计嵌入率与隐写概率。
|
|
79
|
+
7. 点击 **生成码族与效率图** → 弹出理论 vs 实测效率对比图。
|
|
80
|
+
|
|
81
|
+
> 解码与嵌入参数(方法/p/口令)必须一致;口令或图像内容不匹配将无法正确解码。
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 目录结构
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
F:\Steganography
|
|
89
|
+
├── README.md
|
|
90
|
+
├── cpp
|
|
91
|
+
│ ├── fsfeatures.cpp # C++ 特征提取源
|
|
92
|
+
│ ├── fsfeatures.dll # 编译产物 (MinGW)
|
|
93
|
+
│ ├── nsf5embed.cpp # C++ nsF5/matrix 嵌入热路径源
|
|
94
|
+
│ └── nsf5embed.dll # 编译产物 (MinGW)
|
|
95
|
+
├── data/dataset.csv # 有监督训练数据集 (clean+stego 特征)
|
|
96
|
+
├── gpu
|
|
97
|
+
│ ├── make_imageset.py # GPU版数据集生成 (完整512, 1干净+4含密变体/照片)
|
|
98
|
+
│ ├── featurize_gpu.py # GPU批量向量化 11 维统计特征 (与 CPU 参考 bit 级一致)
|
|
99
|
+
│ ├── train_ml_gpu.py # GPU特征提取 + 按照片分组训练分类器
|
|
100
|
+
│ └── predict_gpu.py # 单图像 GPU 隐写检测
|
|
101
|
+
├── models # 训练出的分类器 stego_classifier.joblib / steg_classifier_gpu.joblib
|
|
102
|
+
└── src
|
|
103
|
+
├── ns5_core.py # nsF5 核心:汉明码、湿纸求解、哈希键控、嵌入/解码
|
|
104
|
+
├── cppembed.py # C++ 嵌入封装 (自校验与 Python 像素级一致)
|
|
105
|
+
├── steganalysis.py # 盲隐写分析:卡方 + RS 嵌入率估计
|
|
106
|
+
├── fsfeatures.py # C++ 特征库的 ctypes 绑定(含与 Python 一致性校验)
|
|
107
|
+
├── ml_predict.py # 有监督 ML 判定封装
|
|
108
|
+
├── make_dataset.py # 批量生成特征数据集
|
|
109
|
+
├── train_model.py # 训练/评估/保存分类器
|
|
110
|
+
├── efficiency.py # 码族与嵌入效率绘图
|
|
111
|
+
├── image_io.py # 图像读写工具
|
|
112
|
+
├── gui.py # tkinter GUI
|
|
113
|
+
├── run_e2e.py # 端到端验证脚本
|
|
114
|
+
├── test_core.py # 核心算法单测
|
|
115
|
+
├── test_steg.py # 隐写分析单测
|
|
116
|
+
├── test_false_positive.py # 误报回归测试
|
|
117
|
+
└── test_gui.py # GUI 冒烟测试
|
|
118
|
+
├── img # 示例封面图
|
|
119
|
+
└── output # 生成结果(含密图、效率图)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 技术细节
|
|
125
|
+
|
|
126
|
+
### 伴随式矩阵编码(nsF5)
|
|
127
|
+
|
|
128
|
+
二元汉明码 `[n,k,d]`,`n = 2^p - 1`,校验矩阵 **H** 的列向量取 GF(2)^p 全部非零向量。
|
|
129
|
+
载体系数 LSB 奇偶向量 `x` 的伴随式 `s = H·x (mod 2)`。
|
|
130
|
+
|
|
131
|
+
- 嵌入 `p` 比特消息 `m`:若 `s == m` 不改动;否则 `d = s ⊕ m`,
|
|
132
|
+
找到唯一列 `j`(`H_j == d`)翻转该系数 → **每块至多改 1 个系数**。
|
|
133
|
+
- 需要改动的概率 `(2^p-1)/2^p`,嵌入效率 `α(p) = p·2^p / (2^p-1)`,随 p 增大而提高。
|
|
134
|
+
|
|
135
|
+
### F5 → nsF5
|
|
136
|
+
|
|
137
|
+
- **F5**:直流/减幅归零时"收缩",该块整块重嵌、载荷下降。
|
|
138
|
+
- **nsF5**:用**湿纸编码**预标记"减幅会归零 = 湿"的位置,湿位不动,
|
|
139
|
+
在**干位**解 GF(2) 线性方程完成嵌入 → **无收缩**,效率与安全性更高。
|
|
140
|
+
|
|
141
|
+
### 图像哈希键控
|
|
142
|
+
|
|
143
|
+
载入原图计算 SHA-256(`cover_hash`):
|
|
144
|
+
|
|
145
|
+
- 头部区:用仅口令派生的种子预埋 `cover_hash`(认证头);
|
|
146
|
+
- 正文区:用 `cover_hash + 口令` 派生的种子键控置乱路径。
|
|
147
|
+
|
|
148
|
+
解码端先用口令种子读回头部,重算正文种子解码 → 隐藏路径由图像内容唯一决定,
|
|
149
|
+
改动任意像素会破坏解码结构,可经头部校验感知篡改。
|
|
150
|
+
|
|
151
|
+
### 盲隐写分析
|
|
152
|
+
|
|
153
|
+
- **卡方检验(Westfeld)**:相邻灰度对 `(2i,2i+1)` 频率在嵌密后趋近均衡,
|
|
154
|
+
p 值高表示该区已随机化/嵌入。
|
|
155
|
+
- **RS 分析(Fridrich-Goljan-Du)**:统计正/负掩码的常规-奇异缺口
|
|
156
|
+
`Gr`、`Gn`;干净图 LSB 平面有结构(Gn 明显为正),隐写使其随机化而下降。
|
|
157
|
+
- 综合多个统计量给出 **0–1 隐写倾向概率** 与判读(不太可能 / 可能 / 高度可能)。
|
|
158
|
+
|
|
159
|
+
> 盲隐写分析本质为启发式:没有原始封面时无法给出精确绝对概率,
|
|
160
|
+
> 此处概率供评估与教学参考。
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 有监督 ML 隐写分析(C++ 特征提取 + 校园照片训练)
|
|
165
|
+
|
|
166
|
+
将**特征提取**从 Python 移植到 **C++**(`cpp/fsfeatures.dll`,MinGW 编译),
|
|
167
|
+
可显著降低逐图统计开销;嵌入热路径同样提供 **C++ 版**(`cpp/nsf5embed.dll`,
|
|
168
|
+
经跨语言回环校验与 Python **像素级一致**,`cppembed.py` 封装)。
|
|
169
|
+
并用真实校园照片做**有监督训练**,得到一个可部署的分类器。
|
|
170
|
+
|
|
171
|
+
### 训练管线
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# 1) 用 F:\DCIM\Camera 下照片批量生成 干净/含密 特征数据集
|
|
175
|
+
# (每张降采样 512x512 灰度, 1 干净 + 6 含密变体, C++ 提取 11 维特征 + C++ 嵌入)
|
|
176
|
+
python src\make_dataset.py
|
|
177
|
+
|
|
178
|
+
# 2) 训练/评估 (预留 held-out 测试集 + 5 折 GroupKFold 交叉验证选模)
|
|
179
|
+
python src\train_model.py
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- **特征 (全由 C++ 计算)**:`RS_Gn, RS_Gr, Rm, Sm, Rn, Sn`、
|
|
183
|
+
`chi2_pvalue, chi2_stat`、`diff_entropy、lsb_diff_entropy`、`median_prefix_p`。
|
|
184
|
+
- **6 档含密变体**:覆盖弱→强,`nsF5 p3`(弱密度)至 `matrix p2`(强)。
|
|
185
|
+
414 张照片 → 2898 样本(414 干净 + 2484 含密)。
|
|
186
|
+
- **5 折 GroupKFold**:按照片分组交叉验证选模(杜绝同源泄漏),
|
|
187
|
+
再在留出测试集上报综合指标与每密度层检出率。
|
|
188
|
+
|
|
189
|
+
### 在 GUI 中启用
|
|
190
|
+
|
|
191
|
+
GUI 新增 **判定灵敏度** 下拉框(严格 / 均衡 / 宽松),作用于 **3 分析**:
|
|
192
|
+
|
|
193
|
+
- **严格 (低误报)**:提高含密判定阈值 → 干净图更少被误判;
|
|
194
|
+
- **均衡**:默认。
|
|
195
|
+
- **宽松 (高检出)**:下调阈值 → 更易检出弱密度嵌入(代价是误报略升)。
|
|
196
|
+
|
|
197
|
+
它与下方 **ML 分类含密概率** 联动(同一张净图在三种灵敏度下阈值
|
|
198
|
+
0.95→0.77→0.57,ML 判决会由"干净"切换到"含密"),启发式概率也会围绕
|
|
199
|
+
0.5 上下牵引。GUI **3 分析**会在原有启发式结果下方追加一行 **ML 分类含密概率**,
|
|
200
|
+
输入图像会自动按训练一致的方式(转灰度→512 缩放→C++ 特征)送入模型。
|
|
201
|
+
模型未加载时会提示先运行 `train_model.py`。
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# 单独用 ML 判定单张图
|
|
205
|
+
python -c "import sys; sys.path.insert(0,'src'); from ml_predict import get_predictor; \
|
|
206
|
+
import numpy as np,os; from PIL import Image; from ns5_core import embed_string; \
|
|
207
|
+
a=np.asarray(Image.open(r'img/cover.png').convert('L').resize((512,512)).convert('L')); \
|
|
208
|
+
print(get_predictor().predict(a))"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
> **局限**:真实 JPEG 照片的 LSB 位平面天然近乎随机,弱密度 nsF5 嵌入的
|
|
212
|
+
> 统计足印很弱;ML 概率应与启发式判读**交叉印证**,不宜单独作为铁证。
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## GPU 版 (v1.2):PyTorch 批量向量化的统计特征分析
|
|
217
|
+
|
|
218
|
+
`gpu/` 子目录提供一套 **GPU(CUDA) 加速**的隐写检测管线,复刻已验证的
|
|
219
|
+
**11 维统计特征**(RS、卡方、差分熵、LSB 熵、前缀中位 p,与 `src/fsfeatures.py`
|
|
220
|
+
参考实现 **bit 级一致**),把原来逐图 Python 循环(RS 逐组、20 段前缀卡方)
|
|
221
|
+
改写为 PyTorch 张量化算子,在 CUDA 上一批并行算完。
|
|
222
|
+
|
|
223
|
+
> **为什么是"特征法"而不是裸像素 CNN?** 实测表明:在 414 张校园照片上,
|
|
224
|
+
> 从头训练的整图深度卷积网络(多架构/输入/正则组合)均无法跨照片泛化
|
|
225
|
+
> (验证 AUC≤0.50)——有效独立样本只有照片数,弱 LSB 信号需数千张源图才能学稳。
|
|
226
|
+
> 统计特征法在相同数据上验证 AUC≈**0.79**,且特征提取可被 GPU 并行化,
|
|
227
|
+
> 因此 GPU 版选择**加速这条真正管用的路径**,而非裸 CNN。
|
|
228
|
+
|
|
229
|
+
### 管线
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# 1) 生成数据集 (每张照片 1 干净 + 4 档含密变体, 完整 512x512, 不裁剪以保留统计)
|
|
233
|
+
python gpu\make_imageset.py [照片目录] [张数]
|
|
234
|
+
|
|
235
|
+
# 2) GPU 批量提取特征 + 按照片分组训练 + 评估
|
|
236
|
+
python gpu\train_ml_gpu.py # 输出 models\steg_classifier_gpu.joblib
|
|
237
|
+
|
|
238
|
+
# 3) 单张图像 GPU 检测
|
|
239
|
+
python gpu\predict_gpu.py <图像> [<图像>...]
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### 实测 (RTX 4060 Laptop, 按数据集区分)
|
|
243
|
+
|
|
244
|
+
AUC 随源图像**泛化难度**不同,故分数据集报告:
|
|
245
|
+
|
|
246
|
+
- **数据集 A — 自然校园照片(414 张 jpg / 2070 样本)**:特征 2070 张 512² 灰度
|
|
247
|
+
约 **5s(≈410 img/s)**,GPU 利用率峰值 **99% / 平均 75%**;验证 **AUC≈0.79**,
|
|
248
|
+
按档检出率(Youden 阈值)——`matrix p3`≈99%、`nsF5 p2`(强)≈89–93%、弱 `nsF5 p3`≈64%、干净误报可控。
|
|
249
|
+
- **数据集 B — 混合图像(414 jpg + 268 tif = 682 张 / 3410 样本)**:加入 DIP4E
|
|
250
|
+
教材字母/图表等**非照片** tif 后跨界泛化难度上升,特征 3410 张约 **10s(≈327 img/s)**,
|
|
251
|
+
验证 **AUC≈0.767**;`matrix p3 d0.50` 检出≈78%、`nsF5 p2`(d0.50/d0.95)≈74–77%、
|
|
252
|
+
弱 `nsF5 p3 d0.30`≈48%、干净误报≈29%。
|
|
253
|
+
- **一致性**:`python gpu\featurize_gpu.py` 自检,GPU 与 CPU 参考特征逐项一致
|
|
254
|
+
(RS 到 bit 级、浮点 ~1e-7)。
|
|
255
|
+
|
|
256
|
+
> 依赖:`torch`(CUDA)、`numpy`、`Pillow`、`scipy`、`scikit-learn`、`joblib`、
|
|
257
|
+
> `nvidia-ml-py`(可选,用于上报 GPU 利用率)。样本数据 `gpu/data/*.npz` 较大,不入库,可重生成。
|
|
258
|
+
|
|
259
|
+
> 同 CPU 版一样,GPU 检测器输出的是**统计含密概率**,弱密度嵌入应结合启发式判读
|
|
260
|
+
> 交叉印证。GPU 特征提取亦可作为大批量图片的批量分析入口复用。
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## 持续集成 & 发版
|
|
265
|
+
|
|
266
|
+
- **CI**(`.github/workflows/ci.yml`):任何对 `main` 的推送 / PR 都会自动运行
|
|
267
|
+
`test_core.py` 与 `test_steg.py`(Python 3.9 / 3.11),并构建 `wheel + sdist`。
|
|
268
|
+
- **自动发布**:推送形如 `v1.1.0` 的 tag 时,CI 会构建包并自动创建 **GitHub Release**,
|
|
269
|
+
附带 `wheel` 与 `sdist` 作为资产,同时自动生成发布说明。
|
|
270
|
+
- **发布流程**:
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
# 提交改动并打 tag(本地)
|
|
274
|
+
git add -A && git commit -m "feat: v1.1"
|
|
275
|
+
git tag v1.1 && git push origin main --tags
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## 版本历史
|
|
279
|
+
|
|
280
|
+
- **v1.2.0**
|
|
281
|
+
- 新增 **GPU 版**(`gpu/`):PyTorch 批量向量化复刻 11 维统计特征(RS/卡方/熵/前缀 p,
|
|
282
|
+
与 CPU 参考实现 bit 级一致),GPU 提取 2070 张特征 ≈5s、利用率峰值 99%。
|
|
283
|
+
- 新增 GPU 训练/推理管线 `train_ml_gpu.py`、`predict_gpu.py`;验证 **AUC≈0.79**。
|
|
284
|
+
- 实测与文档说明了"裸像素深度 CNN 需海量独立源图、局部特征法更适合小样本隐写检测"。
|
|
285
|
+
- **v1.1.0**
|
|
286
|
+
- 新增 **C++ 嵌入加速** `cpp/nsf5embed.dll`(修复汉明缓存越界;与 Python 像素级一致并经回环校验)。
|
|
287
|
+
- 监督学习升级:数据集扩展为 **6 档密度变体**、构建提速约 8→**90 倍**,
|
|
288
|
+
`train_model.py` 改为 **5 折 GroupKFold** 交叉验证选模。
|
|
289
|
+
- 修复低误报阈值选择 bug(`threshold_for_fp` 取最低阈值而非最高,保障真实低误报检出率)。
|
|
290
|
+
- GUI 新增 **判定灵敏度**(严格 / 均衡 / 宽松),联动启发式与 ML 判决阈值。
|
|
291
|
+
- 新增 CI、MIT License、构建与发版说明。
|
|
292
|
+
- **v1.0.0**
|
|
293
|
+
- nsF5 伴随式矩阵编码 + 湿纸编码;图像哈希键控;盲隐写分析;GUI;码族与效率绘图。
|
|
294
|
+
- C++ 特征提取 `cpp/fsfeatures.dll`;一版有监督分类器(LR,AUC≈0.78)。
|
|
295
|
+
|
|
296
|
+
## 许可
|
|
297
|
+
|
|
298
|
+
本项目基于 **MIT License** 发布,详见 [LICENSE](LICENSE)。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "nsf5stego"
|
|
7
|
+
version = "1.2.1"
|
|
8
|
+
description = "nsF5 steganography tool: syndrome matrix coding (Hamming) + wet-paper coding + image-hash keying + blind steganalysis + GUI"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.9"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [{ name = "nsf5stego", email = "dev@example.com" }]
|
|
13
|
+
keywords = ["steganography", "nsf5", "f5", "hamming", "steganalysis", "image"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Topic :: Security :: Cryptography",
|
|
17
|
+
"Topic :: Multimedia :: Graphics",
|
|
18
|
+
]
|
|
19
|
+
dependencies = ["numpy", "Pillow"]
|
|
20
|
+
|
|
21
|
+
[project.urls]
|
|
22
|
+
Homepage = "https://github.com/Yushitayuri/nsf5-steganography"
|
|
23
|
+
Repository = "https://github.com/Yushitayuri/nsf5-steganography"
|
|
24
|
+
|
|
25
|
+
[project.scripts]
|
|
26
|
+
nsf5stego = "gui:main"
|
|
27
|
+
|
|
28
|
+
[tool.setuptools]
|
|
29
|
+
package-dir = { "" = "src" }
|
|
30
|
+
py-modules = ["ns5_core", "steganalysis", "efficiency", "image_io", "gui",
|
|
31
|
+
"cppembed", "fsfeatures", "ml_predict", "make_dataset", "train_model"]
|