Tox通讯原理(一)

其他 · 2023-12-03 · 861 人浏览

1 定义

1.1 Tox ID

用户信息的唯一标志符,由用户ID(32字节)、NoSpam(4字节)、校验码(2字节)组成。

1.2 用户ID/长期公钥

用户长期公钥,可以理解为用户的身份标识,由椭圆曲线算法Curve25519与Salsa20流密码得出,是用户在Tox网络中的唯一标识,其他节点只能通过长期公钥找到用户,由于洋葱模块的存在,其他非好友节点是无法从长期公钥找到用户所在节点的DHT公钥。

1.3 长期私钥

用户的长期私钥。

1.4 NoSpam

可以自行改变,可用于防止骚扰。

1.5 校验码

用于验证该ID的合法性,计算方法为前36字节每字节相加,最后的结果为一个两字节的值。

1.6 DHT密钥对

用于节点向DHT网络宣布自己的位置,可以理解为用户的位置标识,由于洋葱模块的存在,其他非好友节点是无法从用户所在节点的DHT公钥找到用户的长期公钥。

1.7 临时密钥

由Tox节点(客户端)生成,用于建立与其他用户的会话时进行对称密钥交换,基于DH密钥交换协议。

1.8 洋葱密钥

洋葱通讯使用的密钥,由协商得出的对称密钥。

2 问题

2.1 如何防止DHT密钥与长期密钥互相得出

防止一个非好友节点通过用户所在节点的DHT密钥得到用户的长期密钥并且防止一个非好友节点通过长期密钥知道用户所在节点的DHT密钥都是由洋葱模块实现的。

由于用户的长期公钥相当于用户的身份证,用户所在节点的DHT公钥相当于用户的位置,要在茫茫人海中找到一个人,只知道身份没有地址无法找到他,只知道地址没有身份信息认不出他是谁,所以要精确的找到Tox网络中的一个用户,必须要知道他的长期公钥与DHT公钥。
这样就保证了其他节点D通过用户U的长期公钥联系到了用户U的同时,不会将用户U的DHT公钥泄露。
但是DHT公钥的随着每次Tox程序启动就会重新生成,这使得用户的位置不固定,好友节点或者非好友节点应当能在不知道DHT公钥的情况下通过长期公钥联系到用户。而洋葱模块的功能就是用来掩盖用户的真实DHT公钥,使得在不暴露自己的真实DHT公钥与IP的情况下回应想要获得通讯的节点。

具体操作是由以下流程实现的:

  1. 用户U按照一定规则随机选取三个节点ABC,这个规则的目的是为了防止选取到的三个节点都由同一个监听者控制。
  2. 获得三者的DHT公钥分别为PA、PB、PC,使用公钥加密后的值为PA(s)、PB(s)、PC(s),设用户的长期公钥为LU,LSing()表示私钥签名,那么向A节点发送PA(PB(PC(LU, LSign(LU)))), LU。
  3. A节点收到包后用自己的私钥进行解密,获得PB(PC(LU, LSign(LU))), LU,这个包说明他需要将PB(PC(LU, LSign(LU))), PA(LU)转发至B节点。
  4. B节点收到包后用自己的私钥进行解密,获得PC(LU, LSign(LU)), PA(LU),这个包说明他需要将PC(LU, LSign(LU)), PB(PA(LU))转发至C节点。
  5. C节点收到包后用自己的私钥进行解密,获得LU, LSign(LU), PB(PA(LU)),此时C节点会将LU, LSign(LU), PC(PB(PA(LU)))上传至DHT网络,供其他节点获得。
  6. 当有其他节点D想要联系U时,从DHT网络获得LU, LSign(LU), PC(PB(PA(LU))),然后将要发送的消息M打包成LU(M), PC(PB(PA(LU))),发送给C节点。
  7. C节点收到包后,解包获得LU(M), PB(PA(LU)),转发给B节点。
  8. B节点收到包后,解包获得LU(M), PA(LU),转发给A节点。
  9. A节点收到包后,解包获得LU(M), LU,转发给用户U。

整个过程中,各个节点知道的信息有:

节点能否分析得出U的长期公钥能否分析得出U的DHT公钥前一个节点后一个节点
U是(本身)是(本身)A
A否(被加密)是(入口)UB
B否(被加密)否(无直接连接)AC
C是(代理公开)否(无直接连接)BD
D是(其他途径)否(无直接连接)C

这样就保证了其他节点D通过用户U的长期公钥联系到了用户U的同时,不会将用户U的DHT公钥泄露,同理,在知道一个节点的DHT公钥的情况下不能得出这个节点的长期公钥。

Tox 匿名通讯 861 Views
本站已在互联网运行了 Theme Jasmine by Kent Liao