Eveが知らないうちにBobと番号を確認する方法は?


49

友人のボブが正しい電話番号を持っていることを確認する必要がありますが、直接尋ねることはできません。質問をカードに書いて、イブに渡さなければなりません。イブはそのカードをボブに持って行き、答えをあなたに返します。イブがあなたの電話番号を読み取れないように、ボブがメッセージをエンコードできるようにするには、質問に加えて、カードに何を書く必要がありますか?

注:この質問は、「Googleインタビューの質問」のリストにあります。その結果、ウェブ上にはこの質問のバージョンがたくさんあり、それらの多くは明確な、あるいは正解すらありません。

注2:この質問に対するひそかな答えは、ボブが「私に電話してください」と書くべきだということです。はい、それは非常に賢く、「箱の外」とすべてですが、私たちのヒーローを「ボブ」と彼の盗聴敵「イブ」と呼ぶCSの分野のテクニックを使用しません。

更新:
あなたとボブの両方が手作業で合理的に完了できるアルゴリズムのボーナスポイント。

更新2:
ボブは任意のメッセージを送信する必要はありませんが、イブがそれをデコードすることなく正しい電話番号を持っていることを確認するだけであることに注意してください。


1
しかし、「私に電話してください」というのはまったく意味がありません。彼はまだあなたの正しい電話番号を持っていないか、少なくとも彼が持っているかどうかわからないので、私はそれが非常に賢いとは思いません。
ジジリ

1
@Gigiliはあなたが彼から電話を受けたら、彼はあなたの番号を持っています。あなたが電話を受けなければ、彼は電話しません。
ジョー

1
ああ、そう。まだ賢くないと思います!
ジギリ

別の舌の答えはシーザー暗号かもしれません。Eveがすべての可能なオフセットを試行しても、彼女は1つの数字列を別の数字列よりも選択する理由はありません(それらすべてを呼び出そうとするのではありません)。
ラファエル

2
@Raphael数字で可能なシーザー暗号は10個しかないのですか?
ジョー

回答:


27

まず、イブは受動的であると仮定しなければなりません。これにより、私は彼女がカードを正直にボブに送り、彼女がアリスに持ち帰ったものはすべてボブの応答であるということです。Eveが片方向または両方向にデータを変更できる場合(そして彼女のアクションが検出されないままである場合)、何でも起こります。

(長年の伝統を尊重するために、会話に関係する2つの正直なパーティーはアリスとボブと呼ばれます。あなたのテキストでは、あなたは「あなた」と言いました。私の本当の名前は「アリス」ではなく、そのAliceが Bobの電話番号を確認したいと考えています。)

単純な(しかし弱い)答えは、ハッシュ関数を使用することです。アリスはカードに「あなたの電話番号のSHA-256ハッシュを返して」と書いています。SHA-256は、ハッシュ関数に関する限り、安全であると考えられている暗号化ハッシュ関数です。手作業で計算するのは面倒ですが、それでも実行可能です(約2500個の32ビット操作で、各操作は加算、ワードシフトまたは回転、ビット単位のビットの組み合わせです。ボブは1日でそれを実行できるはずです。そう)。

今、それについて何が弱いのですか?暗号化ハッシュ関数であるSHA-256は「プリイメージ」に耐性があります。これは、ハッシュ出力が与えられると、対応する入力を復元することが非常に難しいことを意味します(Eveが直面する問題です)。ただし、「非常に難しい」とは、「最も簡単な方法はブルートフォース:一致するものが見つかるまで可能な入力を試みること」を意味します。ここで問題となるのは、総当たり攻撃が簡単だということです。可能な電話番号はそれほど多くありません(北米では10桁、つまり100億です)。ボブは手で物事をやりたいと思っていますが、イブが非常に限られていると仮定することはできません。基本的なPCは1秒あたり数百万のSHA-256ハッシュを試すことができるため、Eveは1時間未満で完了します(GPUを使用している場合は5分未満です)。

これは一般的な問題です。ボブが決定論的である場合(つまり、アリスからの特定のメッセージに対して、彼は常に同じ応答を返します)、イブは彼をシミュレートできます。つまり、イブは電話番号を除くボブについてのすべてを知っているので、彼女は仮想的に100億のボブを経営しています。そして、実際のボブが実際に返したものを仮想ボブのいずれかが返すのを待ちます。この欠陥は、ランダムなナンスと対称暗号化およびwhatsnotを含む多くの種類の「スマート」ソリューションに影響します。これは強力な欠陥であり、その根本はイブとボブの計算能力の大きな違いにあります(ボブにイブと同じくらい大きなコンピューターがあれば、彼は遅い多くの反復の使用によるハッシュ関数。それは多かれ少なかれ、パスワードのハッシュとは何か、パスワードの代わりに電話番号; bcrypt とこの回答もご覧ください)。

したがって、非弱解に、ボブの一部にランダム性が含まれる必要あります。ボブは、コインを投げたり、サイコロを繰り返し投げたり、計算に値を注入する必要があります。さらに、イブはボブがしたことを解くことができてはなりませんが、アリスはできる必要があるため、一部の情報はボブからアリスに内密に伝えられます。これは、非対称暗号化、または少なくとも非対称キー合意と呼ばれます。そのクラスの最も簡単な計算アルゴリズムですが、それでもかなり安全ですが、PKCS#1 v1.5 paddingを使用したRSAです。RSAは、公開指数としてを使用できます。したがって、プロトコルは次のようになります。e=3

  • アリスは、大きな整数生成場合及びサイズように、同様のサイズの素数整数、であり(2012のように、すなわち、少なくとも1024ビット)セキュリティを確保するのに十分であるが。また、アリスは手配しなければならないとない 3の倍数であることを。p q n p 1 q 1n=pqpqnp1q1

  • アリスはカードにを書き込みます。n

  • ボブ第パッド長いほどバイトシーケンスに彼の電話番号、(PKCS#1により、この手段記載されているように:00 02 XX XX ... XX 00 BB BB .. BB、BB「」は10バイトであるエンコードを電話番号、および「xx」はランダムなゼロ以外のバイト値であり、が1024ビット整数の場合、合計長は128バイトです。nnn

  • ボブは、バイトシーケンスをビッグ整数値(ビッグエンディアンエンコーディング)として解釈し、を計算します(したがって、非常に大きな整数と除算の乗算が行われ、結果は部門の残り)。それはまだ手作業で実行できます(しかし、再び、おそらく1日の大部分を占めるでしょう)。結果は、ボブがアリスに送り返すものです。m 3 m o d nmm3 mod n

  • アリスはと知識を使用して、ボブから送信されたからを復元します。RSAのウィキペディアのページには、そのプロセスに関するある程度明確な説明があります。アリスが取得したら、パディングを削除できます(「xx」はゼロではないため、最初の「bb」バイトを明確に見つけることができます)。その後、彼女は電話番号を取得し、それを自分の持っている電話番号と比較できます。q m m 3 m o d n mpqmm3 mod nm

コンピュータが必要になりますアリスの計算は、(コンピュータが何をするかで必ず手で小学校となんとかが、「なんとか」は、実際に行うにはあまりにも多くの時間がかかる場合がありますので、コンピュータは、それに速い悪魔であり、RSAの暗号解読手では多くを取ります週間)。

(実際、McEliece暗号化を使用することで手作業での計算を高速化できますが、公開キー(アリスがカードに書き込んだもの)は巨大になり、カードはまったくしません。イブは完全な本を運ぶ必要があります桁)


1
簡単なコメントですが、最初のプロトコルのもう1つの弱点(アリスは「電話番号のハッシュを送信する」)は、リプレイ攻撃に対して脆弱であることです。現実の世界でこれを実装していた場合、アリスはランダムな文字列(「nonce」と呼ばれる)を送信する必要があります。この文字列は電話番号とともにハッシュされます。
仮名14

1
イブがメッセージを修正できれば「何でもできる」と言ったが、これは必ずしも失われた原因ではない。RSAを使用すると、実際にMITM攻撃からメッセージを保護することもできます。「電話番号はありますか?」、公開鍵、および秘密鍵で署名された署名(メッセージ+電話番号)を送信します。Eveがメッセージを変更(公開鍵を自分のものに変更)しようとすると、Eveはあなたの電話番号を知らないため、有効な署名を生成できません。
stevendesu

15

RSAのような公開鍵暗号システムの古典的なアプリケーションのように見えます。

公開鍵を一緒に送信すると、BoBは連絡先リストの電話番号を暗号化し、それを送り返します。


5
ボブとイブを考えると、それがおそらく重要なアイデアになるはずです。この文脈(鉛筆と紙)で実用的ですか?また、「この記事は編集が必要です」というフラグが付いたウィキペディアの記事へのリンク以上のものを望んでいました。
ジョー

@ジョー:別のリンクを含めるように編集しました。RSAについて聞いたことがあると思います。RSAはおそらく実用的です。1000桁の数字を書くのにそれほど時間はかからないと書かれているからです。
アルヤバタ

14

最も基本的なことの1つは、Diffie-Hellman鍵交換です。通信を開始する前にキーを設定する必要はありません。リスナーがキーを取得できない方法でキーをネゴシエートするためです。詳細については、包括的なウィキペディアの記事を参照してください。

Bob DHパラメーターおよび(は適切な大きな素数、は通常小さな数)と公開キー送信します。ここでは大きな秘密の数字です(それはあなたの秘密鍵です)、およびボブが以下を送り返すための指示:g p g g a m o d p apgpggamodpa

  • 彼の公開鍵、ここでは彼が選んだ大きな秘密の数字です。bgbmodpb
  • 彼が信じているのは、共有秘密から派生したキーで対称暗号化アルゴリズムを使用して暗号化されたあなたの電話番号です。gabmodp

Eveはおよび見ることができますが、実質的に計算できません。g b m o d p g agamodpgbmodpgabmodp

適切に実装され、通信者と攻撃者の両方が自由に使えるほぼ同じ計算能力を持っている限り、これは安全です。


2

ボブは、復号化できるメッセージを送信する必要はありません。彼はあなたに電話番号があることを証明するだけです。したがって、Cryptographic Hash Functions(一方向暗号化)は、公開キー暗号システムの代替手段を提供します。SHA-2は現在、このような関数の一般的な例です。

この戦略では、ボブのメッセージを解読する必要はありません。たとえば、「ボブ、SHA-2を使用して電話番号を暗号化し、イブに結果を返してください」など、使用するハッシュ関数をボブに伝えます。次に、同じアルゴリズムを使用して電話番号をハッシュし、ボブが取得したものと同じハッシュを取得するかどうかを確認します。2つの異なる電話番号が同じハッシュになることはほとんどないため、ボブが正しい電話番号を持っているかどうかを判断できます。

ボブとイブにハッシュ関数を計算する(またはブルートフォース攻撃を実行する)コンピューターがない場合、ブルートフォース攻撃に対するセキュリティをいくらか犠牲にするが、あなたとボブにとってははるかに簡単なハッシュ関数を使用できる可能性があります計算する。


私は同じ答えを書いていました!不運。とにかく時間を費やして投稿します。
ジギリ

@Gigili誰かがこの答えを書き上げることを望んでいましたが、私はまだ誰もこの代替案を提供していないことに気づいたとき...鉛筆と紙に優しいバージョンを探しています。正直なところ、友人に手作業でRSAまたはSHA-2を実行してもらいたくはありません。
ジョー

問題は、手作業で実行できるすべての単純なアルゴリズムがEveによって暗号化されることです。
ジジリ

@Gigiliは「イブによって解読された」という意味ですか?問題は非常に制約されています。イブは元の数を取り戻すために元に戻すことはできませんが、7桁の整数からより単純な一方向ハッシュがあるはずです。
ジョー

おっと、明らかに解読されたということです。
ジジリ

0

簡単な解決策は次のとおりです。

アリスとボブの両方が同じ色に同意します。イブがそれを知っていれば問題ありません。これをPと呼びます。黄色だとしましょう。現在、アリスとボブはどちらも「x」などのプライベートカラーをランダムに選択しています。アリスは赤を選択し、ボブは青を選択します。今、彼らはPと一緒に混ぜます。アリスはオレンジになり、ボブは緑になりました。アリスはオレンジ色をボブに送信し、ボブは緑色をアリスに送信します。イブは黄色、オレンジ、および緑色について知っていますが、アリスは彼女の私的色も知っています。ボブは彼の私的色を知っています。アリスとボブは、元のプライベートカラーを取り、交換したばかりのカラーに追加します。現在、元のプライベートな色である赤と青を共有色に混ぜると、両方とも同じ色、茶色、または赤レンガ色になります。

色を混ぜる代わりに、 使用して、pが大きな素数、gがpの原始根になるようにすることができます。これは、を実行すると、結果(ゼロとp-1の間の数)は、それらのいずれかに等しくなる可能性が高いため、プリミティブルートが存在します。nが素数であるようにpが素数2n + 1である場合、2はpの原始根であることがわかります(つまり、原始根をわざわざ計算する必要がないことを意味します)。共有秘密= Bobの場合は、Aliceの場合は。gx(modp)A xgx(modp)B yAx(modp)By(modp)


カードに次のようなものを書くことができると思います。

数は、3、5、7の倍数です(たとえば)。

あり(可能性が桁の数である)及びそのアイデアは、ちょうどそれについて知っているのアイデアを持っているいずれかのいくつかのいくつかの可能性が無効になります。したがって、Eveによる復号化は発生しません。 n(10)nn


これは、ウィキペディアのDiffie-Hellmann鍵交換の記事にある画像のナレーションです。少なくともあなたのソースに言及する必要があります。
ラファエル

@ラファエル:私は自分でそれを知らなかった、誰かが私にそれを説明し、私はそれが良いアイデアだと思った。
ジジリ

0

ボブに、数値に2または3または他の値を掛けて、その数値と数値自体を掛け合わせるように依頼するだけです。手作業で実行でき、数字がわかっていれば元に戻すことができます。sha、rsa、md5はありません。ただの数学。


3
この答えは間違っています。シンプルで、手で実行でき、完全に安全ではありません。単純に機能しません。Eveは、これから電話番号に関する多くの情報を回復できます。
DW

0

電話番号で暗号化されたコードワードをボブに送信します。彼があなたにコードワードを送り返すなら、あなたは彼が正しい番号を持っていることを知っています。

弱点は、EveがBobをシミュレートできるため、Bobが戻ってきたときにコードワードを提供する電話番号を取得するまで、すべての電話番号を試すだけです。

したがって、ボブにコードワードに非常に大きな乱数を追加させ、それを暗号化してから送り返します。これにより、Evesの検索スペースが希望どおりに大きくなります。


これは正しくないようです。ボブが間違った番号を持っている場合、彼は最初に解読し、間違ったコードワードを取得します。その後、彼は乱数をコードワードに追加し、間違ったキーで暗号化します。メッセージを受信して​​正しいキーで復号化すると、ボブの番号が間違っていても、復元されたメッセージの最初のセグメントが正しいコードワードになる可能性があります。
情報

@randomAコードワードを十分に長くするだけで、その発生の可能性が非常に小さくなり、気にする必要はありません。
イアンリングローズ

あなたが言ったことは本当ですが、選択された解決策もこの問題に関して非常に素晴らしいです。「一部の情報がボブからアリスに内密に伝えられる」という点で、私は選択されたソリューションに異議を唱えるだけです。十分に大きく、電話番号を表す記号を含まないパディングメッセージを使用すると、ボブは電話番号をランダムに入力でき、アリスはボブが行ったランダムなステップを知らずに、復号化されたメッセージから電話番号を簡単に回復できます(この場合、機密情報は必要ありません)。
情報

-1

カードに10個の電話番号を書きます。その中で、私の番号がボブの番号の隣に来ることを確認し 、「ボブ、私の番号はあなたの番号の隣です。確認してください」と言います。


1
私はボブの番号を知っていて、イブは知らないと仮定すると:P
everlasto

-1

質問は誰もが考えるよりもずっと簡単だと思います。ボブが持っている番号が正しい(または、間違っている可能性がある)ことを確認する必要があります。番号が正しいかどうかを「チェック」しているので、ボブはすでにあなたの番号を持っていると想定できます。したがって、何らかのコードでボブに番号を送信する必要はありません。私の答えは「親愛なるボブ、私の電話番号に電話してください。ありがとう、アリス」です。


1
質問はすでにこの些細な答えを明示的に除外しています。
デビッドリチャービー14年

-2

このようなトリックプレイをしてみてください

solution1:数値が37の場合、ハッシュマップは次のようになります

01 07

15 12

25 20

31 36

49 43

53 50

60 62

72 72

85 82

91 94

そして、混乱させるために、10桁以上で同じことをします。

solution2:または、数が他の一意の数になる多項式を構築します

solution3:これを「dude call me」という文字で書いてください

solution4:すべての数字で演算を行い、0を返すように関数を作成し、trueまたはfalseを送信しますsolution5:両端が共通のハッシュ関数を共有している場合...とても簡単です


これは、すべての明白ではありませんどのようにあなたのスキームコード37
デビッドRicherby

私たちがする必要があるのは地図だけです... 31は太字で3は位置1にあります... 72は7が位置2にあります...理解するのが非常に直感的でない場合は申し訳ありません
Ajay Reddy 14

これについては、回答で詳しく説明する必要があります。しかし、真剣に、それがあなたのコーディングスキームである場合、それは正確に安全ではありませんか?
デビッドリチャービー14

-2

基本的なビット単位の操作を使用してこれを行うことができるか、紙や鉛筆の作業用にカスタマイズすることができると思います。アリスの数がexの場合:663よりも、この方法論を使用して数を変換できます。各数字を同等のバイナリ表現に変換し、これをA 663-> 110 110 011と言い、個々の数字の対応するビットを逆にして、B-> 011 011 110と言うと、今度はAとB-> 010 010 010 bobと同じ結果が出たら同じことをするように頼む eveが推測できる唯一の方法は、考えられるすべての組み合わせを記述してから、それらをすべて試すことです。ただし、左または右シフトを使用してダミービットを追加することで、さらに複雑になります。


これは機能しません。まず、各3ビットグループの中央のビットは変更されません。第二に、送信されたメッセージの各グループの最初と3番目のビットは常に同じであり、通常はゼロであるため、多くの誤検知が発生します。第三に、そして致命的に、3ビットは8つの値のみを表すことができますが、10進数は10の値のいずれかを取ることができます。第4に、最後の文は基本的に「ああ、それがうまくいかない場合は、もっと複雑なものを試してください」です。といった?
デビッドリチャービー

-3

電話してください(私の名前は1001001です)。連絡が取れない場合は、お持ちの電話番号を書き留めて、イブに返送してください。

説明:ボブが私の正しい番号を取得した場合、彼は私に連絡することができ、それが正しい番号であることを知っています。ボブが私の正しい番号を取得しなかった場合、イブは私の(正しい)電話番号も読み取ることができません。このようにして、友人のボブが正しい電話番号を持っているかどうかをすでに確認しました。


to everlasto:イブはボブに連絡することができます。したがって、「ボブ、私の番号はあなたの番号の隣にあります。確認してください」と尋ねると、イブはあなたを知っています。
ポボールウォン14

1
質問では、「ボクに電話してください」というカードをボブに送ることはできないと明示的に述べています。また、ボブが通過できなかった場合、カードに間違った番号を書いても何も追加されません。
デヴィッドリチャービー14

以前にLZWエンコード/デコードプログラムを作成しました。ボブにそれを使って私の携帯電話のエンコードされた番号を送信するように頼むこともできます。
ポボールウォン14

デヴィッド・リチャービーへ:質問は「あなたは彼に直接聞くことはできない」としか言及していないので、私、1001001はボブに直接尋ねることはできませんが、彼に電話をかけて私に電話するよう頼むことができるはずです。
ポボールウォン14

質問をもっと注意深く読んでください。質問の「注2」は、コンピュータサイエンスを使用していないため、Bobに電話するように求めるメモを送信するソリューションを拒否します。
デビッドリチャービー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.