makoto-developer's テックブログ

BB84 は何を根拠に安全なのか —— 盗聴検知を実装して測る

本稿の位置づけ

量子もつれ攻略ノート第3稿で、量子鍵配送の安全性をモノガミー(相関の配分制限)で説明していた箇所を訂正した。モノガミーで直接説明できるのは E91 の側であって、BB84 はもつれを使わないプロトコルだからである。

訂正はしたが、では BB84 は何を根拠に安全なのか。文章で書くだけでは腹に落ちなかったので、実装して測った。結論を先に言うと、根拠は共役な基底での測定が状態を壊すことにあり、盗聴は誤り率として観測に現れる。全面的に盗聴すると誤り率はちょうど 25% になった。


1. BB84 は何をするのか

やりたいのは、盗聴されている回線を使って、盗聴されていない共通鍵を作ることである。矛盾しているようだが、成立する。盗聴を防ぐのではなく、盗聴されたことを検出して、その鍵を捨てるからである。

手順は4段階になる。

  1. Alice が乱数ビットを、2種類の基底からランダムに選んだ方で送る
  2. Bob もランダムに選んだ基底で測る
  3. 使った基底だけを公開の回線で突き合わせ、一致した位置のビットだけ残す(ふるい鍵)
  4. 残ったビットの一部を公開して照合し、誤り率を推定する。高ければ捨てる

基底は2種類ある。直線基底 と、対角基底 である。この2つは共役な関係にあり、片方の基底で確定している状態は、もう片方の基底で測ると 50% ずつのランダムになる。

2. なぜ盗聴すると誤りが出るのか

Eve が途中でビットを盗み見るとする。Eve は Alice の基底を知らないので、自分で当てずっぽうに選んで測り、測った結果を作り直して Bob へ流す(intercept-resend)。

このとき起きることを数えてみる。

  • Eve の基底が Alice と一致する確率は 。このときは状態が壊れず、誤りは出ない
  • 一致しない確率も 。このとき Eve の測定結果はランダムになり、Eve はその誤った状態を作り直して送る

後者の場合、Bob が(Alice と同じ基底で)測ると、 の確率で Alice のビットと食い違う。したがって全体の誤り率は

盗聴が誤りとして現れる。この 25% を実装で確かめるのが本稿の主眼である。

3. 実装

外部ライブラリは使っていない。量子状態を明示的に持つ必要はなく、測定の規則だけ書けば足りる。

def measure(bit, prep_basis, meas_basis, rng):
    """prep_basis で用意した bit を meas_basis で測る。
    基底が一致すれば決定的に bit、違えば 1/2 でランダム。"""
    if prep_basis == meas_basis:
        return bit
    return rng.randint(0, 1)

この4行が量子力学の全てである。基底が合えば決まった値が出て、合わなければコインを投げる。BB84 の安全性はここだけに乗っている。

Eve の盗聴は、測って作り直す操作として書ける。

if eve:
    for i in range(n):
        e_base = rng.randint(0, 1)
        e_bit = measure(a_bits[i], a_base[i], e_base, rng)
        # Eve は測った結果を自分の基底で作り直して転送する
        sent_bits[i], sent_base[i] = e_bit, e_base

Eve が基底を外すと、送り直される状態は Alice が用意したものと別物になる。Eve に悪意がなくても、測っただけで壊れる。

4. ふるい鍵はどれだけ残るか

まず盗聴なしで、基底照合を通過する割合を測った。Alice と Bob が独立にランダムな基底を選ぶので、一致率は になるはずである。

送信 2000 ビット、200 セッションの平均で 0.5004 だった。理論値どおりである。

送信ビットの半分が基底照合で消え、さらに残りの一部を誤り率の推定に使う。実際の内訳は次のようになった。

段階ビット数
送信2,000
ふるい鍵(基底一致)1,031
照合に消費515
最終鍵516

送信の 25.8% が鍵として残る。照合に半分を使う設定なので、この割合は照合の取り方で変わる。

5. 盗聴率と誤り率

Eve が全ビットではなく一部だけを盗む場合も含めて測った。盗聴率を変えながら、誤り率(QBER)と鍵の一致率を見る。

盗聴率QBER 平均最小最大鍵一致率理論値
0.000.00000.00000.00001.000.0000
0.100.02610.01000.04800.000.0250
0.250.06310.03190.09310.000.0625
0.500.12560.08240.16600.000.1250
0.750.18730.13760.24270.000.1875
1.000.24910.18860.30970.000.2500

全面盗聴で 0.2491。予想した 25% が出た。盗聴率に対して線形で、係数は である。

盗聴が全く無いときは QBER がちょうど 0 になる。理想的な回線を仮定しているので当然だが、これは実装の健全性の確認になっている。現実の装置では検出器の暗計数や光路の損失で数パーセントの誤りが常に乗るため、盗聴由来の誤りと装置由来の誤りは区別できない。現実の運用では、観測された誤りをすべて盗聴のせいだと仮定して鍵を圧縮する。

鍵一致率の列も見てほしい。盗聴率 0.10 でも、最終鍵が Alice と Bob で一致した割合は 0 である。少しでも盗聴されると鍵は使い物にならない。誤り率が低いことと、鍵がそのまま使えることは別の話で、実際には誤り訂正の工程が要る。

6. 検知にはどれだけ照合すればよいか

照合するビットが少なければ、運悪く全部一致して盗聴を見逃す可能性がある。全面盗聴(誤り率 25%)を ビットの照合で見逃す確率は になるはずである。

照合ビット数 理論 実測(3000回中)
10(175回)
20(14回)
30(1回)
500回
1000回

理論と実測が合う。50 ビット照合すれば見逃し確率は を下回り、100 ビットで になる。数十ビット公開するだけで、全面盗聴は実質的に検知できる。

7. 薄く盗めば隠れられるのか

Eve が欲を出さず、ごく一部だけ盗めば誤り率は下がる。どこまで薄めれば隠れられるかを測った。

盗聴率QBER照合100ビットで見逃す確率
0.020.0048
0.050.0125
0.100.0258
0.200.0504

盗聴率 2% なら、100 ビット照合しても 62% の確率で見逃される。薄く盗めば隠れられる。

ただしこれは Eve にとって割の良い話ではない。2% しか盗まないなら、得られる情報も 2% である。BB84 の安全性は「盗聴を不可能にする」ことではなく、「得た情報量に比例して痕跡が残る」ことにある。 残った痕跡の分だけ鍵を圧縮(privacy amplification)すれば、Eve が知っている情報を最終鍵から絞り出せる。この工程は本稿では実装していない。

8. モノガミーではない、という点について

第3稿の訂正の中身に戻る。ここまでの実装で、もつれは一度も出てこなかった。使ったのは「共役な基底で測ると壊れる」という一点だけである。Alice が送っているのは単一の量子ビットで、Bob との間に相関を持つ量子状態は存在しない。

E91 は構造が違う。もつれ対を配り、Bell 不等式の破れを確かめる。破れが観測できれば、その相関に第三者が食い込んでいないことが保証される。ここでモノガミー(Aと強く相関した状態は、他と強く相関できない)が効く。

BB84 と E91 は、安全性の根拠が別である。

BB84E91
もつれ使わない使う
直感的な根拠測定による擾乱もつれの配分制限
盗聴の現れ方誤り率の上昇Bell 不等式の破れの減少

ここで正直に付け加えておくべきことがある。BB84 の厳密な安全性証明は、実はもつれを経由する。 Shor と Preskill が 2000 年に与えた証明は、BB84 をもつれ純化プロトコルに帰着させる形を取っている。つまり「BB84 はもつれと無関係」と言い切るのは、プロトコルの直感的な説明としては正しいが、証明の水準では正しくない。

第3稿の訂正が言えているのは、プロトコルの動作と直感的な根拠の水準までである。深いところでは両者は繋がっている。この距離感を測れたことが、実装した収穫だった。

9. 実装して分かったこと

measure 関数が4行で済んだことが、この実験で一番意外だった。量子鍵配送というと状態ベクトルや密度行列を書く必要がある気がしていたが、BB84 の範囲では要らない。測定規則を確率的な分岐として書けば、プロトコルの性質はすべて再現できる。

逆に言えば、BB84 の安全性は量子力学のごく一部の性質しか使っていない。共役基底の存在と、測定が状態を壊すこと。この2つだけである。もつれも、非局所性も、Bell 不等式も要らない。

一方で、実装しなかった部分に難しさが残っている。誤り訂正と privacy amplification である。第5節で見たとおり、盗聴率 0.10 でも鍵は一致しない。実運用では誤りを訂正しつつ、訂正のために公開した情報の分も加味して鍵を圧縮する必要がある。ここが実装の本番で、本稿はその手前で止まっている。

次にやるなら E91 を同じ形で実装し、Bell 不等式の破れが盗聴でどう減るかを測りたい。第2稿で の上限を確かめたので、その値が盗聴によって古典限界の 2 に近づいていく様子が見えるはずである。

10. 再現方法

コードは GitHub に置いてある。

https://github.com/makoto-developer/blog-examples/tree/main/bb84

python3 bb84.py

外部ライブラリは不要である。乱数は seed 固定なので、本文の表と同じ数字が出る。送信 2000 ビット・200 セッションの設定は冒頭の定数で変えられる。

参考文献

  • C. H. Bennett, G. Brassard, Quantum cryptography: Public key distribution and coin tossing, Proc. IEEE Int. Conf. on Computers, Systems and Signal Processing, Bangalore (1984) 175:BB84 の原論文。
  • A. K. Ekert, Phys. Rev. Lett. 67 (1991) 661:もつれベースの E91。
  • P. W. Shor, J. Preskill, Simple proof of security of the BB84 quantum key distribution protocol, Phys. Rev. Lett. 85 (2000) 441:BB84 をもつれ純化に帰着させる安全性証明。
  • V. Scarani et al., The security of practical quantum key distribution, Rev. Mod. Phys. 81 (2009) 1301:装置の不完全性を含む実運用側のレビュー。
  • 量子もつれ攻略ノート第2稿(Tsirelson 限界 )・第3稿(モノガミーと E91)。