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协议, 仿真模型, 客户端加密, 密码学, 手动系统调用, 量子密钥分发, 隐私放大