1. 课程导入与仿真目标
BB84是量子密钥分发(QKD)领域最早、也最常被用作教学与工程验证基准的协议。它由Bennett与Brassard于1984年提出,核心思想并不复杂:用单光子的两种共轭基(直角基与对角基)编码随机比特,通过公开信道协商基矢、丢弃不匹配部分,再用抽样比对估计误码率,最终经过纠错与隐私放大得到安全密钥。但“原理简单”不等于“实现简单”。真正把BB84跑通,需要同时处理量子态制备、信道传输、探测响应、经典后处理、窃听建模与安全性评估等多个环节,任何一个环节的假设偏差都会让最终密钥率失真。
本课程的目标不是复述协议公式,而是构建一个端到端可运行、可观测、可调参的BB84完整仿真。因此,在动手写第一行代码之前,必须先明确三件事:BB84在整个QKD技术体系中的位置、本次仿真的边界在哪里、以及最终要交付什么。这三件事决定了后续29节的内容组织方式,也决定了你调试仿真时该看哪些量、该信哪些结论。
BB84在量子密钥分发中的定位
QKD解决的是“如何让通信双方共享一段理论上可证明安全的随机密钥”,它不负责加密数据本身,而是为一次一密或对称加密提供密钥源。在QKD家族中,BB84属于离散变量、制备-测量型、单向协议:发送方Alice随机选择比特与基矢制备量子态,接收方Bob随机选择基矢测量,双方通过经典信道公开比对基矢。与之并列的还有E91(基于纠缠与贝尔不等式)、B92(两态简化版)、诱骗态BB84(抗光子数分离攻击的工程版本)等。理解这一定位很关键:本仿真以理想单光子BB84为骨架,再逐步叠加诱骗态、有限密钥长度、探测器暗计数等工程因素,而不是一上来就做全功能商用QKD系统。
完整仿真的边界:哪些必须做,哪些先不做
“完整仿真”容易被误解为“复刻一台真实QKD设备”。本课程的边界定义是:覆盖BB84从态制备到最终密钥输出的全部逻辑环节,并对每个环节给出可调参数与可观测输出,但物理模型采用教学级近似。具体来说,量子态用理想二维希尔伯特空间表示,信道用比特翻转概率与相位错误概率建模,探测器用暗计数率与探测效率建模,暂不引入脉冲形状、时序抖动、偏振漂移的连续演化等器件级细节。这样做的理由是:这些细节对理解协议逻辑帮助有限,却会显著抬高仿真复杂度,容易让学习者陷入数值细节而看不到协议主干。
需要明确排除的还有真实硬件接口、FPGA实时后处理、以及商用QKD的认证与合规流程。这些属于工程部署范畴,本课程只在必要处提及其对参数的影响,不展开实现。相反,以下内容必须完整实现:随机比特与基矢生成、四种偏振态的编码映射、信道噪声与窃听注入、Bob测量与基矢比对、误码抽样估计、纠错协商的简化模型、隐私放大的压缩计算,以及最终密钥率公式的数值验证。
学习路径与工具链概览
课程按“原理→单环节实现→端到端串联→工程因素→结果分析”推进。前段建立协议与量子态的对应关系,中段逐个实现量子层与经典层模块,后段引入诱骗态、有限密钥效应与窃听策略对比,最后做结果解读与安全性判定。工具链以Python为主:用NumPy做随机数与向量化运算,用Matplotlib出图,用pandas整理实验记录;不依赖量子计算框架,因为BB84的态空间维度极低,手写映射比调用框架更透明、更利于教学。
建议的环境约定如下,后续各节的示例参数均在此约定下给出,属于教学示例而非实测结果:
python >= 3.10
numpy >= 1.24
matplotlib >= 3.7
pandas >= 2.0
# 示例运行参数(教学假设值)
N_QUBIT = 100000 # 发送量子比特总数
P_DARK = 1e-5 # 探测器暗计数率
ETA_DET = 0.1 # 探测效率
E_CHANNEL = 0.02 # 信道固有误码率
在这组假设下,若不做窃听,基矢比对后约保留一半比特,抽样估计的QBER应接近信道固有误码率量级;一旦注入截获-重发窃听,QBER会明显抬升。这个“参数—中间量—结果”的对应关系,就是后续调试仿真时最直接的判断依据:先看基矢比对后的筛后密钥长度是否符合期望比例,再看QBER是否落在合理区间,最后看隐私放大后的密钥率是否为正。三者任一异常,都能反向定位到具体模块。