web-dev-qa-db-ja.com

Tor出口ノードはデータを復号化できるが、入口ノードは復号化できないのはなぜですか?

Me -> Node A -> Node B -> Node C -> destination

Torのドキュメントには、常にonly出口ノードCがプレーンテキストデータを表示できると記載されています。 Node Cと直接話さなくても、これはどのように可能ですか?

プレーンテキストデータがあり、暗号化してNode Aに送信したい場合は、通常、Diffie-Hellman鍵交換を行い、データを送信します。ただし、このスキームでは、 Node Aはデータを復号化できました。

Node Cが何らかの形で公開鍵を私と共有していた場合、Node BまたはNode A MITM the key ?

TorはPKIをどのように正確に管理していますか?データの暗号化にはどのキーが使用されますか?

33
Petey B

Torは Onion routing と呼ばれるルーティングメソッドを使用します。タマネギのように、各メッセージ(タマネギのコア)は暗号化の層で覆われています。 attrib:wikipedia画像属性

メッセージは、デバイスを離れる前に数回暗号化されます。 Node AはレイヤーAのみを復号化(ピール)でき、その下で次のノードのアドレスが表示されます。パケットが次のノードに到達すると、レイヤーBのみを復号(ピール)できますなど。各レイヤーでは、それぞれのノードの公開鍵を使用するため、そのノードのみが独自の秘密鍵でレイヤーを復号化できます。

メッセージが出口ノードに到達すると、すべてのレイヤーが復号化され、メッセージはプレーンテキストになります(SSLでサーバーと通信している場合は暗号化することもできます)。

58
Adi

TORは、オニオンルーティングの原理を使用しています。 3つのTORノードA、B、Cが関与し(クライアントによってランダムに選択)、メッセージがmであるとします。これらのノードの対応する公開鍵をPa、Pb、Pcと想定します。

メッセージは、出口ノード(Pc)の公開鍵で始まり、Pbで終わり、最後にPa(オニオンルーティング)でクライアントによって繰り返し暗号化されます。

Data received by node A: Pa(Pb(Pc(m))) 
Data received by node B: Pb(Pc(m)) 
Data received by node C: Pc(m)  

データは、対応する秘密鍵を使用して、各ノードで復号化されます。復号化後、各ノードは、残りのデータの転送先に関するプレーンテキスト情報を取得します。これは単一のノードがパス全体を認識していないであることを確認します。各ノードは、前のノードと次のノードのみを認識しています。

pSコミュニティブログにTORに関する非常に優れた記事がありますが、どういうわけかそれを見つけることができません。誰かがリンクを見つけたら、回答に追加してください。

17
Shurmajee

ここには2つの異なる質問があります。
1-データをどのように送信し、ノードが暗号化の各層を復号化するか?
2-出口ノードからデータをどのように取得しますか?
最初の質問について、宛先にデータを送信するための公開鍵暗号化はありませんが、共有シークレットです。この前に、 D-H について十分に理解しておく必要があります。
D-Hステップ:

  1. アリスとボブは、有限循環グループGとGの生成要素gに同意します(これは通常、残りのプロトコルのかなり前に行われます。gはすべての攻撃者に知られていると想定されています)。グループGを乗法的に記述します。
  2. アリスはランダムな自然数aを選び、g ^ aをボブに送信します。
  3. ボブはランダムな自然数bを選び、g ^ bをアリスに送信します。
  4. アリスは(g ^ b)^ aを計算します。
  5. ボブは(g ^ a)^ bを計算します。

これらの手順の後、アリスとボブは共有秘密を持ち、誰もこの共有秘密について知りません。

Tor Steps:

  1. OP(オニオンプロキシまたはソース)はg ^ aをNode1(オニオンルーター)に送信します(ただし、Node1の公開鍵で暗号化されます)
  2. Node1は秘密鍵でデータを復号化し、OPにg ^ bを送信します(OPの公開鍵がORに知られている場合、プライバシーはどこにあるのか!!)。
  3. これで、OPとNode1に共有秘密があります。[例:SS1 = OP&Node1 = 2]。
  4. OPはg ^ aをNode1に送信し、Node1はそれをNode2に送信する必要があります( 'a'は新しい乱数です​​)
    OPはg ^ aをNode2公開鍵で暗号化し、データ(en(g ^ a)およびNode2アドレス)をSS1で暗号化します。
  5. Node1はSS1でデータを復号化してNode2アドレスを取得し、残りの暗号化されたg ^ aをNode2に送信します。
  6. Node2は秘密鍵でデータを復号化し、g ^ bをNode1に再度送信します(クリアテキスト)。
  7. Node1はg ^ bをSS1で暗号化してOPに送信します。
  8. OPはSS1でデータを復号化します。
  9. これで、OPとNode2には、Node1が知らない共有秘密があります。[例:SS2 = OP&Node2 = 5]。

これは回路が完了するまで続行されます。OPは(SS1、SS2、...)のノードを介して宛先への要求を送信できます。最後の送信リクエストは次のようになります:

OP to Node1 => encryptSS1(send to Node2、sendSS2(send to destination、 "hello server"))

そして、2番目の質問を受け取る応答については、このようにする必要があります:

  1. Node2への宛先=> "helloクライアント"
  2. Node2からNode1へ=> encryptSS2( "hello client")
  3. Node1からOP => encryptSS1(encryptSS2( "hello client"))
  4. OP、decryptSS1(decryptSS2(data))。

このページの画像をご覧ください。
オニオンルーティング-pikneek

1
M Rostami