Evandsimon/three-body-problem-cipher
GitHub: Evandsimon/three-body-problem-cipher
基于三体问题混沌理论的实验性流密码研究项目,采用四映射整数 PWLCM 引擎并包裹 AES-256-GCM 作为安全兜底,旨在接受密码学社区的公开审查与攻击测试。
Stars: 2 | Forks: 0
# 三体问题密码 (3BP)
[](https://github.com/Evandsimon/three-body-problem-cipher/actions/workflows/ci.yml)
*建立在无人能解的问题之上的加密。*
太空中的三个物体,仅凭引力相互拉扯。你知道它们的质量、位置和速度。规则仅仅是三行数学公式。然而——没有任何公式能告诉你它们未来会在哪里。不是“我们还没找到”。而是在数学上,可被证明地,未来是*开放的*(注:指不可预测)。初始位置最微小的差异——一毫米、一微秒——都会让它们的轨迹分道扬镳,演变成截然不同的历史。
流密码想要的正是这一点:一个对初始条件极其敏感的系统,以至于改变密钥中的单个比特,就会产生完全不同的密钥流,且两者之间没有可检测的规律。它是确定性的——相同的密钥总是给出相同的输出——但对于不掌握密钥的人来说,它与随机序列无法区分。
**这就是本项目的实质。** 不是对轨道力学的模拟。而是一种不同寻常的数学混沌——在 2¹²⁷−1 网格上的四个分段线性映射,进行 XOR 组合,推入一个非线性混合器中,并通过一条会销毁旧密钥的单向链每 64 KiB 重新生成密钥。规则简单。输出不可预测。
作为一个研究产物而构建。从各个角度进行了猛烈攻击。包裹在两道独立的锁中,因此即使混沌之墙倒塌,数据仍处于 AES-256-GCM 的保护之下。最客观的估计是没有人能破解它——而将其公开的全部意义就在于看看它是否能被破解。
📊 **[打开可视化记分卡 →](docs/scorecard.html)** — 速度柱状图、与 AES-256-GCM 的正面对比、雷达图。无需互联网,独立的 HTML 页面。
## 设计原理
基于混沌的加密曾被尝试过——而大多数尝试都失败了,因为浮点数中的混沌系统在不同机器之间并不是真正确定性的,或者因为映射结构通过输出发生了泄漏。本项目解决了这两个问题:
**为什么使用整数运算。** 浮点数混沌密码无法保证两台机器能产生相同的密钥流(即“有限精度悖论”)。本密码在固定的 2¹²⁷−1 网格上使用整数 PWLCM——相同的密钥、相同的 nonce,在每台机器上、每次都能产生相同的输出。
**为什么使用 4 个映射。** 单个混沌映射是可逆的——如果你能观察到足够的输出,你就可以将其倒推回去。将 4 个独立的映射进行 XOR 组合,可以将每一个映射隐藏在其他映射之后。经测量,各映射之间的独立性很好(相关性为 0.008),测量到的中间相遇攻击成本约为 ~2²⁵⁴,并且 4 个映射正是收益递减的临界点——由于所有映射共享相同的主密钥,增加 5 个及以上的映射只会增加成本,而不会增加有意义的安全余量。
**为什么是 2¹²⁷−1。** M127 是一个梅森素数,这使得模归约是零成本的(用移位加法代替除法)。更大的网格 = 每个映射的周期更长(遵循 √M 随机函数定律,约为 ~2⁶²)。然后,非线性输出混合器将 127 位状态折叠为 64 位,并且仅发布最高的 32 位——因此隐藏的比特位充当了防止状态恢复的防火墙。
**为什么使用棘轮机制。** 流密码都有周期——密钥流最终会重复。自动重置密钥的棘轮机制通过使用单向 HMAC 链每 64 KiB 替换一次密钥并销毁旧密钥来解决此问题。全新的映射,全新的轨道,不受限制的长度。作为副作用,窃取实时密钥无法解密过去的消息(前向保密)。
**为什么使用两道锁。** 未经审查的密码绝不应是保护数据的唯一防线。混沌 AEAD 使用独立的密钥包裹了一个经过审查的内部保险库(AES-256-GCM 或 ChaCha20-Poly1305)。即使混沌层被完全破解,明文仍然受到世界标准密码的保护。混沌层是暴露的、牺牲性的城墙——有趣但未经证实;真正保证数据安全的,是内部的保险库。
## 它的有趣之处
**核心引擎。** 四个独立的分段线性混沌映射(在 2¹²⁷−1 网格上的整数 PWLCM),通过 XOR 组合成一个密钥流。每个映射都是无分支且常量时间的。输出会经过非线性 ARX 混合器处理,因此密钥流无法被回滚到内部状态。
**棘轮机制。** 单向 HMAC-SHA256 密钥链每 64 KiB 重新生成一次密钥,并销毁旧密钥——提供前向保密(窃取实时密钥无法解密过去的消息)以及实际上不受限制的长度。
**外壳。** AEAD 采用先加密后验证、密钥承诺 (CMT-4)、流式/分块模式、防 nonce 误用 (SIV) 以及前向保密会话。
**两道锁。** 混沌 AEAD 使用独立的密钥包裹了一个经过审查的内部保险库(AES-256-GCM 或 ChaCha20-Poly1305)。即使混沌层被完全破解,数据仍处于 AES-256-GCM 的保护之下。
**后量子密钥交换。** 混合保密性(经典 DH + ML-KEM-768)和混合身份验证(三重 DH + ML-DSA-65 签名)——攻击者必须同时攻破两端才能进行冒充。
**快速的 Rust 核心。** 比 Python 参考实现快约 35 倍(约 61 MB/s),与冻结的测试向量在比特级别完全一致,支持双向的 Python↔Rust 互操作。
**诚实的自我攻击。** 15 个攻击脚本试图攻破每一层。那些在小规模上成功的攻击都附带了能在大规模下阻止它们的因素的文档说明。客观的比特安全性声明为 **~254 位**(即最小且可信的攻击成本,而不是我们能引用的最大数字)。
## 快速开始
```
# Python(参考实现)
pip install -r requirements.txt
pytest tests/ -q # 183 tests
# Rust(快速核心 — 约快 35 倍)
. "$HOME/.cargo/env"
cd rust && cargo build --release && cargo test --release # 28 tests
# 跨实现验证
python -m pytest tests/test_rust_parity.py -q # Rust == Python, 36 tests
python -m pytest tests/test_rust_fuzz.py -q # Random fuzz, hundreds of cases
```
## 安全用法(你实际调用的方式)
```
from twolock import seal, open_
key = b"any shared secret bytes"
blob = seal(key, b"secret message") # chaos outer + AES-256-GCM inner
msg = open_(key, blob) # raises InvalidTag if tampered or wrong key
```
对于单层防护(仅限研究/实验):
```
from aead import seal, open_, InvalidTag
blob = seal(key, b"secret message")
msg = open_(key, blob)
```
## 架构
```
master key (256-bit)
│
├──→ HKDF-SHA256 ──→ chaos AEAD key ──→ [OUTER WALL: 4-map chaos AEAD]
│ │
└──→ HKDF-SHA256 ──→ inner vault key ──→ [INNER VAULT: AES-256-GCM]
│
plaintext depends on THIS one
```
内部保险库才是真正保证数据安全的地方。混沌之墙是暴露的、牺牲性的屏障——未经审查但很有趣,即使它出现裂缝,内部保险库依然能屹立不倒。
## 内容清单
| 层级 | Python | Rust | 功能描述 |
|-------|--------|------|-------------|
| 引擎 | `engine.py` | `engine.rs` | 单个 PWLCM 映射,无分支,常量时间 |
| 多映射 | `multimap.py` | `multimap.rs` | 4 个独立映射的 XOR 组合 |
| 棘轮 | `ratchet.py` | `ratchet.rs` | 自动重新生成密钥,前向保密 |
| AEAD | `aead.py` | `aead.rs` | 封装/解封,先加密后验证,密钥承诺 |
| 流式传输 | `streaming.py` | `streaming.rs` | 分块 AEAD,捕获重排/丢失/截断 |
| 棘轮 AEAD | `ratchet_aead.py` | `ratchet_aead.rs` | 前向保密消息会话 |
| SIV | `siv.py` | `siv.rs` | 防止 nonce 误用 |
| 两道锁 | `twolock.py` | `twolock.rs` | 混沌外层 + 经过审查的内部保险库 |
| 经典 KEX | `keyexchange.py` | `keyexchange.rs` | 基于 RFC 3526 MODP-2048 的 Diffie-Hellman |
| PQ 混合 KEX | `pq_keyexchange.py` | `keyexchange.rs` | DH + ML-KEM-768 混合 |
| 认证 PQ KEX | `auth_pq_keyexchange.py` | `auth_pq.rs` | 混合认证 (triple-DH + ML-DSA-65) |
| CTR 模式 | `ctr.py` | `ctr.rs` | 可寻址的随机访问密钥流 |
## 攻击测试套件
每一个安全声明都是经过测量的,而非断言。每个攻击脚本都试图攻破一层并如实报告。
```
for a in attacks/*.py; do python3 "$a"; done
```
| 攻击 | 尝试内容 | 满规模下的结果 |
|--------|--------------|---------------------|
| 两次密码本重用 | 重用密钥+nonce → 恢复明文 | ⚠️ Nonce 是强制性的(所有流密码都是如此——如 AES-GCM、ChaCha20 等) |
| 已知明文 | 从输出恢复状态 | 幸存(状态空间 ~2⁵⁰⁸,MITM ~2²⁵⁴) |
| 核心密码分析 | 偏差寻找 + 中间相遇攻击 | 幸存(MITM 需 ~2²⁵⁴ 时间+内存) |
| 差分攻击 | 单比特输入 → 输出偏差 | 幸存(处于噪声底层) |
| 周期普查 | 短周期,陷阱 | 幸存(遵循 √M 定律,300 个密钥中发现 0 个陷阱) |
| 映射数量 | 映射越少越弱吗? | 幸存(4 个映射相互独立,相关性 0.008) |
| 棘轮 | 前向保密,重新生成密钥接缝 | 幸存(过去数据不可恢复,接缝处理干净) |
| 承诺 | 跨密钥伪造 | 幸存(通过 HMAC-SHA256 需 ~2¹²⁸) |
| 流式传输 | 重排,丢失,截断 | 幸存(全部被捕获) |
| 棘轮 AEAD | 过去消息恢复 | 幸存(销毁的密钥无法解密过去的数据) |
| 两道锁 | 混沌完全被破解 → 得到明文? | 幸存(内部 AES-256-GCM 依然稳固,0/67 被破解) |
| PQ 混合 | 攻破其中一个原语 | 幸存(另一道防线依然稳固,64/64) |
| 认证 PQ | 攻破其中一道认证防线 | 幸存(另一道防线依然稳固,6/6) |
## 客观数据
| 指标 | 数值 | 备注 |
|--------|-------|------|
| 比特安全性声明 | ~254 位 | MITM ~2²⁵⁴, TMTO ~2²⁵⁴, 密钥 2²⁵⁶ 中的最小值 |
| Rust 速度 | ~61 MB/s | 4 映射组合器,单线程 |
| Rust 对比 ChaCha20 | 慢约 37 倍 | ChaCha20 ~2,272 MB/s(硬件加速) |
| Rust 对比 AES-NI | 慢约 149 倍 | AES-256-CTR ~9,082 MB/s |
| Python 速度 | ~1.7 MB/s | 仅供参考——请使用 Rust 核心 |
| 密钥流周期 | ~2²⁴⁷ | 棘轮之前的 4 映射组合;棘轮消除了此限制 |
| 前向保密 | 是 | 64 KiB 周期,销毁的密钥在 Rust 中被清零 |
| 常量时间 | 是 | 无分支映射 + 倒数除法,测得 0.41% 的离散度 |
| 后量子 | 仅限混合模式 | 依赖于经过审查的 ML-KEM-768 + ML-DSA-65,而非混沌数学 |
## 项目状态
**8 个阶段中的第 8 阶段已完成。** Rust 核心现在具备了与 Python 完全对等的功能。路线图上仅剩下第 7 阶段(外部审查)。
查看 [`PROGRESS.md`](PROGRESS.md) 了解当前状态,以及 [`docs/build-log.md`](docs/build-log.md) 了解完整的构建历史。
## 许可证
[MIT](LICENSE) — 可免费用于任何用途、研究或商业用途。本项目未经审查;使用风险自负。
## 相关工作
基于混沌的密码学有一段历史——而大多数尝试都经不起考验。为本项目提供信息参考的关键论文:
- **Alvarez & Li (2006).** “基于混沌的密码系统的一些基本密码学要求”——这篇论文系统地破解了许多早期的混沌密码,并为可信的密码系统设定了必须通过的门槛。
- **Biham (1991).** 对混沌流密码的密码分析——确立了除非进行显式掩盖,否则映射结构会通过输出泄漏的观点。
- **IACR ePrint 2021/542.** 一种三体密码概念——本项目是对已知概念的独立构建,而不是首创。这里的新颖之处在于客观的自我攻击、经过测量的比特安全性声明,以及两道锁的部署能力。
客观的框架说明:这个项目站在巨人的肩膀上。它的价值不在于发明了新东西——而在于严谨地构建它客观地攻击它,并最终将其作为一个透明的研究产物发布出来。
作者 **Evan Simonenko** · [asturai.com](https://asturai.com) · contact@asturai.com
标签:Rust, 加密算法, 可视化界面, 学术研究, 密码学, 手动系统调用, 流密码, 混沌理论, 网络流量审计, 逆向工具