平成
21
年度
学士学位論文
量子暗号
B92
シミュレータ
B92 Quantum cryptography simulator
1100348
松本 聡一郎
指導教員
全 卓樹
2010
年
3
月
1
日
要 旨
量子暗号
B92
シミュレータ
松本 聡一郎
要旨 現代社会はインターネットの急速な普及により,とても便利になっている.コンピュータ で自宅から銀行口座に振り込んだり,通信販売を利用する事も可能である.これはひとえに 暗号が個人情報などの秘密情報を他人には読み取れない形にしているからである.一般的に 暗号は第三者が解読するためには長い時間を必要とするよう作られているうえ,技術の進歩 により暗号は更に複雑化している.しかし現代暗号は量子コンピュータが登場した事によ り,現代のコンピュータで解読に数億年単位の時間が掛かる暗号もわずか数日で解読されて しまう可能性があることが判明した.そのため新たな暗号として,量子暗号が注目されてい る.現段階ではBB84という量子暗号が研究機関での主な研究対象となっている.ここでは BB84とE91の発展型とされるB92に注目し研究することとした. 第2章では量子暗号の安全性を証明する原理である“ 不確定性原理 ”と“ 重ね合わせ原 理 ”を解説する.第3章では実際の量子暗号プロトコルであるB92を取り上げて説明する. 第4章では第3章で取り上げた量子暗号プロトコルのシミュレータの詳しい動作を順を追っ て説明する.第5章では理論的共有成功率と,作成したシミュレータプログラムを用いて求 めた実測共有成功率を比較し,観測者の行動如何で共有率に影響が出るかも観測する.ま た,ノイズによってデータが変化する場合も想定してシミュレータプログラムを修正し,実 測データからどの程度ノイズに強いのかも判定する.最終的な結果から,新たに発見した B92の性質も書く. キーワード 量子暗号,電子,秘密鍵,不確定性,重ね合わせ,盗聴,観測,内積, ノイズAbstract
B92 Quantum cryptography simulator
Soichiro MATSUMOTO
English
Nowadays, the public key cryptosystem is widely used to provide security for internet shoppings and bankings. The public key cryptosystem is known to be efficiently de-ciphered by the Shor’s quantum algorithm. A new cryptography has emerged in the shape of the quantum cryptography. In this article, we examine B92 protocol which is one of the quntum cryptography. In chapter 2, we explain the uncertainty principle and superposition principle. In chapter 3, we explain the B92 Quantum cryptography. In chapter 4, we explain the operation of the B92 quantum cryptography simulator. In chapter 5, we examin the statistical properties of B92 protocols.
key words Quantum cryptography, Electron, Secret key, Uncertainty principle, Su-perposition principle, Wiretapping, Observation, Inner product, Noise
目次
第1章 研究背景 1 1.1 量子暗号とは . . . 1 1.2 量子暗号シミュレータの有用性 . . . 1 第2章 量子力学の基礎理論 3 2.1 不確定性原理 . . . 3 電子の位置と運動量 . . . 3 2.2 重ね合わせ原理 . . . 4 第3章 量子暗号プロトコル B92 5 3.1 量子鍵配送プロトコル B92基本原理 . . . 5 3.2 動作 盗聴者無し . . . 6 3.2.1 送信者 . . . 6 3.2.2 受信者 . . . 6 鍵の照合過程 . . . 7 3.3 動作 盗聴者有り . . . 8 3.3.1 送信者 . . . 8 3.3.2 盗聴者 . . . 8 3.3.3 受信者 . . . 9 鍵の照合過程 . . . 10 第4章 シミュレータプログラムの製作 12 4.1 送信者 -電子生成- . . . 13 4.2 盗聴者 -盗聴動作- . . . 13 4.2.1 盗聴者無し. . . 14目次 4.2.2 BB84での盗聴 . . . 15 4.2.3 B92送信者タイプでの盗聴 . . . 15 4.2.4 B92受信者タイプでの盗聴 . . . 15 4.2.5 手動による固定盗聴 . . . 16 4.3 盗聴(観測) . . . 16 4.4 受信者 -ビット値再現- . . . 17 第5章 数値実験結果 20 5.1 盗聴者の動作別数値実験結果 . . . 20 5.2 ノイズ環境下での動作 . . . 21 ノイズの定義 . . . 22 5.2.1 送信者側でのノイズ . . . 22 盗聴者無し. . . 23 盗聴者有り. . . 23 まとめ . . . 23 5.2.2 受信者側でのノイズ . . . 24 盗聴者無し. . . 24 盗聴者有り. . . 25 まとめ . . . 25 第6章 まとめ 26 6.1 研究内容 . . . 26 6.2 結果. . . 26 6.2.1 盗聴者の有無による通信結果の変動 . . . 26 6.2.2 盗聴方法の違いによる通信結果への影響 . . . 26 6.2.3 ノイズ環境下での通信結果とノイズへの耐性 . . . 27 6.3 展望. . . 27
目次 謝辞 28 参考文献 29 付録A 量子暗号B92シミュレータ 30 付録B ノイズシミュレータ 45 付録C 数値実験結果グラフ 49
図目次
4.1 B92概念図. . . 12 4.2 送信用電子の生成過程 . . . 13 4.3 電子スピンの状態対応図 . . . 14 4.4 観測用電子の生成過程 . . . 18 5.1 数値実験結果-盗聴者無し- . . . 20 5.2 数値実験結果-盗聴者有り(B92Alice)- . . . 21 5.3 数値実験結果-盗聴者有り(B92Bob)- . . . 21 5.4 数値実験結果-盗聴者有り(BB84)- . . . 22 5.5 数値実験結果-盗聴者有り(Key,Mode指定)- . . . 22 C.1 送信者側ノイズ-盗聴者無し- . . . 49 C.2 送信者側ノイズ-盗聴者無し- . . . 49 C.3 送信者側ノイズ-盗聴者無し- . . . 50 C.4 送信者側ノイズ-盗聴者無し- . . . 50 C.5 盗聴者有無の結果比較-送信者側ノイズ- . . . 50 C.6 盗聴者有無の結果比較-受信者側ノイズ- . . . 50表目次
3.1 B92における基本情報. . . 5 3.2 送信者動作例 . . . 6 3.3 受信者動作例 . . . 7 3.4 照合動作例 . . . 7 3.5 送信者動作例 . . . 8 3.6 B92送信者タイプ盗聴者動作例(観測用状態の生成) . . . 9 3.7 B92送信者タイプ盗聴者動作例(盗聴) . . . 10 3.8 B92送信者タイプ盗聴者動作例(送信用状態の生成) . . . 10 3.9 受信者動作例 . . . 10 3.10 照合動作例 . . . 11 4.1 B92における基本情報. . . 12 5.1 数値実験結果例(1) -送信者側ノイズ 盗聴者無し- . . . 23 5.2 数値実験結果例(2) -送信者側ノイズ 盗聴者有り- . . . 24 5.3 数値実験結果例(3) -受信者側ノイズ 盗聴者無し- . . . 24 5.4 数値実験結果例(4) -受信者側ノイズ 盗聴者有り- . . . 25第
1
章
研究背景
1.1
量子暗号とは
既存の古典暗号方式の安全性は,NP問題と呼ばれる,現行の計算機が苦手とする“ 素因 数分解の難解さ ”に依存している.これは計算量が膨大なために解読に天文学的時間が掛か り,解読は非現実的ということである.しかし,量子コンピュータの登場により古典暗号は 一瞬にして解読されてしまう可能性が予言された. 量子コンピュータは重ね合わせという量子というミクロな世界で特有の状態を用い,量子 一つ一つに複数の値を保持させることで,現状の計算機とは比較にならないほどの超並列計 算を行うことが可能なのである.そのため,古典的NP問題に依存しない新たな暗号が必要 となった. そこで考え出されたものが量子暗号である.量子暗号は自然な状態で2つ以上の複数の性 質を併せ持つことが出来る特殊な存在である量子を用いて,解読不可能なことが証明された 唯一の暗号である.1.2
量子暗号シミュレータの有用性
このシミュレータの利点は主に3つが挙げられる. 一つ目としては,計算によって盗聴者がいた場合の伝送率などの確率は求められる.しか し,盗聴者のパターンごと,盗聴するごとに計算するのは効率的ではない.盗聴者の観測方 法の多様さに対応するためにはシミュレータがある方が効率的である.二つ目には,このシ1.2 量子暗号シミュレータの有用性
ミュレータには目に見えない量子の動きを再現し“ 直感的に分かりにくい量子の振る舞いを
わかりやすくする ”という,教育的な面での利点がある.三つ目に,理論上のノイズのない
通信の場合から実測に近いノイズのある環境まで,幅広く再現できるために利便性が高い.
第
2
章
量子力学の基礎理論
この章では量子暗号で安全性を保障する理論である不確定性原理と重ね合わせ原理につい て説明する。2.1
不確定性原理
電子の位置と運動量 ヴェルナーカールハイゼンベルクの提唱した不確定性原理の内容は“ ある電子の2つの物 質量の組み合わせは、2値とも同時に正確な物質量を観測で得ることはできない ”というも のである。 ここでは電子の位置と運動量を例として挙げる。電子の位置や運動量を求めるためには、 観測を行って求める必要がある。観測方法としては光子に電磁波を与えて、反射してくる電 磁波を元に観測を行う。まず位置を求めることとする。電子の位置を正確に求めようとする と短周期の強い電磁波を与える必要がある。この強い電磁波を与えると跳ね返ってきた電磁 波によって電子の位置が求められる。しかし、この観測では与えた電磁波によって電子に外 的エネルギーか加えられたことになり、運動量が変化した電子は弾き飛ばされてしまう。こ のため同時に運動量を測定することができない。逆に電子の運動量を求めようと、長波長の 弱い電磁波で電子を弾き飛ばさないように観測する。この場合、電子を弾き飛ばすことなく 観測できるので運動量を測定することができる。しかし長波長の電磁波は電子に正確に当た らないために、電子の位置は曖昧となる。 この位置と運動量の不確定性を数式で表すと式[2.1.0.1]のようになる。2.2 重ね合わせ原理 ∆x∆p≒h (2.1.0.1) この式のデルタは曖昧さを意味し、存在位置xにおいても運動量pにおいても、物質量に は微妙な誤差幅があるという表現である。この∆xと∆p は掛け合わせると必ずプランク定 数hの値よりも大きくなってしまう。存在位置xを正確に求めようとすれば、その分だけ運 動量 pは曖昧になってよく、逆に運動量pを正確に求めようとすれば存在位置xは曖昧に なる。その曖昧さの誤差はプランク定数h程度のものとなる。 このように一方の物理量を厳密に求めようとすればすると、他方の物理量は不確定なもの になってゆくという原理を不確定性原理という。
2.2
重ね合わせ原理
重ね合わせ原理とは、ある量子に2つ以上の状態が存在し、実際に観測してみるまではど の状態であるか確率的にしか求められない場合、その量子は2つ以上の状態が重ね合せの状 態ある。というものである。しかしこれは、複数ある状態のうちのどれかにしか存在しない のではなく、そのいずれにも確率的に存在するという、独特な状態にある。 仮にある量子の状態 Ψ がAという状態とBという状態の重ね合わせ状態にあると仮定す る。するとこの量子の状態は下の式で表すことができる。 |Ψ⟩ = α |ψ⟩a+ β|ψ⟩b (2.2.0.2) |α|2 +|β|2 = 1 (2.2.0.3) この式の|ψ⟩aと|ψ⟩bは量子の状態がそれぞれA,Bである事を指す状態式である。また |Ψ⟩は量子の状態が状態Aと状態Bの重ね合わせ状態であることを指す。第
3
章
量子暗号プロトコル
B92
3.1
量子鍵配送プロトコル
B92
基本原理
この鍵配送方式は量子を通信媒体とし,量子のスピン方向観測時における不確定性を利用 して秘密鍵を共有する方式である.この方式は盗聴者の存在をすぐに察知する事ができる. 量子暗号は共有したい“ 鍵 ”と,鍵を要素にして相手に送信する量子の状態を生成するため の“ 基底 ”の2値を用いる.ランダムに精製した秘密鍵1ビットとそれに対応する基底を量 子に関連付けて量子状態を生成し,それを特別な通信路を用いて飛ばしてその後通常の通信 回線を用いてデータの通信を行う.量子鍵配送BB84では鍵となるビット値と,スピン方向 を決定付ける基底がそれぞれランダムに決定されるのに対し,鍵の値が決定すると同時に必 ずビット値に対応した基底に設定されるのがB92の特徴である.ここでは通信媒体を電子 として例をあげながら解説する. まず前提として,量子力学の世界では送信者をアリス,受信者をボブ,盗聴者をイブとし て表記する風習がある.本論文では後に出てくる状態変数など,一部この風習を取りこんで 書いている.ご理解の上で読んで頂きたい.登場人物 送信者(A;ice), 盗聴者(Eve), 受信者(Bob)
通信媒体量子 単一電子
ビット値 0, 1
スピン方向基底 上下基底(0), 左右基底(1)
3.2 動作 盗聴者無し
3.2
動作 盗聴者無し
3.2.1
送信者
送信者は0か1をランダムに生成した鍵となるビット値の列を持つ.電子1つ値を1つ付 加でき,電子に値を付加するとスピン方向の基底が決まる (基底は縦軸方向か横軸方向の2 種類がある). • 電子に0のビット値を付加する場合,ビット値とおなじ番号の基底0が自動的に選択さ れる.ビット値と基底から電子のスピン方向が決まる. • 電子に1のビット値を付加する場合,ビット値とおなじ番号の基底1が自動的に選択さ れる.ビット値と基底から電子のスピン方向が決まる. 送信者はビット値が付加されスピン方向の定まった電子1つを受信者に向けて送信する. ビット値 1 0 0 1 0 1 1 0 0 0 選択基底 1 0 0 1 0 1 1 0 0 0 スピン方向 ← ↑ ↑ ← ↑ ← ← ↑ ↑ ↑ 表3.2 送信者動作例3.2.2
受信者
受信者はあらかじめ予測したビット値をランダムに生成しておく.送信者が送信してきた 電子を受信し,あらかじめ生成しておいたビット値に対応する基底のスピン方向で測定する. 1. 鍵を予測し,あらかじめランダムにビット値を生成 2. 生成したビット値と相反する値のスピン基底を用いる(1(0),0(1)のように). 3. ビット値と基底から予測したスピン方向で見つかったビット値のみを保存,残りは破棄 する.3.2 動作 盗聴者無し ビット値 1 1 0 0 0 0 1 0 1 1 選択基底 0 0 1 1 1 1 0 1 0 0 スピン方向 ↓ ↓ → → → → ↓ → ↓ ↓ 表3.3 受信者動作例 鍵の照合過程 受信者が予測したスピン方向で見つかった電子の付加情報のみを保存し,残りの情報は破 棄する.破棄された情報には以下の種類がある. • 送信者と同じ基底で観測したため,ビット値が間違っていると判明して捨てられた場合 • 送信者とは別の基底で正しく観測されたが,予測したビット値とは異なるビット値が観 測されて破棄される場合. 実験ではどちらの要因で破棄されたのか区別が付くが,実際に電子を受信した受信者にはど ちらの要因で電子が破棄されたのかは区別がつかない. 最終的に残った部分の基底を古典チャネルを用いて送信者と受信者の間で教えあう. 送信者の選択基底 1 0 0 1 0 1 1 0 0 0 受信者の選択基底 0 0 1 1 1 1 0 1 0 0 送信者の偏光方向 ← ↑ ↑ ← ↑ 受信者の偏光方向 ↓ → → ↓ → 観測結果 1 捨 捨 捨 捨 捨 捨 0 捨 捨 共有された鍵 1 0 表3.4 照合動作例 残ったビット値が共有でき,鍵として通信を行う事が出来るようになる.
3.3 動作 盗聴者有り
3.3
動作 盗聴者有り
3.3.1
送信者
送信者は0か1をランダムに生成した鍵となる値の列を持つ.電子1つ値を1つ付加で き,電子に値を付加するとスピン方向の基底が決まる(基底は縦軸方向か横軸方向の2種類 がある). • 電子に0のビット値を付加する場合,ビット値とおなじ番号の基底0が自動的に選択さ れる.ビット値と基底から電子のスピン方向が決まる. • 電子に1のビット値を付加する場合,ビット値とおなじ番号の基底1が自動的に選択さ れる.ビット値と基底から電子のスピン方向が決まる. 送信者はビット値が付加されスピン方向の定まった電子1つを受信者に向けて送信する. ビット値 1 0 0 1 0 1 1 0 0 0 選択基底 1 0 0 1 0 1 1 0 0 0 スピン方向 ← ↑ ↑ ← ↑ ← ← ↑ ↑ ↑ 表3.5 送信者動作例3.3.2
盗聴者
盗聴者は送信者が受信者に向けて送信した情報を盗むために電子を盗み見る.このときに 以下の制限が掛かる. • 盗聴した事に気づかれないために,盗み見た電子を受信者に向けて送信しなければなら ない. • 観測される前の重ね合わせ状態にある電子は複製が出来ない(複製不可能原理).3.3 動作 盗聴者有り 盗聴者が仮に万能で観測前に電子を複製する事が出来れば,送信者の送信した電子はその まま受信者に届くので盗聴者には都合が良い.しかし,量子力学には複製不可能原理とい う“ 量子(ここでは電子)は複製する事が出来ない ”という決まりがあり,盗聴者は電子を 複製する事は出来ない.つまり盗聴者が送信者の送信した電子を盗聴した瞬間に電子の重ね 合わせの状態は崩れ,スピン方向は一定に決まってしまう.したがって盗聴者は盗聴するに あたって,送信者の送信した電子を観測してビット値を求めた後に再び重ね合わせの状態を 作って受信者へ送信しなくてはならない. ここで問題となるのは,盗聴者は送信者がどの量子暗号方式で鍵を配送しているか解らな いということである.よってイブの盗聴方法として以下のものが挙げられる. • BB84を用いた盗聴を行う. • B92送信者タイプを用いた盗聴を行う. • B92受信者タイプを用いた盗聴を行う. • 手動でビット値と基底を設定して盗聴を行う. ここでは2つ目のB92送信者タイプの盗聴を例に挙げる. ビット値 1 1 0 0 1 1 0 1 1 0 選択基底 1 1 0 0 1 1 0 1 1 0 スピン方向 ← ← ↑ ↑ ← ← ↑ ← ← ↑ 表3.6 B92送信者タイプ盗聴者動作例(観測用状態の生成) 盗聴後,盗聴した事がばれないよう,観測結果から送信用の電子を生成し,受信者へと送 信する.
3.3.3
受信者
受信者はあらかじめ予測したビット値をランダムに生成しておく.盗聴者が盗聴結果を元 に生成した電子を受信し,生成しておいた状態でスピン方向を測定する.3.3 動作 盗聴者有り 送信者の選択基底 1 0 0 1 0 1 1 0 0 0 盗聴者の選択基底 1 1 0 0 1 1 1 1 1 0 送信者のスピン方向 ← ↑ ↑ ← ↑ ← ← ↑ ↑ ↑ 盗聴者のスピン方向 ← ← ↑ ↑ ← ← ← ← ← ↑ 観測結果 1 0 0 0 0 1 1 1 1 0 表3.7 B92送信者タイプ盗聴者動作例(盗聴) 観測結果ビット値 1 0 0 0 0 1 1 1 1 0 選択基底 1 0 0 0 0 1 1 1 1 0 偏光方向 ← ↑ ↑ ↑ ↑ ← ← ← ← ↑ 表3.8 B92送信者タイプ盗聴者動作例(送信用状態の生成) 1. 鍵を予測し,あらかじめランダムにビット値を生成 2. 生成したビット値と相反する値の基底を用いる(1(0),0(1)のように). 3. ビット値と基底から予測したスピン方向で見つかったビット値のみを保存,残りは破棄 する. ビット値 1 1 0 0 0 0 1 0 1 1 選択基底 0 0 1 1 1 1 0 1 0 0 偏光方向 ↓ ↓ → → → → ↓ → ↓ ↓ 表3.9 受信者動作例 鍵の照合過程 受信者が予測したスピン方向で見つかった電子の付加情報を保存し,残りの情報は破棄す る.破棄された情報には以下の種類がある.
3.3 動作 盗聴者有り • 送信者と同じ基底で観測したため,ビット値が間違っていると判明して捨てられた場合 • 送信者とは別の基底で正しく観測されたが,予測したビット値とは異なるビット値が観 測されて破棄される場合. 実験ではどちらの要因で破棄されたのか区別が付くが,実際に電子を受信した受信者にはど ちらの要因で電子が破棄されたのかは区別がつかない. 最終的に残った部分の基底を通常回線を用いて送信者と受信者の間で教えあう. 送信者の選択基底 1 0 0 1 0 1 1 0 0 0 受信者の選択基底 0 0 1 1 1 1 0 1 0 0 送信者の偏光方向 ← ↑ ↑ ← ↑ 受信者の偏光方向 ↓ → → ↓ → 観測結果 ○ 捨 捨 捨 捨 捨 捨 ○ 捨 捨 送信者のビット値 1 0 0 1 0 1 1 0 0 0 盗聴者のビット値 1 0 0 0 0 1 1 1 1 0 受信者のビット値 1 1 0 0 0 0 1 1 1 1 1 × 表3.10 照合動作例 盗聴者がいた場合,×の部分のように基底が不一致である箇所にも関わらず一定確率で送 信者と受信者のビット値に不一致をきたす.通信の途中で鍵を照合する事により盗聴者の存 在を確かめる事が出来る.
第
4
章
シミュレータプログラムの製作
前章で触れたB92のプロトコルのシミュレータを製作した.ここでは制作したプログラ ムの実行結果を挙げて,その伝送率の統計を取って伝送効率を求める.またビット値をkey, 基底をmodeとしてkey(mode)の型として表現する. 登場人物 送信者, 盗聴者, 受信者 ビット値 0, 1 スピン基底 上下基底(0), 左右基底(1) 表4.1 B92における基本情報 図4.1 B92概念図4.1 送信者 -電子生成
-4.1
送信者
-
電子生成
-送信者はまず,送信したいビット値をランダムに決める.プログラムとしては 0 から 0.999999までの疑似乱数を生成する.この疑似乱数を生成するに当たってランダム関数を ランダム回数呼び出すという処理を行い,よりランダム性を高めてある.そして0.5よりも 大きいか小さいかを判定する(X<0.5 か 0.5≦X).0.5よりも小さかった場合は0,大き かった場合は1を選択する. 送信者の場合ビット値と基底の値は同じであると決めてあるので,基底もこの時に決ま り,ビット値と基底の決定により電子のスピン方向も決まる(図4.2). ビット値と基底が決まると電子のスピン方向が決まるが,プログラム上ではこのスピンを 量子の二状態として,スピン方向に対応した値を2つ,変数として保持する(図 4.3).生成 した電子(の状態を表した変数2つ)を受信者に向けて送信する. 図4.2 送信用電子の生成過程
4.2
盗聴者
-
盗聴動作
-盗聴動作については以下のものが挙げられる. • 盗聴が無い場合
4.2 盗聴者 -盗聴動作 -図4.3 電子スピンの状態対応図 • BB84を用いた盗聴を行う場合 • B92送信者タイプを用いた盗聴を行う場合 • B92受信者タイプを用いた盗聴を行う場合 • 手動でビット値と基底を設定して盗聴を行う場合 それぞれの場合について動作を解説する.
4.2.1
盗聴者無し
この場合は盗聴動作が無いので,送信者から送信された電子はそのまま受信者へと到達 する.4.2 盗聴者 -盗聴動作
-4.2.2
BB84
での盗聴
盗聴者は観測用に予測したビット値と基底を,それぞれランダムに生成する.プログラム としては送信者のランダム関数と同じで0から0.999999までの疑似乱数を生成する.この 疑似乱数を生成するに当たってランダム関数をランダム回数呼び出すという処理を行い,よ りランダム性を高めてある.そして0.5よりも大きいか小さいかを判定する(X<0.5か0.5 ≦X).0.5よりも小さかった場合は0,大きかった場合は1を選択する.この動作をビット 値と基底とで計2回行い,観測用の状態を生成する.4.2.3
B92
送信者タイプでの盗聴
盗聴者は観測用に予測したビット値をランダムに生成する.プログラムとしては送信者の ランダム関数と同じで0から0.999999までの疑似乱数を生成する.この疑似乱数を生成す るに当たってランダム関数をランダム回数呼び出すという処理を行い,よりランダム性を高 めてある.そして0.5よりも大きいか小さいかを判定する(X<0.5 か0.5≦X).0.5より も小さかった場合は0,大きかった場合は1を選択するこの動作を1回行い,ビット値と基 底に同じ値を当てはめて観測用の状態を生成する.4.2.4
B92
受信者タイプでの盗聴
盗聴者は観測用に予測したビット値ランダムに生成する.プログラムとしては送信者のラ ンダム関数と同じで0から0.999999までの疑似乱数を生成する.この疑似乱数を生成する に当たってランダム関数をランダム回数呼び出すという処理を行い,よりランダム性を高 めてある.そして0.5よりも大きいか小さいかを判定する(X<0.5 か0.5≦X).0.5より も小さかった場合は0,大きかった場合は1を選択するこの動作を1回行い,ビット値に求 まった値を,基底にはビット値と相反する値を当てはめて観測用の状態を生成する.4.3 盗聴(観測)
4.2.5
手動による固定盗聴
盗聴者は観測用に予測したビット値と基底を,それぞれ手動で入力する.この動作を1回 行い,以降の計算は常に同じビット値と基底を用いて観測用の状態を生成する.4.3
盗聴
(
観測
)
観測で送信者のビット値を予測するには,まず送信者から送信された電子の状態変数と盗 聴者が生成した観測用の状態変数の内積の二乗を計算することで“ 盗聴者が予測したビット 値と送信者のビット値が合っている ”確率を先に求める必要がある.合致する確率x =|(Aj[0] ∗ Ej[0]) + (Aj[1] ∗ Ej[1])|2 (4.3.0.1)
この式に図 4.3の状態変数を当てはめて計算を行う.計算結果は3通りあり,それぞれ以 下の意味がある. • x = 0:盗聴者が予測したビット値が送信者の生成したビット値と同じである確率が0 である.つまり不正解である. • x = 1:盗聴者が予測したビット値が送信者の生成したビット値と同じである確率が1 である.つまり正解である. • x=0.5:盗聴者が予測したビット値が送信者の生成したビット値と同じである確率が0.5 である.つまり半々の確率で正解であり不正解である,重ね合わせの状態にある. 次に,予測したビット値を一定確率で反転(0から1へ,1から0へ変換)させるフリップ 関数を通す.このフリップ関数は盗聴者が予測していたビット値と内積計算結果から求まっ た確率を読み込み,読み込んだ確率に対応する確率でビット値を反転させる. • x = 0:予測ビット値が不正解であるので100%の確率でビット値を反転させて返す. • x = 1:予測ビット値が正解であるのでビット値を反転させないでそのまま返す.
4.4 受信者 -ビット値再現 -• x=0.5:重ね合わせの状態にあるので,ランダム関数を用いて50%の確率でビット値 を反転させて返す. フリップ関数から返ってきた値を盗聴者の盗聴済みビット値として保存する.これで盗聴 は完了である.しかし,このままでは受信者に電子は届いていないので盗聴したことが発覚 する.これを回避するために,盗聴済みビット値から新たに送信用の電子を生成しなくては いけない.盗聴済みビット値と前段階で使った基底を用いて受信者に送信するための電子の 状態変数を図 4.3に対応するように生成する.生成された電子の状態変数は受信者へと送信 される.
4.4
受信者
-
ビット値再現
-受信者は,観測用に予測したビット値をランダムに生成する.プログラムとしては送信者 のランダム関数と同じで0から0.999999までの疑似乱数を生成する.この疑似乱数を生成 するに当たってランダム関数をランダム回数呼び出すという処理を行い,よりランダム性 を高めてある.そして0.5よりも大きいか小さいかを判定する(X<0.5 か 0.5≦X).0.5 よりも小さかった場合は0,大きかった場合は1を選択するこの動作を1回行い,ビット値 に求まった値を,基底にはビット値と相反する値を当てはめて観測用の状態を生成する(図 4.4). 観測用の状態を生成したのち,送信者または盗聴者から送信されてきた電子を受信し,観 測用の状態変数と受信した電子の状態変数の内積を計算する.盗聴者がいなかった場合,送 信者の送信した電子を受信するので,内積計算式は以下のようになる. 確率x =|(Aj[0] ∗ Bj[0]) + (Aj[1] ∗ Bj[1])|2 (4.4.0.2) また,盗聴者がいた場合は盗聴者が送信者のフリをして生成した電子を受信することにな るので,内積計算式は以下のようになる.
4.4 受信者 -ビット値再現 -図4.4 観測用電子の生成過程 確率x =|(Ej[0] ∗ Bj[0]) + (Ej[1] ∗ Bj[1])|2 (4.4.0.3) この内積計算の結果は盗聴者の盗聴の時と同様に3種類あり,意味合いも以下の通りで同 じである. • x = 0:受信者が予測したビット値が送信者の生成したビット値と同じである確率が0 である.つまり不正解である. • x = 1:受信者が予測したビット値が送信者の生成したビット値と同じである確率が1 である.つまり正解である. • x=0.5:受信者が予測したビット値が送信者の生成したビット値と同じである確率が0.5 である.つまり半々の確率で正解であり不正解である,重ね合わせの状態にある. この内積計算結果で求まった確率と予測ビット値をフリップ関数に通す. • x = 0:予測ビット値が不正解であるので100%の確率でビット値を反転させて返す. • x = 1:予測ビット値が正解であるのでビット値を反転させないでそのまま返す. • x=0.5:重ね合わせの状態にあるので,ランダム関数を用いて50%の確率でビット値 を反転させて返す.
4.4 受信者 -ビット値再現 -最終的に送信者と受信者はお互いに基底を連絡しあい,基底の値が不一致である場合のみ を取り出し,ビット値を連絡しあう.その結果鍵が合っていれば盗聴者はおらず,ある確立 で鍵に不一致が見られる場合,盗聴者かノイズが送信者と受信者の間に介入しているという 判断が可能である.この鍵が不一致の場合,伝送率や鍵合致率から,データを乱す存在が盗 聴者なのかノイズなのかを判別できる.この判別については次章にて述べることとする.
第
5
章
数値実験結果
5.1
盗聴者の動作別数値実験結果
***量子暗号シミュレータ*** No,1:B92-盗聴者無し No,2:B92-盗聴者有り(B92Alice方式)→0(0),1(1) No,3:B92-盗聴者有り(B92Bob方式)→0(1),1(0) No,4:B92-盗聴者有り(BB84)→Key(Mode)ランダム No,5:B92-盗聴者有り(Key,Mode指定) Please enter number:No,1****************** No,1 ********************
試行回数:5000000
keyとmode不一致(1250150/5000000)25.003000%
key合致(1250150/5000000)25.003000%
100%合致(1250150/1250150)5000000回試行 100.000000%
No,1 end:1 retry:0
図5.1 数値実験結果-盗聴者無し -B92は送信者と受信者はお互いに相反する状態を取るように設計されているため,内積計 算結果は0か0.5しか出てこず,計算結果で1が出てくることは有り得ないよう設計されて いる.よってビット値が正解していても破棄される場合が50%の確率で発生する.つまり, ビット値が実際に合っている確率が半々で,実際に合っていても破棄される確率が半々であ るため,受信に正解しているビット値は全体の約25%となる.しかし盗聴者がいないため, 受信者が受信した電子に変化が無いので,“ 基底の不一致が確認されたビット値は100%一 致する ”という結果が得られた[図5.1]. しかし盗聴者がいた場合,盗聴動作により本来あり得ないビット値が立ち,受信者が通常 の受信成功とは別に,観測結果から全体の12.5%を受信出来たと処理してしまう.そのた め全体の伝送率が盗聴者がいなかった場合よりも12.5%多い37.5%に収束する. しかし,この本来あり得ないビット値は送信者の送信した電子とは真逆のスピン方向にな るので鍵は確実に不一致になる.よって伝送率は全体の37.5%,鍵合致率は全体の25%に
5.2 ノイズ環境下での動作 ***量子暗号シミュレータ*** No,1:B92-盗聴者無し No,2:B92-盗聴者有り(B92Alice方式)→0(0),1(1) No,3:B92-盗聴者有り(B92Bob方式)→0(1),1(0) No,4:B92-盗聴者有り(BB84)→Key(Mode)ランダム No,5:B92-盗聴者有り(Key,Mode指定) Please enter number:No,2
****************** No,2 ********************
試行回数:5000000
keyとmode不一致(1874907/5000000)37.498138%
key合致(1250178/5000000)25.003559%
100%合致(1250178/1874907)5000000回試行 66.679466%
No,2 end:1 retry:0
図5.2 数値実験結果-盗聴者有り (B92Alice)- ***量子暗号シミュレータ*** No,1:B92-盗聴者無し No,2:B92-盗聴者有り(B92Alice方式)→0(0),1(1) No,3:B92-盗聴者有り(B92Bob方式)→0(1),1(0) No,4:B92-盗聴者有り(BB84)→Key(Mode)ランダム No,5:B92-盗聴者有り(Key,Mode指定) Please enter number:No,3
****************** No,3 ********************
試行回数:5000000
keyとmode不一致(1876738/5000000)37.534760%
key合致(1252139/5000000)25.042780%
100%合致(1252139/1876738)5000000回試行 66.718903%
No,3 end:1 retry:0
図5.3 数値実験結果-盗聴者有り (B92Bob)-収束し,3割の確率で鍵の不一致が起こる.この特徴はどの盗聴方法を用いた場合でも必ず 起こるという点で,B92特有の性質であることがわかった.
5.2
ノイズ環境下での動作
B92のノイズへの耐性を検証する.作成したシミュレータに処理を書き加え,ノイズの強 さを0%から100%まで指定することを可能にした.5.2 ノイズ環境下での動作 ***量子暗号シミュレータ*** No,1:B92-盗聴者無し No,2:B92-盗聴者有り(B92Alice方式)→0(0),1(1) No,3:B92-盗聴者有り(B92Bob方式)→0(1),1(0) No,4:B92-盗聴者有り(BB84)→Key(Mode)ランダム No,5:B92-盗聴者有り(Key,Mode指定) Please enter number:No,4
****************** No,4 ********************
試行回数:500000
keyとmode不一致(187087/500000)37.417400%
key合致(124795/500000)24.959000%
100%合致(124795/187087)500000回試行 66.704262%
No,4 end:1 retry:0
図5.4 数値実験結果-盗聴者有り (BB84)- ***量子暗号シミュレータ*** No,1:B92-盗聴者無し No,2:B92-盗聴者有り(B92Alice方式)→0(0),1(1) No,3:B92-盗聴者有り(B92Bob方式)→0(1),1(0) No,4:B92-盗聴者有り(BB84)→Key(Mode)ランダム No,5:B92-盗聴者有り(Key,Mode指定) Please enter number:No,5
****************** No,5 ******************** 試行回数:5000000 Eve Key:1 Eve Mode:0 keyとmode不一致(1874055/5000000)37.481098% key合致(1247612/5000000)24.952240% 100%合致(1247612/1874055)5000000回試行 66.572861%
No,5 end:1 retry:0
図5.5 数値実験結果-盗聴者有り(Key,Mode指定 )-ノイズの定義 ここでのノイズの定義としては,指定した確立で送信者がランダム生成した鍵,または受 信者が観測して求めた鍵の値が変化する事を指すものとする.
5.2.1
送信者側でのノイズ
送信者側でのノイズは,送信者が送信用に生成した鍵の値が指定した確率で反転し,その 値と規定を用いて電子の状態を作って送信するものと想定した.この想定は通信路上で電子 状態が変わった場合と仮定しなおすこともできる.これは鍵の値の反転が電子の生成前に起5.2 ノイズ環境下での動作 こるか生成後に起こるかの違いであり,通信路上のノイズで電子の状態が変更された場合と 処理が同じであるからである. 盗聴者無し 盗聴者が存在しない場合,ノイズが強くなるにつれて伝送率が上がる.これは本来破棄さ れるはずの電子状態がノイズによって乱され,受信者の観測如何では誤って受信されてしま う.また,この誤受信には鍵の合致しているものと合致していないものが半々で存在する. そのため鍵合致率もノイズが強くなるにつれて伸びてゆく. 具体的な数字で表すと,ノイズ1%ごとに伝送率は全体の約0.5%ずつ伸び,鍵合致率は 0.25%ずつ伸びる. ノイズ 伝達率 鍵合致率 鍵合致率/伝達率 0% 25% 25% 100% 10% 31% 27.80% 90% 20% 34.90% 30.00% 86% 30% 39.90% 32% 79% 40% 44.30% 35.10% 79% 50% 49.60% 38% 76% 表5.1 数値実験結果例(1) -送信者側ノイズ 盗聴者無し -盗聴者有り 盗聴者がいる場合,盗聴者が存在しない場合と同様に,ノイズが強くなるにつれて伝送率 と鍵合致率が上昇する.しかし,この場合は伝送率と鍵合致率の伸び率が違う.伝送率はノ イズ1%につき約0.25%伸び,鍵合致率は約0.14%ずつ伸びる.伝送率と鍵合致率の伸び 率が低いため,前章で述べた“ 鍵の正否の割合が約2:1に収束する ”性質がほぼ維持される という特徴を発見できた. まとめ 送信者側でノイズが発生すると仮定した場合,伝送率は盗聴者の有無に関わらず50%に 収束してゆき,それに反して鍵合致率の差は徐々に開いてゆく.この差異の変動と伝送率や 鍵合致率の伸び率,鍵の成否の割合の不変さなどから,確実に盗聴者の存在を検知できるこ
5.2 ノイズ環境下での動作 ノイズ 伝達率 鍵合致率 鍵合致率/伝達率 0% 37.5% 25% 66.67% 10% 40.35% 26.66% 66.07% 20% 42.71% 27.41% 64.18% 30% 43.83% 27.97% 63.81% 40% 47.93% 29.89% 62.36% 50% 49.89% 31.99% 64.12% 表5.2 数値実験結果例(2) -送信者側ノイズ 盗聴者有り -とが判明した.
5.2.2
受信者側でのノイズ
受信者側でのノイズとは、受信者が観測を行って得られた鍵の値が指定した確率で反転す るものと仮定した。 盗聴者無し 盗聴者が存在しない場合,伝送率は全体の25%から徐々に上昇し,ノイズが50%ある環 境では伝送率は全体の50%に収束する.一方,鍵合致率は25%で一定であることがわかっ た.これは本来破棄されるはずのデータが,ノイズ 1%につき全体の約0.5%の確率で鍵 が入れ替わり,受信者により誤認識されるために起こる.そのため伝送率は約0.5%刻みで 増えてゆく.この誤認識された電子は本来捨てられるはずの電子なため,必ず鍵の値は不一 致である.これにより,誤った電子状態を観測しても鍵合致率は送信した電子全体の約 25 %に収束するという結果が得られた. ノイズ 伝達率 鍵合致率 鍵合致率/伝達率 0% 25% 25% 100% 10% 30% 25% 83.20% 20% 35.30% 25% 73.10% 30% 40.20% 25% 62.30% 40% 44.90% 25% 56.40% 50% 49.70% 25% 50.30% 表5.3 数値実験結果例(3) -受信者側ノイズ 盗聴者無し-5.2 ノイズ環境下での動作 盗聴者有り 盗聴者が存在する場合,伝送率は理論値である25%と上乗せ受信した12.5%の合計であ る37.5%から上昇し,ノイズ50%の環境下では伝送率は50%に収束する.伝送率の伸び 率が盗聴者の存在しない場合の半分である理由は,盗聴者の動作によって電子状態が変化 し,破棄される電子がノイズ1%につき0.25%増えているためだと考えられる.よって伝 送率はノイズ 1%ごとに0.25%刻みで増加することが判明した.一方鍵合致率については 盗聴者が存在しない場合と同様の理由で,ノイズの強弱に関係なく25%で一定であるとい う結果が得られた. ノイズ 伝達率 鍵合致率 鍵合致率/伝達率 0% 37.5% 25% 66.67% 10% 40.33% 25.56% 64.07% 20% 41.51% 24.31% 58.22% 30% 45.35% 25.10% 55.12% 40% 47.63% 25% 52.43% 50% 49.80% 25% 50.20% 表5.4 数値実験結果例(4) -受信者側ノイズ 盗聴者有り -まとめ 送信者側でノイズが起こる場合とは違ってノイズに左右されず,鍵合致率が25%で一定 であることが判明した.この特性には利点と欠点の両方がある.利点としては“ ノイズ環境 下においても,安定した割合で鍵の共有が可能である ”点が挙げられる.欠点としては“ 盗 聴者の検出に鍵合致率の差異を用いることが出来ない ”という点が挙げられる.結果とし て,統計誤差を全体の 2.5%までと仮定した場合,ノイズが 40%発生する環境下までは盗 聴者の検知が可能であることが判明した.
第
6
章
まとめ
6.1
研究内容
C言語にて量子暗号B92のシミュレータを作成した.また,作成したシミュレータを用 いて“ 盗聴者の有無による通信結果の変動 ”“ 盗聴方法の違いによる通信結果への影響 ”“ ノ イズ環境下での通信結果とノイズへの耐性 ”の3項目でB92の統計的性質を調べた.6.2
結果
6.2.1
盗聴者の有無による通信結果の変動
盗聴者が存在する場合,盗聴者が存在しない場合と比べて電子の伝送率は上昇するが鍵合 致率は変化しない.そのため鍵の正答率が伝送した電子の約7割に落ち込む.この結果から 盗聴者の存在を検知できることが判明した.6.2.2
盗聴方法の違いによる通信結果への影響
盗聴方法を以下の4通りと仮定して盗聴した結果,どのような違いが発生するかを検証 した. • 量子暗号BB84を用いて盗聴する方法 • 量子暗号B92の送信者と同じ動作を用いて盗聴する方法 • 量子暗号B92の受信者と同じ動作を用いて盗聴する方法 • 手動で電子状態を入力して盗聴する方法 どの盗聴方法を用いても電子の伝送率の上昇率は 12.5%で一定であることがわかった. このためすべての盗聴方法においても鍵の正答率が伝送した電子の約7割になる.この結果 から,どのような盗聴方法を用いようとも盗聴者の検知が可能であることが判明した.6.3 展望
6.2.3
ノイズ環境下での通信結果とノイズへの耐性
送信者側のコンピュータでノイズが発生すると仮定した場合,ノイズが強くなるにつれて 伝送率は徐々に収束してゆき,盗聴者の存在する場合と存在しない場合の伝送率の差は無く なってゆく.しかし鍵合致率も徐々に上昇し,こちらは盗聴者のいる場合の上昇率が激しく, 鍵正答率の差が開いてゆく.この差を求めることで,盗聴者の存在を確実に検知できること が判明した. 受信者側でノイズが発声すると仮定した場合,全体の伝送率は上昇するが,鍵の合致率は 25%で一定である.このためノイズが強くなっていくにつれて徐々に盗聴者の存在が曖昧 になる.統計誤差が全体の2.5%までなら盗聴者の検出が可能であるとした場合,ノイズが 40%発生する環境までは確実に盗聴者を検知することが可能であることが判明した. こ の 結 果 か ら 総 じ て 量 子 暗 号 B92 は 盗 聴 者 や ノ イ ズ に 強 く,盗 聴 者 の 有 無 の 判 別 や盗聴者かノイズかの判別,ノイズの強さの判定が可能であることが研究により判明した.6.3
展望
盗聴者がいた場合の鍵の正否の割合がほぼ2:1を保つ性質を利用することで,鍵の正否を 古典チャンネルで教えあわなくても盗聴者の検知が可能になるのではないかと考える.これ が実現可能であれば通信コストを抑えることが出来ると考えられる. また,作成したシミュレータを用いて,ヤキール・アハラノフによって提唱された“Weak measurement theory”という,量子の重ねあわせ状態を壊すことなく観測する方法に理論 面からアプローチすることができるのではないかと考える.謝辞
本研究において指導教員および主査としてご指導を承りました、全卓樹教授に心から感謝 致します。 本研究において副査をお引き受けいただいた、情報システム工学科の 福本昌弘教授、浜 村昌則准教授に心から感謝致します。 常日頃から研究活動に於いてご指導いただきました、大学院修士課程長谷部安則氏、岡崎 信也氏、出晴裕子氏に心から感謝致します。 最後になりましたが、共に卒業研究に取り組んだ、片岡秀仁氏、坂本泰之氏、中本衡氏、 吉村涼太氏に感謝します。参考文献
[1] N.Davia Mermin, 木村元 訳 ”量子コンピュータ科学の基礎 -Quantum Computer Sience An Introduction-,” 丸善株式会社, 2009.
[2] 石井茂, ”量子暗号 -絶対に盗聴されない暗号を作る-,”日経BP出版センター, 2007. [3] D.Bouwmeester, A.Ekert, A.Zeilinger 共著, 西野哲朗, 井元信之 監訳, ”量子情報の物
理─量子暗号, 量子テレポーテーション, 量子計算─,” 共立出版株式会社, 2007. [4] 都筑卓司, ”新装版 不確定性原理 運命への挑戦,” pp.1-5
[5] 九州大学大学院理学研究院物理学部門 粒子物理学講座, ”Heisenberg’s Quantum Mechanics (Japanese),” http://www.kutl.kyushu-u.ac.jp/.
付録
A
量子暗号
B92
シミュレータ
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> 注意:このプログラムはコピペするだけでは動作しません。各部動作の説明も消してあります。正常に動くプログラムが欲しい方は高知工科大学の全卓樹教授のホームページをご覧になる か、全卓樹教授へメールでご連絡ください。プログラムの不具合部分の連絡メール等はお断りしています。本文やプログラム等,参照された場合は当論文を参考文献としてご記載下さい。 int c11=0, c12=0, c21=0, c22=0, c31=0, haki1=0,haki2=0, f=0, ct=0; int yomikomikE,yomikomimE,kurikaesi=0; double t1,t2;int flip(float x, int y ,float n){ int i, i2; int kakuritu; if(x == 0){ kakuritu = 1 - y; }else if(x > 0.9){ kakuritu = y; }else{ if(n<0.5){ kakuritu = y; }else{ kakuritu = 1 - y; } } return kakuritu; }
int flip2(float x, int y ,float n){ int i, i2; int kakuritu; if(x == 0){ kakuritu = 1 - y; }else if(x > 0.9){ kakuritu = y; }else{ if(n<0.5){ kakuritu = y; }else{ kakuritu = 1-y; f=1; } } return kakuritu; }
int flip3(float x,int y,float n){ int kakuritu;
float furippuritu = x; float randamusuu = n;
y=1-y; printf("flip"); } return y; } void main(){ /*do{*/
int i, i2, z, zz,c=0,kaisu; float n;
double sqrt(double x); /*int Max = 1000;*/
int k,m,j,rkb,mb,jb, rke, me, je, Hi, r, swich, rd,cf=0,exit=0; float cal1, cal2, cal3, cal4, modP, keyP, hyakuP;
static int flag = 0; static int flag2 = 0; /*表示あり用*/
int keyA[10], keyB[10], keyE[10], suisokuKey[10]; int modeA[10], modeB[10], modeE[10];
float Aj[10][2], Bj[10][2], Ej[10][2], keisan[10]; float keisan2[10], kakuritu[10], kakuritu2[10]; int jyoutaiA[10], jyoutaiB[10], jyoutaiE[10];
/*表示あり用*/ /*表示無し用*/
int keyA2, keyB2, keyE2, suisokuKey2; int modeA2, modeB2, modeE2;
float Aj2[2], Bj2[2], Ej2[2], keisan3, keisan4, kakuritu3, kakuritu4; int jyoutaiA2, jyoutaiB2, jyoutaiE2;
/*表示無し用*/ /*ノイズ用*/ float rf; /*ノイズ用*/ clock_t s,e;
printf("Copyright (C) 2010 Soichiro.M All Rights Reserved.");
printf("***量 子 暗 号 シ ミュレ ー タ***\nNo,1:B92-盗 聴 者 無 し\nNo,2:B92-盗 聴 者 有 り (B92Alice 方 式) → 0(0),1(1)\nNo,3:B92-盗 聴 者 有 り (B92Bob 方 式) →
0(1),1(0)\nNo,4:B92-盗聴者有り (BB84) → Key(Mode) ランダム\nNo,5:B92-盗聴者 有り(Key,Mode指定)\nPlease enter number:No,");
scanf("%d",&swich); switch (swich) { case 1: do{ printf("****************** No,1 ********************\n"); printf("試行回数:"); scanf("%d",&kaisu); s = clock(); do{ if (flag == 0) { srand((unsigned)time(NULL)); flag = 1; } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyA2 = modeA2 = 0; }else if(n >= 0.5){
keyA2 = modeA2 = 1; } k = keyA2; m = modeA2; j=k*10+m; if(j==0){ Aj2[0] = 1; Aj2[1] = 0; }else if(j==1){ Aj2[0] = 1/sqrt(2); Aj2[1] = 1/sqrt(2); }else if(j==10){ Aj2[0] = 0; Aj2[1] = 1; }else{ Aj2[0] = 1/sqrt(2); Aj2[1] = -1/sqrt(2); } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyB2 = 0; modeB2 = 1; }else if(n >= 0.5){ keyB2 = 1; modeB2 =0; } rkb = keyB2; mb = modeB2; jb=rkb*10+mb; jyoutaiB2 = jb; jb = jyoutaiB2; if(jb==0){ Bj2[0] = 1; Bj2[1] = 0; }else if(jb==1){ Bj2[0] = 1/sqrt(2); Bj2[1] = 1/sqrt(2); }else if(jb==10){ Bj2[0] = 0; Bj2[1] = 1; }else{ Bj2[0] = 1/sqrt(2); Bj2[1] = -1/sqrt(2); } keisan3 = (Aj2[0]*Bj2[0])+(Aj2[1]*Bj2[1]); kakuritu3 = keisan3 * keisan3;
if(kakuritu3>0.9){ c12=c12+1; } for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip2(kakuritu3,keyB2,n);
keyB2=zz;
if(modeB2 != keyB2){ c21++;
}
if(modeB2 != keyB2 && keyA2 == keyB2){ c22++; } if(f==1)cf++; c=c+1; }while(c<kaisu); cal1 = c; cal2 = c21; cal3 = c22; modP = ((float)c21/(float)c)*100; keyP = ((float)c22/(float)c)*100; if(modP!=0){ hyakuP = ((float)c22/(float)c21)*100; }else{ hyakuP =0; } e = clock();
printf("key と mode 不 一 致 (%d/%d)%f %\nkey 合 致 (%d/%d)%f %\n100 % 合 致
(%d/%d)%d回試行 %f%\n",c21,c,modP, c22, c, keyP, c22, c21, c, hyakuP); printf("%.2f秒かかりました\n",(double)(e-s)/CLOCKS_PER_SEC);
printf("No,1 end:1 retry:0"); scanf("%d",&z); c21=c22=c=0; haki1=haki2=0; printf("\n"); f=0; }while(z == 0); break; case 2: do{ printf("****************** No,2 ********************\n"); printf("試行回数:"); scanf("%d",&kaisu); do{ if (flag == 0) { srand((unsigned)time(NULL)); flag = 1; } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyA2 = modeA2 = 0; }else if(n >= 0.5){ keyA2 = modeA2 = 1; } for(i=0;i<10;i++){ k = keyA2; m = modeA2; j=k*10+m; jyoutaiA2 = j; }
j = jyoutaiA2; if(j==0){ Aj2[0] = 1; Aj2[1] = 0; }else if(j==1){ Aj2[0] = 1/sqrt(2); Aj2[1] = 1/sqrt(2); }else if(j==10){ Aj2[0] = 0; Aj2[1] = 1; }else{ Aj2[0] = 1/sqrt(2); Aj2[1] = -1/sqrt(2); } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyE2 = 0; modeE2 = 0; }else if(n >= 0.5){ keyE2 = 1; modeE2 = 1; } rke = keyE2; me = modeE2; je=rke*10+me; jyoutaiE2 = je; je = jyoutaiE2; if(je==0){ Ej2[0] = 1; Ej2[1] = 0; }else if(je==1){ Ej2[0] = 1/sqrt(2); Ej2[1] = 1/sqrt(2); }else if(je==10){ Ej2[0] = 0; Ej2[1] = 1; }else{ Ej2[0] = 1/sqrt(2); Ej2[1] = -1/sqrt(2); } keisan3 = (Aj2[0]*Ej2[0])+(Aj2[1]*Ej2[1]); kakuritu4 = keisan3*keisan3; for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip(kakuritu4,keyE2,n); keyE2=zz; rke = keyE2; me = modeE2; je=rke*10+me; jyoutaiE2 = je; je = jyoutaiE2; if(je==0){ Ej2[0] = 1;
Ej2[1] = 0; }else if(je==1){ Ej2[0] = 1/sqrt(2); Ej2[1] = 1/sqrt(2); }else if(je==10){ Ej2[0] = 0; Ej2[1] = 1; }else{ Ej2[0] = 1/sqrt(2); Ej2[1] = -1/sqrt(2); } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyB2 = 0; modeB2 = 1; }else if(n >= 0.5){ keyB2 = 1; modeB2 = 0; } rkb = keyB2; mb = modeB2; jb=rkb*10+mb; jyoutaiB2 = jb; jb=0; jb = jyoutaiB2; if(jb==0){ Bj2[0] = 1; Bj2[1] = 0; }else if(jb==1){ Bj2[0] = 1/sqrt(2); Bj2[1] = 1/sqrt(2); }else if(jb==10){ Bj2[0] = 0; Bj2[1] = 1; }else{ Bj2[0] = 1/sqrt(2); Bj2[1] = -1/sqrt(2); } keisan3 = (Ej2[0]*Bj2[0])+(Ej2[1]*Bj2[1]); kakuritu4 = keisan3*keisan3; /*printf(" %d:[%f] 二乗計算結果:%f\n",i+1,keisan2[i],kakuritu2[i]);*/ for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip(kakuritu4,keyB2,n); keyB2=zz; if(modeB2 != keyB2){ c21++; }
if(modeB2 != keyB2 && keyA2 == keyB2){ c22++;
}
c=c+1; }while(c<kaisu); cal1 = c; cal2 = c21; cal3 = c22; modP = ((float)c21/(float)c)*100; keyP = ((float)c22/(float)c)*100; if(modP!=0){ hyakuP = ((float)c22/(float)c21)*100; }else{ hyakuP =0; }
printf("key と mode 不 一 致 (%d/% d)%f %\nkey 合 致 (%d/%d)%f %\n100 % 合 致
(%d/%d)%d回試行 %f%\n",c21,c,modP, c22, c, keyP, c22, c21, c, hyakuP); printf("No,2 end:1 retry:0");
scanf("%d",&z); c21=c22=c=0; haki1=haki2=0; printf("\n"); f=0; }while(z == 0); break; case 3: do{ printf("****************** No,3 ********************\n"); printf("試行回数:"); scanf("%d",&kaisu); do{ if (flag == 0) { srand((unsigned)time(NULL)); flag = 1; } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0;
/*printf("Making random number[%d]: %f \n", i2, n);*/ } if(n < 0.5){ keyA2 = modeA2 = 0; }else if(n >= 0.5){ keyA2 = modeA2 = 1; } for(i=0;i<10;i++){ k = keyA2; m = modeA2; j=k*10+m; jyoutaiA2 = j; } j = jyoutaiA2; if(j==0){ Aj2[0] = 1; Aj2[1] = 0; }else if(j==1){ Aj2[0] = 1/sqrt(2); Aj2[1] = 1/sqrt(2); }else if(j==10){ Aj2[0] = 0;
Aj2[1] = 1; }else{ Aj2[0] = 1/sqrt(2); Aj2[1] = -1/sqrt(2); } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyE2 = 0; modeE2 = 1; }else if(n >= 0.5){ keyE2 = 1; modeE2 = 0; } rke = keyE2; me = modeE2; je=rke*10+me; jyoutaiE2 = je; je = jyoutaiE2; if(je==0){ Ej2[0] = 1; Ej2[1] = 0; }else if(je==1){ Ej2[0] = 1/sqrt(2); Ej2[1] = 1/sqrt(2); }else if(je==10){ Ej2[0] = 0; Ej2[1] = 1; }else{ Ej2[0] = 1/sqrt(2); Ej2[1] = -1/sqrt(2); } keisan3 = (Aj2[0]*Ej2[0])+(Aj2[1]*Ej2[1]); kakuritu4 = keisan3*keisan3; for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip(kakuritu4,keyE2,n); keyE2=zz; rke = keyE2; me = modeE2; je=rke*10+me; jyoutaiE2 = je; je = jyoutaiE2; if(je==0){ Ej2[0] = 1; Ej2[1] = 0; }else if(je==1){ Ej2[0] = 1/sqrt(2); Ej2[1] = 1/sqrt(2); }else if(je==10){ Ej2[0] = 0; Ej2[1] = 1; }else{ Ej2[0] = 1/sqrt(2);
Ej2[1] = -1/sqrt(2); } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyB2 = 0; modeB2 = 1; }else if(n >= 0.5){ keyB2 = 1; modeB2 = 0; } rkb = keyB2; mb = modeB2; jb=rkb*10+mb; jyoutaiB2 = jb; jb=0; jb = jyoutaiB2; if(jb==0){ Bj2[0] = 1; Bj2[1] = 0; }else if(jb==1){ Bj2[0] = 1/sqrt(2); Bj2[1] = 1/sqrt(2); }else if(jb==10){ Bj2[0] = 0; Bj2[1] = 1; }else{ Bj2[0] = 1/sqrt(2); Bj2[1] = -1/sqrt(2); } keisan3 = (Ej2[0]*Bj2[0])+(Ej2[1]*Bj2[1]); kakuritu4 = keisan3*keisan3; for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip(kakuritu4,keyB2,n); keyB2=zz; if(modeB2 != keyB2){ c21++; }
if(modeB2 != keyB2 && keyA2 == keyB2){ c22++; } if(f==1)cf++; c=c+1; }while(c<kaisu); cal1 = c; cal2 = c21; cal3 = c22; modP = ((float)c21/(float)c)*100; keyP = ((float)c22/(float)c)*100; if(modP!=0){ hyakuP = ((float)c22/(float)c21)*100; }else{ hyakuP =0;
}
printf("key と mode 不 一 致 (%d/%d)%f %\nkey 合 致 (%d/%d)%f %\n100 % 合 致
(%d/%d)%d回試行 %f%\n",c21,c,modP, c22, c, keyP, c22, c21, c, hyakuP); printf("No,3 end:1 retry:0");
scanf("%d",&z); c21=c22=c=0; haki1=haki2=0; printf("\n"); f=0; }while(z == 0); break; case 4: do{ printf("****************** No,4 ********************\n"); printf("試行回数:"); scanf("%d",&kaisu); do{ if (flag == 0) { srand((unsigned)time(NULL)); flag = 1; } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyA2 = modeA2 = 0; }else if(n >= 0.5){ keyA2 = modeA2 = 1; } for(i=0;i<10;i++){ k = keyA2; m = modeA2; j=k*10+m; jyoutaiA2 = j; } j = jyoutaiA2; if(j==0){ Aj2[0] = 1; Aj2[1] = 0; }else if(j==1){ Aj2[0] = 1/sqrt(2); Aj2[1] = 1/sqrt(2); }else if(j==10){ Aj2[0] = 0; Aj2[1] = 1; }else{ Aj2[0] = 1/sqrt(2); Aj2[1] = -1/sqrt(2); } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyE2 = 0; }else if(n >= 0.5){ keyE2 = 1;
} for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ modeE2 = 0; }else if(n >= 0.5){ modeE2 = 1; } rke = keyE2; me = modeE2; je=rke*10+me; jyoutaiE2 = je; je = jyoutaiE2; if(je==0){ Ej2[0] = 1; Ej2[1] = 0; }else if(je==1){ Ej2[0] = 1/sqrt(2); Ej2[1] = 1/sqrt(2); }else if(je==10){ Ej2[0] = 0; Ej2[1] = 1; }else{ Ej2[0] = 1/sqrt(2); Ej2[1] = -1/sqrt(2); } keisan3 = (Aj2[0]*Ej2[0])+(Aj2[1]*Ej2[1]); kakuritu4 = keisan3*keisan3; for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip(kakuritu4,keyE2,n); keyE2=zz; rke = keyE2; me = modeE2; je=rke*10+me; jyoutaiE2 = je; je = jyoutaiE2; if(je==0){ Ej2[0] = 1; Ej2[1] = 0; }else if(je==1){ Ej2[0] = 1/sqrt(2); Ej2[1] = 1/sqrt(2); }else if(je==10){ Ej2[0] = 0; Ej2[1] = 1; }else{ Ej2[0] = 1/sqrt(2); Ej2[1] = -1/sqrt(2); } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){
keyB2 = 0; modeB2 = 1; }else if(n >= 0.5){ keyB2 = 1; modeB2 = 0; } rkb = keyB2; mb = modeB2; jb=rkb*10+mb; jyoutaiB2 = jb; jb=0; jb = jyoutaiB2; if(jb==0){ Bj2[0] = 1; Bj2[1] = 0; }else if(jb==1){ Bj2[0] = 1/sqrt(2); Bj2[1] = 1/sqrt(2); }else if(jb==10){ Bj2[0] = 0; Bj2[1] = 1; }else{ Bj2[0] = 1/sqrt(2); Bj2[1] = -1/sqrt(2); } keisan3 = (Ej2[0]*Bj2[0])+(Ej2[1]*Bj2[1]); kakuritu4 = keisan3*keisan3; for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip(kakuritu4,keyB2,n); keyB2=zz; if(modeB2 != keyB2){ c21++; }
if(modeB2 != keyB2 && keyA2 == keyB2){ c22++; } if(f==1)cf++; c=c+1; }while(c<kaisu); cal1 = c; cal2 = c21; cal3 = c22; modP = ((float)c21/(float)c)*100; keyP = ((float)c22/(float)c)*100; if(modP!=0){ hyakuP = ((float)c22/(float)c21)*100; }else{ hyakuP =0; }
printf("key と mode 不 一 致 (%d/%d)%f %\nkey 合 致 (%d/%d)%f %\n100 % 合 致
(%d/%d)%d回試行 %f%\n",c21,c,modP, c22, c, keyP, c22, c21, c, hyakuP); printf("No,4 end:1 retry:0");
scanf("%d",&z); c21=c22=c=0;
haki1=haki2=0; printf("\n"); f=0; }while(z == 0); break; case 5: do{ printf("****************** No,5 ********************\n"); printf("試行回数:"); scanf("%d",&kaisu); printf("Eve Key:"); scanf("%d",&yomikomikE); printf("Eve Mode:"); scanf("%d",&yomikomimE); do{ keyE2=yomikomikE; modeE2=yomikomimE; if (flag == 0) { srand((unsigned)time(NULL)); flag = 1; } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyA2 = modeA2 = 0; }else if(n >= 0.5){ keyA2 = modeA2 = 1; } for(i=0;i<10;i++){ k = keyA2; m = modeA2; j=k*10+m; jyoutaiA2 = j; } j = jyoutaiA2; if(j==0){ Aj2[0] = 1; Aj2[1] = 0; }else if(j==1){ Aj2[0] = 1/sqrt(2); Aj2[1] = 1/sqrt(2); }else if(j==10){ Aj2[0] = 0; Aj2[1] = 1; }else{ Aj2[0] = 1/sqrt(2); Aj2[1] = -1/sqrt(2); } rke = keyE2; me = modeE2; je=rke*10+me; jyoutaiE2 = je; je = jyoutaiE2; if(je==0){
Ej2[0] = 1; Ej2[1] = 0; }else if(je==1){ Ej2[0] = 1/sqrt(2); Ej2[1] = 1/sqrt(2); }else if(je==10){ Ej2[0] = 0; Ej2[1] = 1; }else{ Ej2[0] = 1/sqrt(2); Ej2[1] = -1/sqrt(2); } keisan3 = (Aj2[0]*Ej2[0])+(Aj2[1]*Ej2[1]); kakuritu4 = keisan3*keisan3; for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip(kakuritu4,keyE2,n); keyE2=zz; rke = keyE2; me = modeE2; je=rke*10+me; jyoutaiE2 = je; je = jyoutaiE2; if(je==0){ Ej2[0] = 1; Ej2[1] = 0; }else if(je==1){ Ej2[0] = 1/sqrt(2); Ej2[1] = 1/sqrt(2); }else if(je==10){ Ej2[0] = 0; Ej2[1] = 1; }else{ Ej2[0] = 1/sqrt(2); Ej2[1] = -1/sqrt(2); } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n < 0.5){ keyB2 = 0; modeB2 = 1; }else if(n >= 0.5){ keyB2 = 1; modeB2 = 0; } rkb = keyB2; mb = modeB2; jb=rkb*10+mb; jyoutaiB2 = jb; jb=0; jb = jyoutaiB2; if(jb==0){ Bj2[0] = 1; Bj2[1] = 0;
}else if(jb==1){ Bj2[0] = 1/sqrt(2); Bj2[1] = 1/sqrt(2); }else if(jb==10){ Bj2[0] = 0; Bj2[1] = 1; }else{ Bj2[0] = 1/sqrt(2); Bj2[1] = -1/sqrt(2); } keisan3 = (Ej2[0]*Bj2[0])+(Ej2[1]*Bj2[1]); kakuritu4 = keisan3*keisan3; for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip(kakuritu4,keyB2,n); keyB2=zz; if(modeB2 != keyB2){ c21++; }
if(modeB2 != keyB2 && keyA2 == keyB2){ c22++; } if(f==1)cf++; c=c+1; }while(c<kaisu); cal1 = c; cal2 = c21; cal3 = c22; modP = ((float)c21/(float)c)*100; keyP = ((float)c22/(float)c)*100; if(modP!=0){ hyakuP = ((float)c22/(float)c21)*100; }else{ hyakuP =0; }
printf("key と mode 不 一 致 (%d/%d)%f %\nkey 合 致 (%d/%d)%f %\n100 % 合 致
(%d/%d)%d回試行 %f%\n",c21,c,modP, c22, c, keyP, c22, c21, c, hyakuP); printf("No,5 end:1 retry:0");
scanf("%d",&z); c21=c22=c=0; haki1=haki2=0; printf("\n"); f=0; }while(z == 0); break; } /*exit=0; printf("Exit OK? y1 n0:"); scanf("%d",&exit); break; }while(exit == 0);*/ }
付録
B
ノイズシミュレータ
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> 注意:このプログラムはコピペするだけでは動作しません。 整形時に途中動作説明等の機能はすべて省いてあります。 正常に動くプログラムが必要な方は、高知工科大学の全卓樹教授のホームページをご覧になるか、全卓樹教授へメールでご連絡ください。 本文やプログラム等,参照される場合は当論文を参考文献としてご記載下さい。 int c11=0, c12=0, c21=0, c22=0, c31=0, haki1=0,haki2=0, f=0, ct=0; int yomikomikE,yomikomimE,kurikaesi=0;int flip(float x, int y ,float n){
int i, i2; int kakuritu; if(x == 0){ kakuritu = 1 - y; }else if(x >0.9){ kakuritu = y; }else{ if(n<0.5){ kakuritu = y; }else{ kakuritu = 1 - y; } } return kakuritu; }
int flip2(float x, int y ,float n){
int i, i2; int kakuritu; if(x == 0) kakuritu = 1 - y; }else if(x > 0.9){ kakuritu = y; }else{ if(n<0.5){ kakuritu = y; }else{ kakuritu = 1-y; f=1; } } return kakuritu; }
int flip3(float x,int y,float n){ if(n <x){ y=1-y; /*printf(”flip”);*/ } return y; } void main(){ /*do{*/
int i, i2, z, zz,c=0,kaisu,basyo;
float n;
double sqrt(double x);
/*int Max = 1000;*/
int k,m,j,rkb,mb,jb, rke, me, je, Hi, r, swich, rd,cf=0,exit=0;
float cal1, cal2, cal3, cal4, modP, keyP, hyakuP;
static int flag = 0;
static int flag2 = 0;
int keyA[10], keyB[10], keyE[10], suisokuKey[10];
int modeA[10], modeB[10], modeE[10];
float Aj[10][2], Bj[10][2], Ej[10][2], keisan[10], keisan2[10], kakuritu[10], kakuritu2[10];
int jyoutaiA[10], jyoutaiB[10], jyoutaiE[10];
int keyA2, keyB2, keyE2, suisokuKey2;
int modeA2, modeB2, modeE2;
float Aj2[2], Bj2[2], Ej2[2], keisan3, keisan4, kakuritu3, kakuritu4;
int jyoutaiA2, jyoutaiB2, jyoutaiE2;
float rf;
printf(”Copyright (C) 2010 Soichiro.M All Rights Reserved.”);
do{ printf(”***** ノイズシミュレータ-盗聴者無し- *****”); printf(”ノイズ発生場所(ノイズ無し→0, 送信者側→1, 受信者側→2):”); scanf(”%d”,&basyo); printf(”試行回数:”); scanf(”%d”,&kaisu); printf(”フリップ確率:”); scanf(”%f”,&rf); do{ if (flag == 0){ srand((unsigned)time(NULL)); flag = 1; } /*n2 = (float)rand() / 32768.0;*/ for(i2=0;i2¡5;i2++){ n = (float)rand() / 32768.0;
/*printf(”Making random number[%d]: %f Yn”, i2, n);*/
} if(n ¡ 0.5){ keyA2 = modeA2 = 0; }else if(n >= 0.5){ keyA2 = modeA2 = 1; }
if(basyo == 1) /*printf(”%f”,n); printf(” %d”,zz);*/ zz=flip3(rf, keyA2, n); /*printf(”→%dYn”,zz);*/ keyA2=zz; } k = keyA2; m = modeA2; j=k*10+m; /*jyoutaiA = j;*/ if(j==0){ Aj2[0] = 1; Aj2[1] = 0; }else if(j==1){ Aj2[0] = 1/sqrt(2); Aj2[1] = 1/sqrt(2); }else if(j==10){ Aj2[0] = 0; Aj2[1] = 1; }else{ Aj2[0] = 1/sqrt(2); Aj2[1] = -1/sqrt(2); } for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; } if(n <0.5){ keyB2 = 0; modeB2 = 1; }else if(n >= 0.5){ keyB2 = 1; modeB2 =0; } rkb = keyB2; mb = modeB2; jb=rkb*10+mb; jyoutaiB2 = jb; jb = jyoutaiB2; if(jb==0){ Bj2[0] = 1; Bj2[1] = 0; }else if(jb==1){ Bj2[0] = 1/sqrt(2); Bj2[1] = 1/sqrt(2); }else if(jb==10){ Bj2[0] = 0; Bj2[1] = 1; }else{ Bj2[0] = 1/sqrt(2);
Bj2[1] = -1/sqrt(2);
}
keisan3 = (Aj2[0]*Bj2[0])+(Aj2[1]*Bj2[1]);
kakuritu3 = keisan3 * keisan3;
if(kakuritu3>0.9){ c12=c12+1; } for(i2=0;i2<10;i2++){ n = (float)rand() / 32768.0; } zz = flip2(kakuritu3,keyB2,n); keyB2=zz; for(i2=0;i2<5;i2++){ n = (float)rand() / 32768.0; }
if(basyo == 2){ zz=flip3(rf, keyB2, n);
keyB2=zz;
}
if(modeB2 != keyB2){
c21++;
}
if(modeB2 != keyB2 && keyA2 == keyB2){
c22++; } if(f==1)cf++; c=c+1; }while(c<kaisu); /*cal1 = c; cal2 = c21; cal3 = c22;*/ modP = ((float)c21/(float)c)*100; keyP = ((float)c22/(float)c)*100; /*hyakuP = ((float)c22/(float)c21)*100;*/ if(modP!=0){ hyakuP = ((float)c22/(float)c21)*100; }else{ hyakuP =0; }
printf(”key とmode不一致(%d/%d)%f %Ynkey合致(%d/%d)%f%Yn100 %合 致(%d/%d)%d回試行 %f%Yn”,c21,c,modP, c22, c, keyP, c22, c21, c, hyakuP);
printf(”No,6 end:1 retry:0”);
scanf(”%d”,&z); c21=c22=c=0; haki1=haki2=0; printf(”Yn”); f=0; }while(z == 0); }
付録
C
数値実験結果グラフ
図C.1 送信者側ノイズ-盗聴者無し
-図C.3 送信者側ノイズ-盗聴者無し
-図C.4 送信者側ノイズ-盗聴者無し