cahlen/keeloq-python

GitHub: cahlen/keeloq-python

针对 KeeLoq 分组密码的现代化密码分析工具箱,融合 SAT 代数攻击与 Gohr 风格神经差分攻击两种流水线,可在秒级内恢复减轮版本的 64 位密钥。

Stars: 11 | Forks: 3

# keeloq-python 对 [KeeLoq](https://en.wikipedia.org/wiki/KeeLoq) 分组密码的代数 + 神经密码分析——这是对 2015 年最初存在于本仓库中基于 SAT 的攻击的 2026 年现代化升级。 ## 目录结构 针对减轮 KeeLoq 的两个独立密码分析流水线,均可通过单个 `keeloq` CLI 驱动: 1. **代数 / SAT** — Python 3,结合具有原生 XOR 子句的 CryptoMiniSat,以及纯 CNF 和 XOR 感知的 ANF 编码器。在 RTX 5090 上,能够以 **64 轮 / 0 提示 / 4 个明文-密文对在 0.247 秒内** 恢复 64 位密钥。而最初的 2015 年流水线处理更难的变体(160 轮,25 个密钥位提示,2 个明文-密文对)需要 14 个小时。 2. **神经差分 (Gohr 2019 风格)** — 在 GPU 位切片 KeeLoq 实现上训练的 PyTorch ResNet-1D-CNN 区分器(在 5090 上约 10⁶ 对/秒),结合贝叶斯束搜索密钥恢复,并将区分器无法解析的剩余位交接给 SAT 后缀处理。独特之处在于:KeeLoq 每轮 1 位的密钥调度允许贝叶斯搜索一次猜测一位,而不是像 Gohr 最初的 SPECK 攻击那样猜测 16 位的子密钥块。 2015 年的流水线(SageMath + miniSAT + 手工编辑的多项式系统)已冻结在 `legacy/` 中,并通过 Docker 托管的 `python:2.7` 一致性测试针对现代流水线进行了验证。 ## 系统要求 - Linux x86_64, Python 3.12 - [`uv`](https://docs.astral.sh/uv/) 用于依赖管理 - **可选**:CUDA 12.8+ GPU(RTX 5090 或类似设备)——神经流水线以及针对 GPU 位切片密码的属性测试需要此项;代数攻击在 CPU 上运行良好。 - **可选**:Docker——在一个临时的 `python:2.7` 容器内运行传统的 2015 Python 2 脚本以进行一致性测试。 ## 安装 ``` uv sync --all-extras ``` ## 快速入门 — 代数攻击 在 64 轮、4 个明文-密文对、零提示的条件下恢复 64 位密钥: ``` KEY=0011010011011111100101100001110000011101100111001000001101110100 PT1=01100010100101110000101011100011 PT2=11010011100101010000111100001010 CT1=$(uv run keeloq encrypt --rounds 64 --plaintext $PT1 --key $KEY) CT2=$(uv run keeloq encrypt --rounds 64 --plaintext $PT2 --key $KEY) uv run keeloq attack --rounds 64 \ --pair "$PT1:$CT1" --pair "$PT2:$CT2" \ --encoder xor --solver cryptominisat --timeout 120 ``` 典型实际耗时:**< 1 秒**。 复现 2015 README 基线(160 轮,25 个提示,2 个明文-密文对,传统代码对比): ``` uv run keeloq benchmark ``` ## 快速入门 — 神经密码分析 端到端,单条命令(Δ 搜索 + 训练 + 攻击合成目标): ``` uv run keeloq neural auto --rounds 64 --trained-depth 56 \ --samples 10000000 --pairs 512 \ --checkpoint-out checkpoints/d64.pt ``` 在 RTX 5090 上的训练时间约 60 分钟。或者跳过训练,直接从 Hugging Face 拉取已发布的检查点: ``` mkdir -p checkpoints hf download cahlen/keeloq-neural-distinguishers d64.pt --local-dir checkpoints/ ``` 然后攻击同一密钥下的任何新密文: ``` uv run keeloq neural recover-key --checkpoint checkpoints/d64.pt \ --rounds 64 --diff-pair ":" --sat-pair ":" \ --beam-width 16 --sat-timeout 120 ``` ### 工作原理 — KeeLoq 上的 Gohr 模式 在固定深度 **D**(例如 56)下训练 ResNet-1D-CNN 区分器,以将选择输入差分的密文对与随机对区分开来。**M = D + K** 轮的攻击通过贝叶斯束搜索(`recover_prefix`)剥离 `K` 轮,从而恢复外部的 `K` 个密钥位。剩余的后缀位被交接给代数流水线的 XOR 感知编码器 + CryptoMiniSat。每一个恢复的密钥在报告 `SUCCESS` 之前都会经过密码验证(`cipher.encrypt(pt, k, rounds) == ct`)。 **双数据对流。** `--diff-pair` 承载差分密文对 `(c₀, c₁)`——包含两个密文,供神经区分器使用。`--sat-pair` 承载已知的 `plaintext:ciphertext`(明文:密文)对——供 SAT 求解器使用。这两者是不同的,因为差分攻击不需要已知明文;只有 SAT 阶段需要。 **密钥调度约束。** KeeLoq 的密钥每 64 轮循环一次;在少于 64 轮的情况下,位 `K_rounds..K_63` 永远不会被引用,如果不提供提示就无法恢复。因此,低于 64 轮的攻击会自动为不受约束的范围填充 `extra_key_hints`——这由 `keeloq neural auto` 自动处理。 ### Hugging Face 上的预训练区分器 检查点发布在 [**cahlen/keeloq-neural-distinguishers**](https://huggingface.co/cahlen/keeloq-neural-distinguishers),附有完整的模型卡片,涵盖训练配置、评估指标、架构和攻击过程。当前可用性: | 文件 | 训练深度 | 攻击目标 | 验证集准确率 | ROC-AUC | |---|---:|---:|---:|---:| | `d64.pt` | 56 | 64 轮 | 0.752 | 0.828 | | `d96.pt` | 88 | 96 轮 | (即将推出) | (即将推出) | | `d128.pt` | 120 | 128 轮 | (即将推出) | (即将推出) | 每个 `.pt` 文件都嵌入了其完整的 `TrainingConfig`,因此只需使用随机种子即可复现结果。 ## 通过 Unix 管道组合流水线 代数流水线也作为独立的阶段公开,在 stdin/stdout 上使用 JSON: ``` keeloq generate-anf ... | keeloq encode ... | keeloq solve ... | keeloq verify ... ``` 这对于检查中间产物(ANF 多项式系统、DIMACS CNF、SAT 结果 JSON)或替换为备选编码器/求解器非常有用。 ## 运行测试 ``` uv run pytest -n auto -m "not slow" # fast suite — ~30 s on the 5090 box uv run pytest -n auto # full suite, including GPU and slow ``` 测试标记: - `@pytest.mark.gpu` — 需要 CUDA GPU;在仅限 CPU 的机器上自动跳过。 - `@pytest.mark.slow` — 耗时数秒的测试;从默认的快速测试套件中排除,但会运行端到端的攻击和基准冒烟测试。 - `@pytest.mark.legacy` — 需要 Docker + `python:2.7` 镜像;运行 2015 年的脚本并验证一致性。 ## 项目布局 ``` src/keeloq/ # modern Python 3 pipeline cipher.py # readable reference cipher (rounds-parameterized) gpu_cipher.py # bit-sliced CUDA cipher (property-test oracle + training-data generator) anf.py # ANF polynomial system generator encoders/ # pure-CNF + XOR-aware encoders solvers/ # CryptoMiniSat wrapper + DIMACS subprocess wrapper attack.py # SAT-only attack pipeline with mandatory cipher-verify neural/ # Phase 3b neural cryptanalysis data.py # training pair generator (differential + random) differences.py # Δ candidate search distinguisher.py # ResNet-1D-CNN + training loop + checkpoint I/O evaluation.py # accuracy / ROC-AUC / TPR@FPR metrics key_recovery.py # partial_decrypt_round + recover_prefix beam search hybrid.py # neural-prefix + SAT-suffix orchestration cli_neural.py # `keeloq neural {train, evaluate, recover-key, auto}` cli.py # main Typer entry point legacy/ # frozen 2015 Python 2 scripts (run via Docker) benchmarks/ matrix.toml # algebraic benchmark matrix (Phase 1) bench_attack.py # runner neural_matrix.toml # neural-hybrid vs pure-SAT matrix (Phase 3b) bench_neural.py # runner tests/ # pytest suite (unit + property + integration + compat) checkpoints/ # trained distinguisher checkpoints (not committed; reproducible) docs/ superpowers/specs/ # design docs per modernization phase superpowers/plans/ # task-by-task implementation plans phase3b-results/ # Δ search tables, eval reports, benchmark results ``` ## 历史背景(2015 年起源) 最初的 2015 年流水线是这次现代化的目标。已原封不动地冻结在 `legacy/` 中: - `keeloq-python.py` / `keeloq160-python.py` — Python 2 编写的 KeeLoq 参考实现(528 轮和 160 轮)。 - `sage-equations.py` / `polynomial-vars.py` — 为 SageMath 输出 ANF 多项式系统和变量列表。 - `sage-CNF-convert.txt` — SageMath 驱动程序,通过 PolyBoRi 的 `CNFEncoder` 将 ANF 转换为 DIMACS CNF。 - `parse-miniSAT.py` — 从 miniSAT 输出中恢复 64 位密钥。 原 2015 年 README 文本(为提供历史参考保留如下): 有关追踪从 2015 年状态到当前代码的路径的设计文档,请参见 [`docs/superpowers/specs/`](docs/superpowers/specs/)。 ## 许可证 MIT — 详见 [LICENSE](LICENSE)。
标签:CNN, CryptoMiniSat, CUDA, IaC 扫描, KeeLoq, Python, PyTorch, SAT求解器, Vectored Exception Handling, 云资产清单, 代数分析, 凭据扫描, 分组密码, 密码学, 密钥恢复, 差分分析, 手动系统调用, 无后门, 比特切片, 深度学习, 神经密码学, 请求拦截, 贝叶斯搜索, 逆向工程