← 返回博客

量子计算科普系列 · 第 44 篇

量子加密再深入:BB84 线路、E91 纠缠与窃听检测

前情提要:第 33 篇讲过量子密钥分发(QKD)的"大图景"——BB84 靠单光子的偏振、靠"测量会塌缩"让窃听必然留痕;还提到可信中继、量子中继、墨子号卫星,以及"QKD 只守信道不守端点"的降温。但那篇停在思想层面。这一篇,我们把 BB84 的每一道门、每一次随机基测量、窃听者 Eve 造成的误码率都算出来;再顺着它,把纠缠版 QKD(E91)和量子中继真正讲透。建议先回看第 3 篇(纠缠)、第 4 篇(测量破坏)和第 31 篇(抗量子密码)。

第 33 篇留了个没展开的问题:Eve 到底会让误码率涨到多少?涨到多少我们就该" abort(放弃这轮密钥)"?这就是本篇要量出来的数字。

一、BB84 线路级复盘:一张表讲清编码

BB84 里 Alice 有两种基(测量框架):

  • 计算基(Z 基):竖直偏振 = 0,水平偏振 = 1;
  • 对角基(X 基):45° 偏振 = 0,135° 偏振 = 1。

她随机选比特、随机选基发出单光子;Bob 也随机选基测。规则只有一条:基碰巧一致时,Bob 必得 Alice 的原比特;基不一致时,Bob 得到完全随机的结果。

flowchart LR A["Alice: 随机比特 + 随机基 发单光子"] --> B["信道(可能被 Eve 测过)"] B --> C["Bob: 随机选基测量"] C --> D["公开比对基 只留基一致位"] D --> E["抽少量位核对误码率"] E --> F{"误码率异常?"} F -->|否| G["生成密钥"] F -->|是| H["判定被窃听 丢弃"]

为什么"基不一致就随机"?回忆第 4 篇:在 Z 基下态是确定的 0/1,但你用 X 基去测,就像问一个"既 0 又 1"的问题,答案只能是 50/50 的随机。这恰恰是 BB84 安全性的种子。

窃听者 Eve 潜入 BB84 信道,在中间测量并扰动光子偏振态

二、把 BB84 跑起来:有 Eve 和没 Eve,差多少

我们用 numpy 把上面那张表直接仿真(跳过具体的偏振态矢量,直接用"同基必对、异基随机"的测量规则,结果与传统 BB84 一致)。重点看误码率 QBER:

import numpy as np

def bb84(n, with_eve=False, seed=0):
    rng = np.random.default_rng(seed)
    alice_bits = rng.integers(0, 2, n)
    alice_basis = rng.integers(0, 2, n)     # 0=Z 基, 1=X 基
    bob_basis = rng.integers(0, 2, n)

    def measure(bit, send_basis, meas_basis):
        return bit if send_basis == meas_basis else rng.integers(0, 2)

    if not with_eve:
        bob_bits = np.array([measure(alice_bits[i], alice_basis[i], bob_basis[i])
                             for i in range(n)])
    else:
        eve_basis = rng.integers(0, 2, n)
        eve_bits = np.array([measure(alice_bits[i], alice_basis[i], eve_basis[i])
                             for i in range(n)])
        bob_bits = np.array([measure(eve_bits[i], eve_basis[i], bob_basis[i])
                             for i in range(n)])
    sift = alice_basis == bob_basis          # 基一致位才留作密钥
    qber = np.mean(alice_bits[sift] != bob_bits[sift])
    return sift.sum(), round(float(qber), 4)

n = 50000
print("无 Eve  保留比特数 / QBER =", bb84(n, with_eve=False))
print("有 Eve  保留比特数 / QBER =", bb84(n, with_eve=True))

我实跑的输出(固定随机种子,可复现):

无 Eve  保留比特数 / QBER = (25022, 0.0)
有 Eve  保留比特数 / QBER = (25022, 0.2489)

关键数字出来了:没有 Eve 时 QBER≈0;一旦 Eve 做"拦截-重发"(intercept-resend),QBER 立刻跳到约 25%。 这正是第 33 篇说的"窃听必然留下痕迹"的定量版本。

为什么恰好是 25%?拆开算:只有当 Alice 和 Bob 基一致(约一半位)时才会进密钥;在这一半里,Eve 有 1/2 概率选错基——她测错、又按错基重发,Bob 在她错的那一半里约 1/2 概率得到反的。所以 QBER = (1/2 基一致) × (1/2 Eve 错基) × (1/2 翻转) = 1/8?注意这里要条件在"已筛出的密钥位"上:已经限定 Alice=Bob 基一致,其中 Eve 错基占 1/2,这 1/2 里 Bob 错 1/2,所以 QBER = 1/2 × 1/2 = 1/4 = 25%。漏掉"条件化"是初学者最常算错的地方。

三、25% 这个数字意味着什么:该不该 abort?

25% 是"最笨的 Eve"造成的。真实系统还有信道噪声(光纤、探测器暗计数),正常 QBER 也有千分之几到百分之一。于是安全的判据是:

  • 实测 QBER 明显大于 0 但仍在噪声 + 理论允许范围内 → 用"隐私放大"等技术仍能榨出安全密钥;
  • QBER 逼近甚至超过 ~11%(不同协议/攻击模型阈值不同,BB84 经典经验阈约 11%)→ 几乎肯定被主动攻击,必须丢弃。

直观理解:Eve 的拦截-重发把 QBER 顶到 25%,远高于正常噪声。只要 Alice 和 Bob 抽一小撮位公开核对(不泄露全部密钥),一旦发现 QBER 异常,立刻知道信道被蹭——这是物理规律在替你站岗,不是某把锁牢不牢。

对比第 31 篇的抗量子密码:抗量子算法(如格密码)靠"数学难题将来也难"护住密钥;BB84 靠"测量必塌缩"护住密钥。两者护的是同一件事(密钥),但底层信任完全不同。后面第 5 节再收这个尾。

四、E91:不用单光子,用纠缠来分发密钥

BB84 靠"单光子 + 随机基"。E91(Ekert 1991)换了个更优雅的思路:用纠缠对。一个可信源同时向 Alice、Bob 各发一个光子,态是 Bell 对 |Φ+> = (|00>+|11>)/√2。

E91 的妙处在于安全证明直接挂在贝尔不等式上: 1. 源发纠缠对,A、B 各自随机从一组基里挑一个测量; 2. 基一致时,两端结果完美相关(100% 同); 3. 用一部分数据算 CHSH 量 S = E(a0,b0) − E(a0,b1) + E(a1,b0) + E(a1,b1); 4. 任何经典(含任何窃听)理论都给 S ≤ 2;而量子纠缠能跑到 S = 2√2 ≈ 2.83(Tsirelson 界)。只要测到 S 明显 > 2,就证明两端确实存在非经典的纠缠——也就证明没有人在中间用经典手段偷看。

用我们上一篇文章造 Bell 对的同一套门,关联 E(相对角 θ) = cos(2θ)。挑 Alice 基 {0, 45°}、Bob 基 {22.5°, 67.5°},蒙特卡洛跑一下:

import numpy as np

def e91_chsh(trials=60000, seed=3):
    rng = np.random.default_rng(seed)
    a_angles = [0.0, np.pi/4]
    b_angles = [np.pi/8, 3*np.pi/8]
    S = 0.0
    for ai in range(2):
        for bi in range(2):
            d = a_angles[ai] - b_angles[bi]         # 两基相对角
            same = rng.random(trials) < (np.cos(d) ** 2)   # 量子:P(同) = cos^2(d)
            a = rng.integers(0, 2, trials)
            b = np.where(same, a, 1 - a)
            E = np.mean(2 * (a == b) - 1)            # 关联值 ∈ [-1,1]
            sign = 1 if not (ai == 0 and bi == 1) else -1
            S += sign * E
    return S

print("E91 无 Eve  CHSH S =", round(e91_chsh(), 3))   # ≈ 2.828

输出约 2.828——正是量子力学的 Tsirelson 界。而任何窃听者(无论多聪明)只要不破坏纠缠就不可能,破坏了纠缠就必然把 S 拉到经典上界 2 以下。所以 E91 不需要像 BB84 那样"抽位核对误码率"来怀疑 Eve,它用贝尔不等式给了一道更干净的安全判据。

flowchart LR A["可信源发纠缠对 |Phi+> 给 A 和 B"] --> B["A、B 各自随机选基测量"] B --> C["基一致位: 完美相关 成密钥"] C --> D["用部分数据算 CHSH S"] D --> E{"S > 2 ?"} E -->|是| F["存在纠缠 无经典窃听 安全"] E -->|否| G["被窃听/噪声 丢弃"]

五、超距分发的距离难题:可信中继 vs 量子中继

第 33 篇提过,单光子在光纤里每公里衰减,几百公里就所剩无几。两种解法,境界完全不同:

  • 可信中继:把路切成几段,每段单独做 QKD,中间节点像邮差接力转发密钥。缺点——中继节点看到了明文密钥,节点被攻破就白搭。这是妥协,不是真量子网络。
  • 量子中继:利用第 3 篇的纠缠交换——先把纠缠分段分发到相邻节点,再在中间节点做贝尔测量,把纠缠"延伸"到两端。全程不暴露任何密钥比特,只搬动纠缠。这才是真·距离突破,但技术难,还在原型阶段。

卫星 QKD(墨子号)走另一条路:光子在大气层外真空飞,衰减远小于光纤,已演示过千公里级密钥。它本质上是"把中继站搬到天上",避免地面光纤的累积损耗。

flowchart LR A["Alice"] -->|"可信中继(看得到密钥)"| R["中继节点"] R -->|"可信中继"| B["Bob"] C["Alice"] -->|"纠缠交换(看不到密钥)"| Q["量子中继"] Q -->|"纠缠交换"| D["Bob"]

六、和"抗量子密码"怎么摆在一起

讲完 QKD 的两种形态,终于可以和第 31 篇接上头:

  • QKD 解决"密钥怎么安全送到"——靠物理规律,不靠算力。但它只守信道,不守端点(第 33 篇的降温还在):Alice 的电脑被黑,密钥再安全也白搭。
  • 抗量子密码(PQC)解决"算法将来不被量子算破"——靠格等数学难题,保护的是数据本身和端点的长期保密。

它们不是二选一,而是互补的两层:用 QKD 在链路层发密钥,用 PQC 在端点/协议层兜底。一个由物理规律站岗,一个由数学难题兜底。Shor 能破 RSA,但既破不了 QKD 的物理基础,也(在参数选对时)破不了抗量子算法。

七、小结与预告

这一篇把第 33 篇的"大图景"补成了可计算的细节:

  • BB84 线路级仿真:无 Eve 时 QBER≈0,Eve 做拦截-重发时 QBER≈25%——这就是"窃听必留痕"的定量;
  • 安全阈值:QBER 异常(逼近 ~11% 以上)就该丢弃本轮,靠"隐私放大"在噪声内仍能榨出安全密钥;
  • E91 纠缠 QKD:安全挂在贝尔不等式上,无 Eve 时 CHSH S≈2.83(量子上界),任何窃听都把 S 拉到经典界 2 以下;
  • 距离:可信中继"看得到密钥"是妥协,量子中继靠纠缠交换"看不到密钥"才是真突破,卫星走真空通道;
  • 与抗量子密码互补:一个守信道(物理),一个守端点/算法(数学)。

如果今天只记一个画面:BB84 里 Eve 一伸手,误码率就从 0 跳到 25%,像在雪地上踩出一串脚印;E91 里 Eve 一伸手,贝尔不等式的 S 就从 2.83 跌回 2 以下,像把纠缠的"超距默契"搅成了普通巧合。

下一篇,我们把镜头从"密码"拉到"材料":量子比特到底用什么物理系统实现——超导、离子阱、光量子、拓扑——它们各自的脾气和瓶颈,正是前面所有算法能不能跑起来的地基。

下次见。

*(系列前文:第 33 篇 QKD 大图景、第 3 篇纠缠、第 4 篇测量破坏、第 31 篇抗量子密码;算法底层代码见上一篇《用代码看懂量子算法》。本篇 BB84 / E91 仿真均用 numpy 实跑验证。)*