web-dev-qa-db-fra.com

Pourquoi un nœud de sortie Tor peut-il déchiffrer des données, mais pas le nœud d'entrée?

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

La documentation sur Tor indique toujours que niquement le nœud de sortie C peut voir les données en texte brut. Comment est-ce possible sans que je parle à Node C directement?

Si j'ai des données en texte brut et que je souhaite les envoyer chiffrées à Node A, je fais généralement un échange de clés Diffie-Hellman et j'envoie les données. Mais avec ce schéma, Node A pourrait décrypter les données.

Si Node C partageait en quelque sorte sa clé publique avec moi, ne pouvait pas Node B ou Node A MITM la clé) ?

Comment Tor gère-t-il exactement son infrastructure à clé publique? Quelles clés sont utilisées pour chiffrer les données où?

33
Petey B

Tor utilise une méthode de routage appelée routage de l'oignon . Tout comme un oignon, chaque message (le cœur de l'oignon) est recouvert de couches de cryptage. attrib:wikipediaattribution d'image

Votre message est chiffré plusieurs fois avant de quitter votre appareil. Node A ne peut que décrypter (décoller) la couche A, sous laquelle il verrait l'adresse du nœud suivant. Après que le paquet atteigne le nœud suivant, il ne peut décrypter (décoller) que la couche B , et ainsi de suite. Pour chaque couche, vous utilisez la clé publique du nœud respectif, de sorte que seul ce nœud exact peut déchiffrer la couche avec sa propre clé privée.

Lorsque le message atteint le nœud de sortie, toutes les couches ont été déchiffrées et le message est désormais en texte brut (il peut également être chiffré si vous communiquez avec le serveur sous SSL).

58
Adi

TOR utilise le principe du routage des oignons. Disons qu'il y a 3 nœuds TOR A, B et C impliqués (sélectionnés au hasard par le client) et que le message est m. Nous supposons que les clés publiques correspondantes de ces nœuds sont Pa, Pb et Pc.

Le message est chiffré à plusieurs reprises par le client en commençant par la clé publique du nœud de sortie (Pc) suivi de Pb et à la fin Pa (Onion Routing).

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

Les données sont déchiffrées à chaque nœud en utilisant leur clé privée correspondante. Après le déchiffrement, chaque nœud obtient des informations en texte brut sur l'endroit où transférer les données restantes. Cela garantit que aucun nœud unique ne connaît le chemin complet. Chaque nœud ne connaît que le nœud précédent et le nœud suivant.

p.s. Il y a un très bon article sur TOR dans notre blog communautaire, mais je ne suis pas en mesure de le trouver. Si quelqu'un trouve le lien, veuillez l'ajouter à la réponse.

17
Shurmajee

Il y a deux questions différentes ici:
1- Comment envoyer des données et comment les nœuds décryptent chaque couche de cryptage?
2- Comment obtenir les données du nœud de sortie?
À propos de la première question, je peux dire qu'il n'y a pas de cryptage à clé publique pour envoyer des données à destination, mais des secrets partagés. Avant cela, vous devez en savoir suffisamment sur D-H .
Étapes D-H:

  1. Alice et Bob s'accordent sur un groupe cyclique fini G et un élément générateur g dans G. (Cela se fait généralement bien avant le reste du protocole; g est supposé être connu de tous les attaquants.) Nous écrirons le groupe G de manière multiplicative.
  2. Alice choisit un nombre naturel aléatoire a et envoie g ^ a à Bob.
  3. Bob choisit un nombre naturel aléatoire b et envoie g ^ b à Alice.
  4. Alice calcule (g ^ b) ^ a.
  5. Bob calcule (g ^ a) ^ b.

Après ces étapes, Alice et Bob ont un secret partagé et personne ne connaît ce secret partagé.

Étapes Tor:

  1. OP (proxy ou source d'oignon) envoie g ^ a à Node1 (routeur d'oignon) (mais chiffré par la clé publique de Node1)
  2. Node1 déchiffre les données avec une clé privée puis envoie g ^ b à OP. (En texte clair. Car si la clé publique d'OP est connue des OR, alors où est la confidentialité !!).
  3. OP et Node1 ont maintenant un secret partagé. [Par exemple: SS1 = OP & Node1 = 2].
  4. OP envoie g ^ a à Node1, lequel Node1 devrait envoyer cela à Node2 ('a' est un nouveau nombre aléatoire)
    OP chiffre g ^ a avec la clé publique Node2 et chiffre les données (en (g ^ a) et adresse Node2) avec SS1.
  5. Node1 déchiffre les données avec SS1 et obtient l'adresse Node2, et envoie le g ^ a chiffré restant à Node2.
  6. Node2 déchiffre les données avec sa clé privée, puis envoie à nouveau g ^ b à Node1. (Texte en clair)
  7. Node1 chiffre g ^ b avec SS1 et envoie à OP.
  8. OP déchiffre les données avec SS1.
  9. OP et Node2 ont maintenant un secret partagé que Node1 ne connaît pas. [Par exemple: SS2 = OP & Node2 = 5].

Cela se poursuivra jusqu'à la fin du circuit. OP peut maintenant envoyer une demande de destination via des nœuds avec (SS1, SS2, ...). la dernière demande d'envoi doit être comme ceci:

OP vers Node1 => encryptSS1 (envoi vers Node2, encryptSS2 (envoi vers destination, "bonjour le serveur")))

Et à propos de la deuxième question recevant une réponse devrait être comme ceci:

  1. Dest to Node2 => "bonjour client"
  2. Node2 à Node1 => encryptSS2 ("bonjour client")
  3. Node1 à OP => encryptSS1 (encryptSS2 ("bonjour client"))
  4. OP decryptSS1 (decryptSS2 (données)).

Jetez un oeil à une image sur cette page:
Acheminement des oignons - pikneek

1
M Rostami