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;
if(randamusuu < furippuritu){
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++;
}
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,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.2 送信者側ノイズ-盗聴者無し