2. BB84 窃听检测:截获-重发攻击下的误码率阈值判定

窃听模型与判定思路

截获-重发(Intercept-Resend)攻击是 BB84 最经典的个体攻击模型:Eve 以概率 p 对每个光子进行截获,随机选择测量基测量后,再按测量结果制备新光子发给 Bob。由于 Eve 的基选择与 Alice 的制备基只有 1/2 概率一致,当 Alice 与 Bob 基一致时,Eve 引入的误码率为 1/4。因此,若 Eve 截获比例为 p,筛选后量子误码率(QBER)的期望值为:

QBER(p) = p × 1/4 = p/4

BB84 在仅考虑单光子源、理想探测的简化模型下,安全阈值通常取 QBER ≤ 11%(对应 p ≈ 44%)。超过阈值说明窃听比例过高,密钥不可用,应中止本次协商。下面用 Python 仿真验证这一关系,并给出判定逻辑。

截获-重发攻击:QBER 与安全阈值判定 窃听比例 p(0 → 1) QBER 0 0.25 0.50 0.75 1.0 0 0.05 0.10 0.15 0.20 阈值 11% QBER = p/4 p≈0.44 安全区:密钥可用 危险区:中止协商 p=0.2 → QBER≈5% p=0.6 → QBER≈15%

仿真实现:不同窃听比例下的 QBER 计算

下面代码完整实现一次 BB84 协商,并在传输环节插入截获-重发模型。关键点:Eve 对每个光子以概率 p 截获,随机选基测量后按结果重发;Bob 正常测量。最后只统计 Alice 与 Bob 基一致的筛选比特,计算 QBER。

import random

def bb84_with_eavesdropping(n_bits=20000, p_eve=0.0, seed=42):
    rng = random.Random(seed)
    alice_bits = [rng.randint(0, 1) for _ in range(n_bits)]
    alice_bases = [rng.randint(0, 1) for _ in range(n_bits)]  # 0:Z, 1:X

    # 传输:Eve 截获-重发
    eve_bits, eve_bases = [], []
    for i in range(n_bits):
        if rng.random() < p_eve:
            # Eve 随机选基测量
            eb = rng.randint(0, 1)
            # 若基一致则测得原比特,否则随机
            measured = alice_bits[i] if eb == alice_bases[i] else rng.randint(0, 1)
            eve_bits.append(measured)
            eve_bases.append(eb)
        else:
            eve_bits.append(alice_bits[i])
            eve_bases.append(alice_bases[i])

    # Bob 随机选基测量
    bob_bases = [rng.randint(0, 1) for _ in range(n_bits)]
    bob_bits = []
    for i in range(n_bits):
        if bob_bases[i] == eve_bases[i]:
            bob_bits.append(eve_bits[i])
        else:
            bob_bits.append(rng.randint(0, 1))

    # 基比对筛选
    sifted_a, sifted_b = [], []
    for i in range(n_bits):
        if alice_bases[i] == bob_bases[i]:
            sifted_a.append(alice_bits[i])
            sifted_b.append(bob_bits[i])

    errors = sum(a != b for a, b in zip(sifted_a, sifted_b))
    qber = errors / len(sifted_a) if sifted_a else 0.0
    return len(sifted_a), qber

THRESHOLD = 0.11
for p in [0.0, 0.1, 0.2, 0.3, 0.44, 0.6, 0.8]:
    n, qber = bb84_with_eavesdropping(p_eve=p)
    verdict = "可用" if qber <= THRESHOLD else "中止"
    print(f"p={p:.2f}  筛选比特={n:5d}  QBER={qber:.4f}  判定={verdict}")

结果判读与阈值比较

运行上述代码(示例种子固定,结果可复现)会得到类似下表的数据。理论值 p/4 与仿真值高度吻合,验证了模型正确性:

窃听比例 p理论 QBER = p/4仿真 QBER(示例)与 11% 阈值比较密钥判定
0.000.000≈0.000低于可用
0.100.025≈0.025低于可用
0.200.050≈0.050低于可用
0.300.075≈0.075低于可用
0.440.110≈0.110临界临界/中止
0.600.150≈0.150高于中止
0.800.200≈0.200高于中止
判定规则:若筛选后 QBER ≤ 11%,认为窃听比例在可容忍范围内,可继续后续的纠错与隐私放大;若 QBER > 11%,说明截获-重发攻击强度过高,本次密钥必须丢弃并重新协商。实际系统中还需考虑探测器暗计数、光源多光子等带来的本底误码,阈值应结合具体参数重新评估。

工程注意点

  • 样本量影响:QBER 是统计量,筛选比特越少,估计波动越大。建议用足够多的比特(如 ≥10⁴)做误码估计,或采用随机抽样估计并给出置信区间。
  • 阈值不是绝对常数:11% 是理想单光子、无本底误码下的理论界。若系统本底误码为 e₀,则判定条件应修正为 QBER ≤ 11% + e₀ 的近似形式,具体需按安全证明重新推导。
  • 攻击模型局限:本仿真只覆盖个体截获-重发攻击。更复杂的集体攻击、相干攻击需要基于诱骗态和更严格的安全分析,不能仅凭 QBER 阈值下结论。