パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

東大の研究者らが新たな量子暗号方式を開発」記事へのコメント

  • リリース文書PDFを読んで、
    科学に明るくない私のような者でも分かるよう
    一生懸命にかみ砕いて書いてくれている心遣いを感じましたが、
    「不確定性を用いて第三者には正しい情報を読み取らせないようにしつつも
    特定の相手にだけ確定的な正しい情報のやりとりができるってのがなんだかすごいんだ」
    ってことまでしか分かりませんでした。
    せっかくかみ砕いてくれたのに、飲み込めなくてゴメンなさい。

    • by Anonymous Coward on 2014年05月27日 1時42分 (#2609200)

      世間一般にアピールしようとするからわかりにくいのかも?
      たとえばC(C++?)プログラマ向け解説にするとこんなかんじになるのだろうか?
      文中の「送信者」はあくまでも光信号の送信者であって、データの送信者は文中の「受信者」であることに注意。
      「送信者」が送ってきたランダムデータを利用して、「受信者」が「送信者」にデータを送ります。

      送信・受信共通ヘッダ:
      enum E_ISOU { E_NEGATIVE=-1, E_POSITIVE=1};
      struct SData{
          E_ISOU isou; // 位相
          float prob; // 確率
      };

      NETWORK g_stream; // 光通信の通信路 受光できるかは運任せ
      NETWORK g_replyStream; // データ番号を送信者へと送る、何かの通信路 どのデータ番号を送るかは受信者が決めれる

      // 送信者コード

      // 微弱な光信号を送信する 送信する位相はランダム 送信した位相はpSendに保存
      void Sender(E_ISOU *pSend, unsigned int size){
          for(unsigned int i=0;isize;i++){
              pSend[i]=(rand()%2)==1 ? E_POSITIVE : E_NEGATIVE;
              SData data; data.isou=pSend[i]; data.prob=(rand()%100000)/100000.0f;
              Push(data, g_stream);
          }
      }

      // 返信されたデータ番号を元に、受信者からのデータを解読する
      void Decoder(E_ISOU *pSend, bool *result, unsigned int size){
          unsigned int pair, delay;
          for(unsigned int i=0;isize;i++){
              PopReply(g_replyStream, &pair, &delay);
              result[i]=(pSend[pair]+pSend[pair+delay]) != 0 ? true : false;
          }
      }

      // 受信者コード

      // 受信した光信号を重ねあわせ、光子を検出できた場合はその番号と位相を保存する
      void Receiver(unsigned int *pPair, bool *pIsou, unsigned int size, unsigned int delay){
          SData data; int result; int count=0;
          for(unsigned int i=0;isize;i++){
              result=AddData(g_stream, i, i+delay); // 受けた光を重ねあわせる 光検出できたらSUCCESSビットが立ち、同位相だったかどうかがSAME_ISOUビットに立つ
              if(result&SUCCESS){
                  pPair[count]=i; pIsou[count]=(result&SAME_ISOU) ? true : false;
                  count++;
              }
          }
      }

      // 送信者に送信したいデータと一致する、保存したデータ番号と位相データの組を探し送信者に知らせる
      void Replyer(bool *pData, unsigned int dataSize, unsigned int *pPair, bool *pIsou, unsigned int pairSize, unsigned int delay){
          for(unsigned int i=0;isize;i++){
              int pair=FindPair(pData[i], pPair, pIsou, pairSize); // pData[i]と同じboolean値となったpPair値を探す
              PushReply(g_replyStream, pair, delay);
          }
      }

      親コメント
      • by Anonymous Coward on 2014年05月27日 1時57分 (#2609201)

        長くなってしまったので分割。
        秘匿化のポイントは、ReceiverにあるAddData関数。
        AddDataがSUCCESSするかどうかはある意味運。Replyerが送信するデータ番号において同位相だったか逆位相だったかは、盗聴者は一定確率でしか知り得ない。
        一方、ReplyerはSUCCESSしたものだけを用いて、確実な手段で送信者にデータ番号を送るためこちらは成功率100%。
        このように、波束の収縮を利用して送信者と受信者が共有でき、盗聴者には一部しか共有できない鍵を送信者が受信者に送ることで秘匿化を実現しています。
        これの強みは、盗聴するには送信者か受信者を直接Crackするしかないこと。通信経路からの完全な盗聴は、物理法則が防いでくれます。

        親コメント
    • by Anonymous Coward

      同じくリリースを読んでみた。
      あまり一般人に分かりやすいようには書けてないと思う。
      つか、最初読んだときはどこに量子効果をつかってるのか
      さっぱり分からなかった。

      しかし素朴な疑問だが、中間者攻撃は防げるのか?

弘法筆を選ばず、アレゲはキーボードを選ぶ -- アレゲ研究家

処理中...