【免费下载链接】SimQN
A network-layer simulator for the quantum network investigation
SimQN 是一款开源的量子网络离散事件仿真器(Python 库),内置了完整的 BB84 量子密钥分发(QKD)协议栈。本教程面向新手,带你用不到 30 行 Python 代码搭建一个可运行的 BB84 量子密钥分发仿真,并对示例代码逐行讲解,帮你快速掌握量子密钥分发网络仿真的核心流程。
一、认识 SimQN:为什么用它做 BB84 仿真
SimQN(Simulator for Quantum Networks)采用离散事件驱动架构,核心模块分为四层:
| 模块 | 作用 | BB84 仿真中对应 |
|---|---|---|
qns.simulator | 离散事件调度核心(Simulator、Event) | 驱动整个协议时间推进 |
qns.entity | 量子节点、量子信道、经典信道、量子存储器 | Alice/Bob 节点与光纤链路 |
qns.models | 量子比特与纠缠的物理模型(量子态、噪声、门) | 四态编码、退相干噪声 |
qns.network | 拓扑生成、路由、协议应用 | BB84SendApp / BB84RecvApp |
对新手最友好的地方在于:BB84 协议已经内置。你不需要自己实现基矢比对、误码估计、CASCADE 纠偏和隐私放大,只要把 BB84SendApp(发送方应用)和 BB84RecvApp(接收方应用)装到节点上,仿真器会自动跑完整个协议。
二、SimQN 安装教程:3 步完成环境搭建
✅方式一:pip 一键安装稳定版(推荐)
pip3 install -U qns依赖非常轻,只需numpy和pandas(见 requirements.txt),Python 3.7 以上即可。
✅方式二:从源码安装开发版
git clone https://gitcode.com/gh_mirrors/sim/SimQN cd SimQN pip3 install setuptools wheel python3 setup.py develop💡 进阶:若追求大规模仿真性能,可用 Cython 编译加速版(python3 setup-cython.py bdist_wheel),详见 docs/source/install.rst 与 setup-cython.py。
三、5 分钟搭建 BB84 量子密钥分发仿真(附代码逐行讲解)
下面这份代码基于官方示例 examples/simple_bb84.py 精简而来,场景为:Alice(n1)与 Bob(n2)之间 10 km 光纤,BB84 以 1000 bps 速率持续 10 秒。
import numpy as np from qns.entity.cchannel.cchannel import ClassicChannel from qns.entity.qchannel.qchannel import QuantumChannel from qns.entity import QNode from qns.simulator.simulator import Simulator from qns.network.protocol.bb84 import BB84SendApp, BB84RecvApp, KEY_BLOCK_SIZE light_speed = 299791458 # 光速 m/s,用于计算链路延迟 def drop_rate(length): # 光纤损耗模型:0.2 dB/km return 1 - np.exp(-length / 50000) length = 10000 # 链路长度 10 km s = Simulator(0, 10, accuracy=10000000000) # 仿真 0~10 秒 n1 = QNode(name="n1") # Alice(密钥发送方) n2 = QNode(name="n2") # Bob(密钥接收方) qlink = QuantumChannel(name="l1", delay=length / light_speed, drop_rate=drop_rate(length)) clink = ClassicChannel(name="c1", delay=length / light_speed) n1.add_cchannel(clink); n2.add_cchannel(clink) n1.add_qchannel(qlink); n2.add_qchannel(qlink) sp = BB84SendApp(n2, qlink, clink, send_rate=1000) # 发送方应用 rp = BB84RecvApp(n1, qlink, clink) # 接收方应用 n1.add_apps(sp) n2.add_apps(rp) n1.install(s) n2.install(s) s.run() print("key blocks:", len(sp.key_pool), len(rp.key_pool))逐行讲解
第 1 步:导入模块
- QuantumChannel:传输量子比特的信道,支持
delay(延迟)和drop_rate(丢失率)两个物理参数; - ClassicChannel:传输经典比特的信道,BB84 的后处理(基矢比对、CASCADE 纠偏等)全靠它;
- Simulator:离散事件调度器,是仿真的"心跳";
BB84SendApp/BB84RecvApp:qns/network/protocol/bb84.py 中封装好的 BB84 协议端点。
第 2 步:信道物理参数
delay=length / light_speed:10 km 光纤的传播时延约 50 μs,严格按光速计算;drop_rate:示例采用 0.2 dB/km 标准单模光纤衰减模型。10 km 处损耗约1 - e^(-0.2) ≈ 18.1%,即每 100 个光子约丢失 18 个——这正是真实 QKD 系统的核心瓶颈;- 四态编码的量子态(0、1、+、−)定义在 qns/models/qubit/const.py。
第 3 步:连接节点与信道
每条信道必须同时add到两端的QNode上,表示物理链路两端各自"插好线"。
第 4 步:挂载 BB84 应用(易错点⚠️)
BB84SendApp(n2, ...)的第一个参数是对端节点(destination),所以发送应用要装到n1上:n1.add_apps(sp);- 同理
BB84RecvApp(n1, ...)装到n2上; send_rate=1000表示每秒发送 1000 个量子比特(即每 1 ms 一个),发送方通过事件链式调度自动持续发送。
第 5 步:安装并运行
n1.install(s)会把节点及其上的应用接入仿真器,并在安装时注入第一个"发送量子比特"事件(见 BB84SendApp.install)。s.run()之后,事件队列驱动整个协议自动运转,无需任何手动循环。
第 6 步:读取最终密钥
key_pool是双方各自的密钥池,每KEY_BLOCK_SIZE(512 bit)位打包成一块,以该密钥块的 MD5 值为键存储。正常情况下两端块数一致,密钥逐位相同。
四、BB84 协议仿真流程详解:从量子比特到最终密钥
运行s.run()后,SimQN 内部按下面五步自动完成完整 QKD 流程(对应 bb84.py 中的 5 种经典数据包):
- 量子比特传输与随机测量:发送方从 0/1/+/- 四态中随机选一个发送(send_qubit);接收方随机选 Z 或 X 基测量,并记录结果。
- 基矢比对(Sifting):双方通过
PACKET_CHECK_BASIS包交换所选基矢,基矢一致的比特保留为原始密钥(约能留下 1/2 的比特)。 - 误码率估计:随机牺牲约 20%(
ratio_for_estimating_error=0.2)的原始密钥比特公开比对,得到 QBER。 - CASCADE 纠偏:双方用"逐次二分"的奇偶校验对话定位并修正错误比特块(
PACKET_CASCADE包),最多迭代max_cascade_round=5轮,块大小每轮翻倍。 - 验证与隐私放大:用 MD5 校验确认纠偏成功(
PACKET_CHECK_ERROR),随后双方用同一个随机Toeplitz 矩阵压缩密钥(PACKET_PRIVACY_AMPLIFICATION),压缩量由泄露比特数bit_leak和安全参数security=0.05决定,最终得到安全密钥。
🔬 物理噪声方面,QubitWithError 采用集体旋转噪声模型:噪声角度随链路长度线性增大(以 50 km 为参考尺度),因此链路越长,估计出的误码率越高、隐私放大压缩越多,最终成码率下降——这与真实光纤 QKD 的规律完全一致,非常适合用来做距离-成码率曲线实验(simple_bb84.py 正是对 1 km~150 km 各跑 10 次取均值)。
五、进阶实战:可信中继 BB84 多节点仿真
想扩展到多节点链路?官方提供了 examples/trusted_relay_bb84.py,用 LineTopology 一键生成线性拓扑,将 100 km 总距离分成 N 段,每段独立运行 BB84,由可信中继转发明文密钥:
LineTopology(num, qchannel_args=..., cchannel_args=...):自动完成建节点、连信道;QuantumNetwork(topo=topo, classic_topo=ClassicTopology.Follow):经典信道跟随量子信道布线。
只需修改num = [2, 3, 4, 5, 6]循环,就能对比不同中继数量下的端到端成码率,非常适合写"中继跳数 vs 成码率"论文图表。
六、常见问题 FAQ
Q1:Simulator(0, 10, accuracy=10000000000)三个参数是什么?0是仿真起始时间,10是结束时间(单位秒),accuracy=10^10是时间精度倒数,即 0.1 ns 的事件分辨率。时间太短会导致成码块数为 0,注意按需调整。
Q2:仿真结果每次运行都不一样?正常。BB84 的编码、测量基和噪声都是随机过程,建议像官方示例一样多次运行取np.mean/np.std。
Q3:如何验证密钥正确性?跑通后检查sp.key_pool与rp.key_pool的键(MD5)是否一一对应;最小可复现用例见 test/protocol/test_bb84.py。
Q4:仿真太慢怎么办?用 Cython 加速版(setup-cython.py)重建,事件调度核心有显著提速;也可缩短仿真时长或降低send_rate。
七、下一步学习路线 🚀
- 跑通官方协议测试:
pytest test/protocol/test_bb84.py - 对比其他协议示例:entanglement_swapping.py(纠缠交换)、classic_packet_forward.py(经典包转发)
- 深入拓扑与路由:qns/network/topology/(ER、BA、网格、Waxman 等生成器)与 qns/network/route/dijkstra.py
- 查阅完整 API:docs/source/qns.rst
至此,你已经掌握了用 SimQN 搭建 BB84 量子密钥分发仿真的全部关键步骤。修改length、send_rate、drop_rate等参数,即可开始你的量子网络性能研究。
【免费下载链接】SimQN
A network-layer simulator for the quantum network investigation
相关推荐
BB84量子密钥分发:在QuantumKatas中实现安全通信的完整指南
量子密钥分发(QKD)是量子计算最具实用价值的技术之一,而BB84协议作为其中最经典的量子密钥分发协议,在保障信息安全方面发挥着关键作用。在QuantumKat
示例工程教程科研如何快速搭建Mohist服务器:面向新手的完整教程
如何快速搭建Mohist服务器:面向新手的完整教程 Mohist是一个功能强大的 Minecraft Forge混合服务器 ,它完美结合了Forge模组支持和S
游戏开发后端如何快速上手XTDrone?无人机仿真完整入门教程
如何快速上手XTDrone?无人机仿真完整入门教程 想要掌握无人机仿真技术却不知从何入手?XTDrone仿真平台正是你需要的解决方案!这个基于PX4飞控、ROS
机器人无人机ROS科研
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考