JM00NJ/SHA256-CDP
GitHub: JM00NJ/SHA256-CDP
基于CDP结构分析理论的GPU加速SHA-256彩虹表实现,利用哈希输出的数学性质在受限输入空间进行高效原像查找。
Stars: 8 | Forks: 0
# SHA256-CDP:循环数字和投影
**针对 SHA-256 的 CDP 结构分析框架的 GPU 加速彩虹表实现。**
基于 CDP 论文(DOI:[10.5281/zenodo.20627240](https://doi.org/10.5281/zenodo.20627240))的研究成果,本仓库提供了一个完整、可用的基于 CDP 的彩虹链表实现,包含 OpenCL 构建 kernel 以及针对 AMD RDNA4 硬件设计的 Vulkan 计算 查询/验证 pipeline。
## 什么是 CDP?
CDP(循环数字和投影)是一个针对 SHA-256 的结构分析框架,揭示了哈希函数输出分布中此前未被记录的数学属性。
核心观察:任何 SHA-256 输出的十六进制数字和 `W(H)`,在通过 `f(w) = W(SHA256(str(w)))` 迭代重新哈希时,会确定性地收敛到恰好**两个闭环**中:
```
C1: 476 ↔ 438 (2-cycle)
C2: 471 → 472 → 525 → 537 → 414 → 417 → 546 → 518 → 471 (8-cycle)
```
这种循环结构,结合多组件指纹 `F(H) = (W, Wvec₁₆, cycle_entry, W₂–W₅, max_nibble, min_nibble)`,在受约束的输入空间上产生了**双射映射**——从而实现了通过彩虹表进行 O(1) 的原像查找,且没有归约函数冲突。
已证明的关键属性:
- **定理 5.1** — 互补 nibble 和不变量:所有 256 个互补对的 `Σnibble(W₀) = 38`
- **定理 5.4** — 遍历 Markov 属性:`π_B = 17.00%`,与 `K[i]`、`H₀` 和输入类别无关
- `W(H₀) = 502` — NIST 初始化常量的可检测结构签名(高于平衡态 +22.2)
- 在所有测试的输入空间中,实现了对 167 万个输入的零冲突双射
CDP **不会**破解 SHA-256。原像抗性和冲突抗性不受影响。详见论文第 12 节。
## 仓库结构
```
SHA256-CDP/
├── cdp_chain_builder.py # Main entry point — build, crack, query CLI
├── cdp_query.comp # Vulkan GLSL compute shader (query kernel)
├── cdp_verify.comp # Vulkan GLSL compute shader (verify kernel)
├── vulkan_query.py # Vulkan Python engine (ACO backend)
└── paper/
└── cdp_v3.pdf # CDP paper v3
```
## 环境要求
- Python 3.10+
- PyOpenCL:`pip install pyopencl`
- NumPy:`pip install numpy`
- Vulkan(推荐):`pip install vulkan` + [Vulkan SDK](https://vulkan.lunarg.com/)
- 带有 RDNA2+ 的 AMD GPU(已在 RX 9070 XT / gfx1201 上测试)
## 安装说明
```
git clone https://github.com/JM00NJ/SHA256-CDP
cd SHA256-CDP
pip install pyopencl numpy vulkan
```
验证 GPU 检测:
```
python cdp_chain_builder.py --validate
```
## 用法
### 构建彩虹表
```
# 单表(小写 8 字符,chain_len=300,000)
python cdp_chain_builder.py --build --charset lower --length 8 --chain-len 300000 --output cdp_8.bin
# 多表(更高覆盖率)
# n=1: 66.7% n=2: 88.9% n=3: 96.3% n=5: 99.3%
python cdp_chain_builder.py --build-multi 3 --prefix cdp_8_bin --length 8 --chain-len 300000
```
### 破解哈希
```
# 单个 hash
python cdp_chain_builder.py --crack \
--tables cdp_8_bin_1.bin,cdp_8_bin_2.bin,cdp_8_bin_3.bin \
--length 8 --chain-len 300000
# hash 列表(batch 模式 — 表仅加载一次)
python cdp_chain_builder.py --crack-list hashes.txt \
--tables cdp_8_bin_1.bin,cdp_8_bin_2.bin,cdp_8_bin_3.bin \
--length 8 --chain-len 300000
```
### 端到端自测
```
python cdp_chain_builder.py --self-test --length 7
```
### 验证 GPU 输出
```
python cdp_chain_builder.py --validate
python cdp_chain_builder.py --validate-query
```
## 性能
测试环境:**AMD Radeon RX 9070 XT**(gfx1201,32 CUs),Windows 11,驱动程序 3679.0 (PAL,LC):
| 操作 | 吞吐量 |
|---|---|
| 构建表 (ILP2 kernel) | ~2.5 GH/s |
| 查询 — 首批 (浅层) | ~14 GH/s |
| 查询 — 跨批次平均 | ~5 GH/s |
| GPU 验证 (Vulkan ACO) | 每个 88k 候选 ~2s |
**7 字符小写字母,3 个表(96.3% 覆盖率):**
- 表大小:3 × 0.7 MB
- 构建时间:~3 × 12s
- 破解时间:每个哈希 ~43s
**Kernel 模式:**
- `--mode ilp2` — 2 链/线程,交错 SHA256 以实现 ILP(默认,在 AMD RDNA 上最快)
- `--mode vec4` — 4 链/线程,使用 `uint4` 算术
- `--mode scalar` — 1 链/线程(基线)
## 技术说明
### 为什么查询使用 Vulkan?
在 Windows (gfx1201) 上 OpenCL 使用的 AMD PAL-LLVM 编译器后端存在一个已记录的优化器 bug:变量起始循环 (`for step=pos; step
标签:DOS头擦除, OpenCL, Veh, Vulkan, 反病毒测试, 哈希算法, 密码学, 密码破解, 彩虹表, 手动系统调用, 逆向工具