news 2026/10/15 9:55:09

如何用SimQN搭建BB84量子密钥分发仿真:面向新手的完整入门教程(附代码逐行讲解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用SimQN搭建BB84量子密钥分发仿真:面向新手的完整入门教程(附代码逐行讲解)

【免费下载链接】SimQN

A network-layer simulator for the quantum network investigation

项目地址:https://gitcode.com/gh_mirrors/sim/SimQN
点击查看免费下载

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 种经典数据包):

  1. 量子比特传输与随机测量:发送方从 0/1/+/- 四态中随机选一个发送(send_qubit);接收方随机选 Z 或 X 基测量,并记录结果。
  2. 基矢比对(Sifting):双方通过PACKET_CHECK_BASIS包交换所选基矢,基矢一致的比特保留为原始密钥(约能留下 1/2 的比特)。
  3. 误码率估计:随机牺牲约 20%(ratio_for_estimating_error=0.2)的原始密钥比特公开比对,得到 QBER。
  4. CASCADE 纠偏:双方用"逐次二分"的奇偶校验对话定位并修正错误比特块(PACKET_CASCADE包),最多迭代max_cascade_round=5轮,块大小每轮翻倍。
  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

项目地址:https://gitcode.com/gh_mirrors/sim/SimQN
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 9:55:07

算法概览图:比动画更关键的思维建模工具

1. 为什么一张“总体概览图”比十段代码更难画出来?你有没有过这种经历:花三天写完一个排序算法的可视化,动画跑得丝滑,颜色配得专业,连过渡曲线都调成了缓入缓出——结果导师扫了一眼,问:“这个…

作者头像 李华
网站建设 2026/10/15 9:54:31

解决JavaCPP集成FFmpeg的UnsatifiedLinkError问题

1. 问题现象与背景分析最近在Java项目中集成FFmpeg处理视频时,遇到了一个棘手的运行时错误:java.lang.UnsatisfiedLinkError: org.bytedeco.ffmpeg.global.avutil.AV_PIX_FMT_GBRAP14()I这个错误通常发生在使用JavaCPP和FFmpeg绑定时,系统无法…

作者头像 李华
网站建设 2026/10/15 9:54:08

职场高情商拒绝技巧:6大方法维护工作关系

1. 职场沟通中的拒绝艺术在职场中,我们每天都要面对各种请求和任务分配。有些来自上级,有些来自平级同事,还有些可能来自下属。作为职场人,我们常常陷入两难境地:既不想给人留下不合作的印象,又确实无法承担…

作者头像 李华
网站建设 2026/10/15 9:53:55

ARM嵌入式室内人群检测与人流统计驱动开发实战

1. 项目缘起与整体设计思路室内人群检测和人流进出统计,听起来像是商场、写字楼才用得上的东西,但实际上,只要你在做智能家居、小型办公空间管理,甚至只是想统计一下自家店铺每天进出了多少人,这套东西就非常实用。我这…

作者头像 李华
网站建设 2026/10/15 9:53:22

程序员转型项目管理的核心能力与实战指南

1. 程序员转型项目管理的必要性十年前我刚入行时,以为写好代码就是程序员的全部。直到负责第一个跨部门项目,才深刻体会到技术能力只是基础。那次项目延期两个月,团队加班到凌晨成为常态,最终交付质量也不尽如人意。这段经历让我明…

作者头像 李华