opsec-ee/bb84
GitHub: opsec-ee/bb84
该项目是 BB84 量子密钥分发协议的经典后处理仿真,使用纯整数算术实现 Cascade 纠错、隐私放大与密钥确认,安全性基于信息论而非计算复杂度。
Stars: 0 | Forks: 0
# BB84 QKD 仿真 v2.2
**C23 / Cascade-lite / h(e) PA / RAMStore / 4-sidecar**
BB84 量子密钥分发协议的经典仿真
包含完整的后处理:通过 Cascade 进行纠错,
信息论隐私放大,以及密钥确认。
无浮点数。无 IEEE 754。操作系统强制执行内存不可变性。每个函数均具备完整的
ExCLisp AS/Pivot/IS 契约。
## v2.2 中的更改
**FIX-1 -- clock() 替换为 CLOCK_MONOTONIC:**
`ee_ratio_elapsed()` 之前使用 `clock_t / CLOCKS_PER_SEC`。
`clock()` 测量的是进程消耗的 CPU 时间。上下文
切换、热节流和调度器压力对它是不可见的。吞吐量声明需要实际时间。v2.2 自始至终使用
`clock_gettime(CLOCK_MONOTONIC)`。分子是纳秒增量。
分母是 1,000,000,000 = 2^9 * 5^9。
无 IEEE 754。144,000 比例规范在新的时间平面上得以保留。
旧的计时块数字是被错误标记为实际时间的 CPU 时间——它们已被硬件测量的实际时间替换。
**FIX-2 -- 构建标志一致性:**
`bb84_main.c` 头文件和 `Makefile` 现在统一使用 `-std=c23`。
v2.1 在 Makefile 中使用了 `-std=c2x`,在头文件中使用了 `-std=c23`。
所有构建目标都添加了 `-Wpedantic`。
**FIX-3 -- 构建命令可安全复制粘贴:**
单行构建命令。没有 `\` 续行符。
没有 `*` 通配符扩展风险。所有三个目标(release、debug、
asan)均已验证可从文件头安全复制粘贴。
## 性能
在 i7 上运行 16 次(2 x 冷启动 `make clean && make run`),
`-O3 -march=native -flto -funroll-loops`,CLOCK_MONOTONIC 实际时间:
```
Min: 0.0002 s
Max: 0.0005 s
Mean: 0.0003 s
Spread: +-85.71%
Throughput: ~5,851,428 photons/s
Sessions: 16/16 GATE_1
```
**波动说明:** 会话在 0.2-0.5ms 内完成。在此规模下,
操作系统调度器粒度(约 100us)主导了实际时间的方差。
该波动是测量误差,而非算法不稳定。
16/16 GATE_1 确认了所有运行中正确的协议行为。
Gate-X 速率:在 3% 信道噪声下每次会话约 5%。
`Binomial(256, 0.03)` 在 11% 以上的尾部预期:约 4-5%。
协议行为正确。这不是 Bug。
`final_len` 在不同会话中有所不同。正确:依赖于 QBER 的
`h(e)` 驱动 PA 输出长度。恒定的 `final_len` 将
表明 PA 公式损坏。
## 协议概述
BB84(Bennett & Brassard, 1984)是首个量子密钥分发
协议。安全性源于量子不可克隆定理:窃听者
在不干扰未知量子态的情况下无法复制它,从而引入可检测的
错误。此实现模拟了
量子传输之后的经典后处理流水线。
**安全性是信息论的,而非计算性的。** 量子
计算机无法破解 BB84。拥有无限时间的经典计算机
也无法破解 BB84。安全边界来自
信息论容量公式 `n*(1 - 2*h(e))`。
### 阶段顺序
```
Phase 1 Quantum transmission FRONT sidecar
Phase 2 Basis reconciliation LEAD sidecar
Phase 3 QBER estimation REAR sidecar (phase 1)
Phase 4 Error correction RECONCILE sidecar
Phase 5 Privacy amplification REAR sidecar (phase 2)
Key confirmation REAR sidecar (phase 2)
```
**阶段顺序是安全不变量。** 必须在纠错之前
在原始筛选密钥上测量 QBER。在
Cascade 之后测量将始终产生约 0% 的错误——使阈值检查
成为死代码并破坏安全性证明。
## 数学
### 1. 筛选
Alice 在基 B 中编码比特 b。Bob 在独立选择的
基 B' 中进行测量。仅当 B_Alice = B_Bob 时才会保留筛选比特。
```
E[sifted_len] = N/2 (random basis choices, N photons)
```
在 N=2048 时:预期约有 1024 个筛选比特。
### 2. QBER 估计
从筛选密钥中,随机抽取大小为 s 的样本(Fisher-Yates
洗牌,无前缀偏差)。量子比特错误率:
```
e = errors / s
```
以 144,000 上的整数比例测量。无 IEEE 754:
```
e_num = (errors * 144000) / s
```
接受条件(交叉相乘,无除法):
```
errors * 144000 <= 15840 * s
```
根据整数算术,精确等效于 e <= 11%。
### 3. 二进制熵与 11% 阈值
二进制熵函数:
```
h(e) = -e*log2(e) - (1-e)*log2(1-e)
```
在 e = 0.11 时: h(0.11) = 0.5000
PA 输出长度公式:
```
final_bits = n * (1 - 2*h(e)) - parity_leaked - security_margin
```
在 e = 11% 时: 1 - 2*h(0.11) = 0
该公式产生零输出。这不是硬编码的阈值。
它是 Eve 对密钥的
了解等于密钥长度的信息论边界。阈值由公式自然得出。
h(e) 被预计算为 12 项分段表,其值
表示为 144,000 上的分子。条目之间的线性插值
自始至终使用整数交叉相乘。推导:
```
import math
def h(e): return 0 if e==0 else -e*math.log2(e)-(1-e)*math.log2(1-e)
for pct in range(12):
print(pct, round(h(pct/100)*144000))
```
抽查:
```
0 -> 0 (h=0.00000)
3 -> 27993 (h=0.19440)
11 -> 72000 (h=0.50000 -- exact at threshold)
```
### 4. Cascade 纠错
Cascade(Brassard & Salvail, 1994)通过交互式二分搜索纠正所有可检测的比特错误。
输入:非样本筛选比特。
样本位置被永久丢弃——它们是公开的。
块大小(4 次迭代,每次加倍):
```
Pass 1: k = 8
Pass 2: k = 16
Pass 3: k = 32
Pass 4: k = 64
```
BISECT 正确性(归纳法):
```
Base: block size 1 -> single position IS the error. Flip it.
Step: block size k > 1, one error in [lo, hi).
left-half parity mismatch -> error in left. Recurse.
left-half parity match -> error in right. Recurse.
Terminates in ceil(log2(k)) steps.
```
用于 Cascade 复查的块查找:通过预计算的
逆置换 `inv_perm[pass][comp_pos]` 实现 O(1)。每次
迭代构建成本 O(n),每次查找 O(1)。总复查成本 O(n*e*passes)。
### 5. 隐私放大
输出长度(比例算术,无浮点数):
```
numerator = n_pa * (144000 - 2 * h_val)
final_raw = numerator / 144000 (integer floor)
final_bits = final_raw - parity_leaked - SECURITY_PARAM
```
溢出边界:
```
max(n_pa * 144000) = 1792 * 144000 = 258,048,000 < 2^64
```
实现:Toeplitz 哈希(GF(2) 矩阵向量乘法)。
来自 `getrandom(2)` 的种子。有损契约:
`{{0 [ (input,n,m) (AS/--\WAS) output[] ] 1}}`
### 6. 密钥确认
PA 之后,Alice 打包她的非样本原始比特并
逐字与 `reconciled_key` 进行比较。不匹配意味着 Cascade 留下了
未纠正的错误。会话中止。
`final_key` 的 64 位旋转异或哈希存储为 `confirm_hash`。
泄漏:64 位——由 `SECURITY_PARAM = 64` 覆盖。
## 144,000 比例系统
所有算术均使用精确的有理数表示。无 IEEE 754。
```
144,000 = 2^7 * 3^2 * 5^3 (160 divisors)
```
每个阈值、每个压缩率、每个熵值均
表示为 `uint64_t numerator / 144000`。比较使用整数
交叉相乘。无舍入误差。无平台相关的浮点
行为。在所有硬件上都是确定性的。
## 4 状态门逻辑
| 状态 | 含义 |
|-------|----------------------------------------------|
| Z | 尚未达到 / 不适用 |
| X | 失败、不匹配或超出阈值 |
| 0 | 有效结果,拒绝 / bit-0 |
| 1 | 有效结果,允许 / bit-1 |
Gate-X 通过 `_Atomic uint32_t abort_flag` 进行因果传播。
每个 sidecar 在遇到致命错误时,会在其屏障之前设置该标志,
然后到达所有剩余的屏障而不跳过。无死锁。
无部分 RAMStore 写入。
## Sidecar 线程模型
```
FRONT --[fl]--> LEAD --[lr]--> REAR(QBER) --[rq]--> RECONCILE --[rc]--> REAR(PA)
```
| Barrier | 数量 | 参与者 |
|-------------|-------|--------------------------|
| barrier_fl | 2 | FRONT + LEAD |
| barrier_lr | 3 | LEAD + REAR + RECONCILE |
| barrier_rq | 2 | REAR + RECONCILE |
| barrier_rc | 2 | RECONCILE + REAR |
`barrier_lr` count=3 确保 REAR 和 RECONCILE 都等待 LEAD。
REAR 首先执行 QBER。RECONCILE 在处理任何比特之前
等待 REAR 的 QBER 结果。
## RAMStore 不可变性
四个 mmap'd 内存块。每个在其 sidecar 完成后密封:
```
alice_raw mprotect(PROT_READ) after FRONT
sifted_key mprotect(PROT_READ) after LEAD
reconciled_key mprotect(PROT_READ) after RECONCILE
final_key mprotect(PROT_READ) after REAR
```
密封后任何线程的写入操作:SIGSEGV。由操作系统强制执行,
而非约定。密封顺序对应阶段顺序,并对应 IFP
边图。这四者必须全部一致,否则其中之一就是错误的。
## ExCLisp 契约表示法
每个函数都记录了三个立场:
```
FRONT: what the caller brings (AS -- approach standpoint)
LEAD: the operation that commits (Pivot -- SHIMMER collapse)
REAR: what lives in the structure (IS -- departure standpoint)
```
契约行编码了映射类型:
```
{{0 [ input (AS/.\IS) output ] 1}} bijective
{{0 [ input (AS/--\WAS) output ] 1}} lossy
{{0 [ input (AS/++\PLUS) output ] 1}} expanding
```
## 构建
```
make clean && make
make asan
make noise
make debug
```
独立命令(可安全复制粘贴,无续行符):
Release:
```
gcc -std=c23 -O3 -march=native -flto -funroll-loops -DNDEBUG -Wall -Wextra -Wpedantic -lpthread bb84_main.c bb84_types.c bb84_sidecar.c bb84_ramstore.c bb84_front.c bb84_lead.c bb84_reconcile.c bb84_rear.c bb84_selftest.c -o bb84
```
ASan:
```
gcc -std=c23 -O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer -Wpedantic -lpthread bb84_main.c bb84_types.c bb84_sidecar.c bb84_ramstore.c bb84_front.c bb84_lead.c bb84_reconcile.c bb84_rear.c bb84_selftest.c -o bb84_asan
```
从构建机外部接收文件后:
```
find . -name '*.c' -o -name '*.h' -o -name 'Makefile' | xargs touch
make clean && make
```
首次运行时,启动时会打印:
```
self-test PASS (5 checks)
```
在任何会话之前,会对已知的数学真理运行五项检查。
如果失败,将停止并输出指定的诊断信息。
## 文件结构
```
bb84_types.h Core types, ee_ratio_t, h(e) table, RAMStore,
GateResult, static_asserts, IFP invariants,
timing block
bb84_types.c ee_ratio helpers, HE_TABLE, he_lookup,
qber_accept, qber_to_enum
bb84_sidecar.h BB84Ctx, barriers, abort_flag, bit-array ops
bb84_sidecar.c ctx_abort, ctx_aborted, rng_u64, rng_bytes,
coin_flip, fisher_yates
bb84_ramstore.h/c mmap slab allocation, mprotect sealing
bb84_front.c FRONT sidecar: quantum channel simulation
bb84_lead.c LEAD sidecar: basis reconciliation
bb84_reconcile.h/c RECONCILE sidecar: Cascade-lite 4-pass
bb84_rear.c REAR sidecar: QBER estimation + PA + confirmation
bb84_selftest.h/c Startup self-test: 5 checks, halts on failure
bb84_main.c Thread launch, CLOCK_MONOTONIC timing, 8-run bench
Makefile
LICENSE
```
## 参考文献
**协议:**
Bennett, C.H. and Brassard, G. "Quantum cryptography: Public key
distribution and coin tossing." Theoretical Computer Science,
vol. 560, pp. 7-11, 2014. (Original: Proc. IEEE ICCSP, 1984.)
arXiv:2003.06557
**纠错:**
Brassard, G. and Salvail, L. "Secret-Key Reconciliation by Public
Discussion." EUROCRYPT 1993, LNCS 765, pp. 410-423.
**安全性证明:**
Shor, P.W. and Preskill, J. "Simple Proof of Security of the BB84
Quantum Key Distribution Protocol." Physical Review Letters,
vol. 85, no. 2, pp. 441-444, 2000. arXiv:quant-ph/0003004
## 许可证
MIT -- 详见 LICENSE。
BB84 协议和 Cascade 纠错是其各自
作者(如上文所述)的知识产权。此 C23
实现是 H. Overman 的原创作品。
ECCN:5D002(公开可用的加密源代码)。
2021 年的 EAR 修正案取消了公开可用的标准
加密源代码的一般通知要求。
此软件实现了已发布的、非专有的协议,
不构成 EAR Part 772 下的非标准加密。
AI 辅助开发。所有正确性验证均由 H. Overman 完成。
标签:BB84协议, 仿真模型, 客户端加密, 密码学, 手动系统调用, 量子密钥分发, 隐私放大