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 论文的参考实现。 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](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, 区块链, 图像处理, 安全规则引擎, 数字水印, 无后门, 逆向工具, 防篡改, 隐写术