flegare/pixel-block-chain
GitHub: flegare/pixel-block-chain
PBC 是一种将区块链结构通过 LSB 隐写术嵌入图像像素的来源追踪与空间篡改定位系统,可在元数据被剥离后仍然存活。
Stars: 0 | Forks: 0
# Pixel Block Chain (PBC)
**针对自然图像的空间篡改定位与抗裁剪编辑账本**
由 François Légaré、Sion Israel Sion 和 Alain April(蒙特利尔工程学院)发表的 IEEE ICIP 2026 论文的参考实现。
[](https://opensource.org/licenses/MIT)
[](https://www.python.org/downloads/)
PBC 使用 LSB 隐写术将防篡改来源直接嵌入到图像像素数据中——结构化为每个空间图块的独立区块链。与基于元数据的系统(EXIF、C2PA)不同,PBC 的来源存在于像素值本身,并且**能够在**社交媒体平台、消息应用程序和屏幕截图工具剥离元数据后**存活**。
## PBC 的功能
| 功能 | 状态 |
|---|---|
| 检测像素级篡改 | ✅ 已验证 |
| 空间定位篡改区域(图块级) | ✅ 已验证 |
| 无级联:一个图块中的篡改不影响其他图块 | ✅ 已验证 |
| 追踪每个区域的编辑类型和历史记录(编辑账本) | ✅ 已验证 |
| 区域级多作者归属(无需外部数据库) | ✅ 已验证 |
| 在元数据剥离后存活 | ✅ 已验证 |
| 抗裁剪模式(PBC-Forest):60×80% 裁剪后存活率约 43% | ✅ 已验证 |
| 视频:检测帧篡改/重排/插入/删除 | ✅ 已验证 |
| 文档印章:逐页 QR 绑定内容 + 页面顺序 | ✅ 已验证(26 页,100% 通过) |
| 可见字形水印:人类可感知的来源提示 | ✅ 已验证(PSNR 22 dB 时准确率 99%) |
| 证明图像反映真实情况 | ❌(没有任何来源系统能做到) |
| 克服模拟漏洞 | ❌(与 C2PA 共同的局限性) |
| 在 JPEG 压缩后生效(k=1) | ❌(JPEG 会破坏所有 LSB;需要无损格式) |
| 在没有外部信任层的情况下证明来源者身份 | ❌(参见 [信任模型](#trust-model)) |
## 安装
```
git clone https://github.com/flegare/pixel-block-chain.git
cd pixel-block-chain
pip install numpy Pillow
```
特定示例的额外依赖:
```
pip install scipy # benchmark plots
pip install qrcode zxingcpp # margin QR stamp examples
pip install rawpy # camera RAW workflow
pip install pyhanko pyhanko-certvalidator # PDF signing
```
## 快速开始
### 将 PBC 编码到图像中
```
import numpy as np
from PIL import Image
from pbc.encoder import encode
img = np.array(Image.open("photo.png").convert("RGB"))
encoded = encode(img, originator="MyCamera-SN12345", opcode=0x0001)
Image.fromarray(encoded).save("photo_pbc.png")
# 保存为 PNG/TIFF/WebP-lossless — JPEG 会破坏链条
```
### 验证完整性
```
from pbc.decoder import verify
from pbc.visualizer import generate_report_image
result = verify(encoded)
print(result.summary())
report = generate_report_image(encoded, result)
report.save("report.png")
```
### CLI
```
python -m pbc encode photo.png -o photo_pbc.png --originator "MyCamera-SN12345"
python -m pbc verify photo_pbc.png -o report.png
python -m pbc info photo_pbc.png
```
### 完整演示
```
python examples/demo.py
```
## 架构
### 独立图块链网格
PBC 将图像划分为自适应图块网格(默认 128×128 像素)。每个图块都有自己独立的链和创世哈希。一个图块中的篡改**永远不会级联**到其他图块——每个图块都可以独立验证。
```
Image (W × H)
┌────┬────┬────┬────┐
│ T │ T │ T │ T │ Each tile = independent block chain
├────┼────┼────┼────┤ Tile genesis = SHA-256(oid ‖ tx ‖ ty ‖ ts)[0:48]
│ T │ 🔴 │ T │ T │
├────┼────┼────┼────┤ One tampered tile → only that tile RED
│ T │ T │ T │ T │ All other tiles remain independently GREEN
└────┴────┴────┴────┘
```
### 区块结构(256 位 = 32 字节)
```
┌────────┬─────────┬──────────────┬────────┬─────────┬────────┬────────┬───────────┬───────┬────────────┐
│ Sync │ Version │ Originator │ OpCode │ Block │ Tile X │ Tile Y │ Timestamp │ CRC16 │ Chain Hash │
│ 48 bit │ 8 bit │ 32 bit │ 16 bit │ 16 bit │ 8 bit │ 8 bit │ 24 bit │16 bit │ 48 bit │
└────────┴─────────┴──────────────┴────────┴─────────┴────────┴────────┴───────────┴───────┴────────────┘
```
每个像素携带 3 个位(1 个 LSB × 3 个通道),因此每个区块跨越约 86 个像素。
一个 128×128 的图块可容纳约 190 个区块。一张 1200 万像素的图像拥有约 750 个图块和约 142,500 个区块。
### 链哈希
```
Block[n].chain_hash = SHA-256(Block[n-1])[0:48 bits]
Block[0].chain_hash = SHA-256(oid ‖ tile_x ‖ tile_y ‖ timestamp)[0:48 bits]
```
修改区块 n 中的任何像素都会改变该区块的字节 → 导致区块 n+1 中存储的链哈希失效 → 被检测为 YELLOW 或 RED。失败**仅局限于该图块**。
### 验证状态
| 状态 | 含义 |
|---|---|
| 🟢 **GREEN / INTACT** | CRC 有效,链哈希有效 —— 来源完整 |
| 🟡 **YELLOW / MODIFIED** | CRC 有效,链断裂 —— 感知 PBC 的重新编码 |
| 🔴 **RED / TAMPERED** | CRC 无效 —— 检测到原始像素修改 |
| ⬜ **ABSENT / NO_PBC** | 未找到同步帧 —— 未嵌入来源 |
## 编辑账本与多作者归属
感知 PBC 的编辑器在**追加模式**下运行:它们不会覆盖现有链,而是追加带有自己 Originator ID 和操作码的新区块。每个图块中按顺序排列的区块构成了**编辑账本** —— 这是一份防篡改、按时间顺序排列的记录,记录了从 RAW 捕获到现在的每一次转换:
```
Tile (2,1) Edit Ledger:
Block 0: oid=NikonZ9-SN2024 op=Camera_ISP t=T+0s
Block 1: oid=Lightroom-Alice op=Edit_Color t=T+3600s
Block 2: oid=Photoshop-Bob op=Edit_Retouch t=T+7200s
```
这在没有任何外部数据库的情况下记录了空间归属。
### 操作码注册表
| 代码 | 名称 | 描述 |
|------|------|-------------|
| `0x0000` | `Camera_Raw` | 未处理的传感器捕获 |
| `0x0001` | `Camera_ISP` | 相机 ISP 管道输出 |
| `0x0010` | `Edit_Crop` | 由感知 PBC 的编辑器进行裁剪 |
| `0x0011` | `Edit_Color` | 颜色/曝光调整 |
| `0x0012` | `Edit_Resize` | 重采样/缩放 |
| `0x0020` | `Edit_Retouch` | 修复、仿制图章 |
| `0x0030` | `Edit_AI_Enh` | AI 超分辨率、降噪 |
| `0x0031` | `Edit_AI_Gen` | AI 生成的图像修复 |
| `0x0040` | `Export_Compress` | 应用有损压缩 |
| `0x0060` | `Batch_Tonal` | 浓缩的 N 次色调/参数编辑 |
| `0x0061` | `Batch_Structural` | 浓缩的 N 次结构性编辑 |
| `0xFFFE` | `Chain_Repair` | 为链修复而重新编码 |
## 扩展
### PBC-Forest(抗裁剪)
标准网格模式在未对齐的裁剪边界处会失效。PBC-Forest 将每个区块作为独立的创世区块放置在伪随机位置。任何存活的区块都能独立验证来源:
```
Results (leo.jpg, 60%×80% non-aligned crop):
Grid mode: 0.0% survival
Single-chain scatter: ≤0.5% survival
PBC-Forest: 41–45% survival (theoretical max: 47.9%)
```
```
python examples/forest_scatter_test.py
```
### 视频 PBC
每一帧的图块网格都锚定到前一帧中同一图块的终端区块字节——从而创建逐图块的帧间链。它以空间精度检测像素篡改、帧交换、帧插入和帧删除。
```
python examples/video_pbc.py
```
### 页边 QR 文档印章
每页一个 220×220 像素的 QR 码(右下角页边)包含:
- `content_hash`:二值化页面的 SHA-256(不受光线影响)
- `chain_hash`:上一页渲染的 QR 像素阵列的 SHA-256
在 26 页上进行验证:100% 通过。检测内容修改、页面移除和页面重排。
```
python examples/pbc_margin_qr_stamp.py
```
### 可见字形水印
源自创世哈希的 44×44 像素字形,以可配置的不透明度叠加。通过互相关进行检测——对适度的亮度和对比度变化具有鲁棒性。
| 不透明度 α | PSNR | 准确率 |
|---|---|---|
| 0.35 | 24.4 dB | 94.8% |
| **0.45** | **22.1 dB** | **99.0%** |
| 0.65 | 19.0 dB | 99.7% |
```
python examples/pbc_glyph_watermark_demo.py
```
## 格式鲁棒性
| 格式 | 类型 | 链是否存活 |
|---|---|---|
| PNG | 无损 | ✅ |
| BMP | 无损 | ✅ |
| TIFF (LZW / raw) | 无损 | ✅ |
| WebP (无损) | 无损 | ✅(最紧凑:0.69× PNG) |
| JPEG (任何质量) | 有损 | ❌ |
| WebP (有损) | 有损 | ❌ |
JPEG 会通过 YCbCr 颜色空间舍入来破坏 LSB 数据,无论质量设置如何。**务必以无损格式保存编码了 PBC 的图像。**
## 性能
在 AMD Ryzen 消费级硬件上的单线程 Python 运行结果:
| 分辨率 | 图块数 | 编码 | 验证 | PSNR |
|---|---|---|---|---|
| 256² | 4 | 91 ms | 87 ms | 51.2 dB |
| 1024² | 64 | 2.0 s | 1.9 s | 51.2 dB |
| 1200 万像素 (4032×3024) | 768 | 19.3 s | 19.1 s | 51.2 dB |
| 2400 万像素 (6000×4000) | 1457 | 34.2 s | 34.9 s | 51.2 dB |
| 6100 万像素 (9504×6336) | 3700 | 100 s | 99 s | 51.2 dB |
吞吐量随像素数呈线性(O(n))扩展,速度约为 0.65 MP/s。
无论图像大小如何,PSNR 恒定在 51.2 dB。
```
python examples/benchmark.py
python examples/highres_benchmark.py
```
## 审稿人可复现性
只需在全新克隆的代码库中安装核心运行时依赖项及 `pytest`,即可检查论文中的关键声明:
```
git clone https://github.com/flegare/pixel-block-chain.git
cd pixel-block-chain
python -m pip install -e .
python -m pip install pytest
python -m pytest -q
python tools/validate_paper_claims.py
```
验证运行器会写入:
- `results/paper_validation.json` —— 机器可读的指标和阈值。
- `results/paper_validation.md` —— 简洁的人类可读摘要。
可以从公开实现中重新生成稳定的论文图表:
```
python tools/regenerate_paper_figures.py
```
要将图表写入外部论文文件夹:
```
python tools/regenerate_paper_figures.py --output-dir path/to/paper/figures
```
用于审稿人验证的数据集来源记录在 `results/dataset_manifest.json` 中。完整的 99 张图像论文基准测试使用了 94 张真实图像(60 张 COCO,12 张 Oxford Flowers,21 张 Oxford-IIIT Pets 和 `leo.jpg`)外加 5 个确定性合成探针。清单记录了真实图像基准集的确切文件名、尺寸、字节大小和 SHA-256 哈希值。
位于 `.github/workflows/validation.yml` 的 CI 工作流会在每次推送和拉取请求时运行单元测试和论文验证运行器。
## 信任模型
PBC 的 Originator ID 是自定义身份字符串的 32 位截断 SHA-256。这是一个**持久的假名指纹**,而不是经过验证的身份。
- **没有外部信任层:** PBC 回答*“此图像自编码以来是否被修改过,以及在哪里被修改?”*
- **带有可选信任层(PKI/透明度日志):** 绑定到 X.509 证书的 Originator ID 回答*“编码器是受信任的设备吗?”*
PBC 旨在**补充 C2PA**,而不是取代它。C2PA 通过 PKI 提供来源身份验证;而 PBC 提供的空间完整性在 C2PA 的文件级元数据无法存活的地方(社交媒体重新编码、元数据剥离)依然有效。
## 论文
最终定稿的论文(`paper/PBC_ICIP2026_CameraReady.pdf`)、其 LaTeX 源码(`paper/PBC_ICIP2026_CameraReady.tex`)以及所有图表(`paper/figures/`)均已包含在内。该 PDF 是使用标准 LaTeX 发行版(`pdflatex`,IEEEtran class)从源码编译而来的。
## 仓库结构
```
pixel-block-chain/
├── pbc/ Core library
│ ├── encoder.py LSB block encoding, grid and forest modes
│ ├── decoder.py Block extraction, chain verification
│ ├── scatter.py PBC-Forest scatter placement
│ ├── video.py Video inter-frame chain
│ ├── visualizer.py Tile integrity map visualization
│ └── cli.py Command-line interface
├── examples/ Demonstration and experiment scripts
│ ├── demo.py Core encode/verify/tamper scenarios
│ ├── edit_ledger_demo.py Multi-author Edit Ledger experiment
│ ├── forest_scatter_test.py Crop survivability (PBC-Forest)
│ ├── video_pbc.py Video inter-frame chain validation
│ ├── pbc_margin_qr_stamp.py Document stamp (26-page validation)
│ ├── pbc_glyph_watermark_demo.py Visible glyph watermark
│ ├── benchmark.py Performance benchmarks
│ ├── highres_benchmark.py Camera-grade resolution benchmarks
│ ├── multi_image_eval.py Generalization across 99 images
│ └── img/leo.jpg Primary test image
├── paper/
│ ├── PBC_ICIP2026_CameraReady.pdf Camera-ready paper (ICIP 2026)
│ ├── PBC_ICIP2026_CameraReady.tex LaTeX source
│ └── figures/ All paper figures
├── results/ Experiment result files (text/CSV)
├── web/
│ ├── pbc_verifier.html Browser-based verifier UI
│ └── https_server.py Local HTTPS server for the verifier
├── setup.py
├── LICENSE MIT
└── README.md
```
## 许可证
MIT License — 版权所有 (c) 2026 François Légaré。参见 [LICENSE](LICENSE)。
标签:Python, 区块链, 图像处理, 安全规则引擎, 数字水印, 无后门, 逆向工具, 防篡改, 隐写术