量子暗号通信

BB84 回路

量子鍵配送を量子回路として実装

BB84 プロトコルを量子回路として動かしてみましょう。 今回の回路は、アリス、イブ、ボブそれぞれが操作する量子ビットを表現するために、ワイヤが 3 本あります。 一番上がアリスの量子ビット、真ん中がイブ、三番目がボブの量子ビットを表します。

アリスは暗号鍵の 1 ビット分を表す量子ビットに \(|0\rangle\) または \(|1\rangle\) 状態をセットし、ボブに送ろうとします。 イブはアリスとボブの中間 (真ん中のワイヤ) で量子ビットを横取りし盗聴 した後、アリスになりすまして偽装した量子ビットをボブに送ります。 ボブは受け取った量子ビットにランダムに を適用してから測定します。

ランダムにゲートを適用するために、今回は Qni の新たな機能を使います。

  • の上の文字列は、測定で得られた 0 または 1 を指定した変数にセットすることを表します。たとえば `aliceX` とラベルの付いた が \(|1\rangle\) を測定した場合、変数 `aliceX` の値は 1 となります。
  • の上の文字列は変数名を意味し、変数の値が 1 だった時のみゲートを適用することを意味します。 たとえば `aliceX` とラベルの付いた は、同じく `aliceX` とラベルの付いた の測定結果が \(|1\rangle\) だった時のみ適用されます。

以上を頭に入れて、BB84 回路の動作をひとつひとつ確認していきましょう。

アリス

アリスはまず、盗聴を検出するための仕掛けを施した量子ビット \(|0\rangle\) または \(|1\rangle\) を作るためのランダム値を 2 つ作ります。 最初に、状態 \(|0\rangle\) または \(|1\rangle\) を決めるため、量子乱数ジェネレータMEASUREMENT 命令を参照で 0 または 1 を作り、変数 aliceX にセットします。同様に、 を適用する/しないをランダムに決めるための変数 aliceH をもう一つの量子乱数ジェネレータでセットします。

次に、このランダムな値 0 または 1 を持つ 2 つの変数 aliceXaliceH を使って、暗号鍵の 1 ビット分を作ります。 \(|0\rangle\) に初期化した量子ビットに対して、aliceX == 1 の場合だけ を適用します。 これによって、アリスの量子ビットはランダムに \(|0\rangle\) または \(|1\rangle\) の状態を持ちます。 同様に、ランダムな変数 aliceH の値が 1 だった場合に を適用します。 できあがった量子ビットを (イブにすぐ横取りされてしまうものの) ボブへと送ります。

アリスが送信する量子ビットの状態は、左から 2 つめのブロッホ球で確認できます。 「\(|0\rangle\) または \(|1\rangle\)」の 2 通りと、「 を適用する/しない」の 2 通りがあるので、計 \(2 \times 2 = 4\) 通りの状態を取りうることを確認してください。

イブ

イブは横取りした量子ビットを盗聴し、ボブへ偽装した量子ビットを送ります。 しかしイブはクローン禁止定理CLONE 命令!?を参照によりアリスの量子ビットを複製できないため、測定して量子ビット状態を壊す以外に量子ビットの状態を推定することはできません。 さらにアリスが \(|0\rangle\) と \(|1\rangle\) のどちらを送ったのか、さらに を適用したかどうかが測定結果からは分からないため、測定結果は 1/2 の確率でしか当たりません。 また横取りによってボブに量子ビットが届かないと盗聴行為がすぐにバレてしまうため、測定結果と同じビットを で作ってボブへと送ります。

イブが送信する量子ビットの状態は、左から 3 つめのブロッホ球で確認できます。アリスが送る量子ビットの状態は 4 通りなので、およそ 3/4 の確率でアリスの送った状態と異なる量子ビットをボブに送ることになります。

ボブ

ボブは BB84 プロトコルに従ってランダムに を適用し、アリスからの量子ビットを測定します。 そして を適用した/しないがアリスと一致する量子ビットのうち、半分の測定結果を突き合わせ、等しいかどうかを確認します。 このとき、イブが盗聴した影響でその約半分に不一致が置こるため、イブの盗聴が判明します。