因为课设需要,保存一下知识,暂时未实现,2星期内考虑贴上代码。
新文章:https://blog.csdn.net/weixin_44133008/article/details/107240380
Diffie-Hellman 协议:密钥交换协议,不加密,只是交换密钥。
感觉上类似于把RSA协议用在了密钥传输的过程中,都是利用大素数和取余(离散对数问题)。
核心思想:利用原根与离散对数的特性,在双方第一次接触时即可产生一个密钥。
特点是,在不传输密钥的条件下,通信双方又能知道他们两人的共享密钥是什么。由此避免了第三方获知密钥。
这里首先借用百科对原根和离散对数进行一个解释:
如果a是素数p的一个原根,那么数值 a mod p,a`2 mod p,...,a`(p-1) mod p 是各不相同的整数,
并且以某种排列方式组成了从1到p-1的所有整数. 对于某一个整数b和素数p的一个原根a,可以找到惟一的指数i,
使得 b = a^i mod p 其中0 ≤ i ≤ (p-1), 指数i称为:b的以a为基数的模p的离散对数或者指数.该值被记为inda,p(b)。
通信双方:Alice、Bob。
通过公钥暗中传送私钥。
实现过程:
(1):Alice与Bob选择一个较大的素数q,和q的一个原根a,a最好尽可能的小,因为这样能产生更多的排列组合。
(2):Alice选择一个随机数XA作为私钥,并且计算YA=a`A modq,YA是公开的。
(3):Bob选择一个随机数XB作为私钥,并且计算YB=a`A modq,YB是公开的。
(4):两方互相通信,分别在不安全的通道中传输YA,YB。
(5):Alice与Bob分别计算K=(YB)`(XB) modq,K`=(YA)`(XA) modq,由模数计算性质可得K=K`
K即为共享密钥。
Diffie-Hellman协议对第三方攻击和重放难以防御。
中间人攻击实现流程:
中间人攻击代码实现原理:
在不影响双方通信的情况下(不能让人发现啊),首先自己实现一个协议如:
自定义的协议头:
开头两个字节为df,第三位为1(版本号),第四位为操作特征符
定义特征符为
1:发起密钥交换
2:回应密钥交换
0:交换后的正常数据传输
定义一个特征头部有助于抓包中进行判定和筛选数据包。
接着在双方通信的时候截获数据包,分别和双方建立双向连接,得到密钥,进行消息的加密解密。
保证双方不能收到真实的数据包,可使用ARP欺骗:
1.对于握手,挥手包等不具有协议标记(df1)的数据包,将MAC地址直接改为目的MAC地址后发送。
2.对于密钥交换发起数据包,解析得到Alice的密钥,生成自己的密钥传输给目的mac地址(Bob)。
3.对于回应密钥交换数据包,解析得到Bob的密钥,生成自己的密钥传递给目的mac地址(Alice)。
4.对于常规通信数据包,解密读取信息并转发。
注!校验和很重要!:
IP校验和只校验IP头,TCP校验和是校验伪头部+整个TCP头+数据字段,如果你修改了数据字段,不修改校验和的话,发送的数据包会直接(静悄悄地)被当作错误包丢弃。TCP校验和是计算伪首部(源IP,目的IP,0,6,长度)+校验和字段置为0的TCP字段。
预共享密钥:防止中间人攻击
(可参考: https://bbs.csdn.net/topics/370116470)
使用 PSK 时,AP 和客户端必须配置相同的密钥或加密密码。AP 发送一个随机字符串到客户端。客户端接受该字符串,根据密钥对其进行加密(或编码),然后发送回 AP。AP 获取加密的字符串,并使用其密钥解密(或解码)。如果从客户收到的字符串在解密后与原来发送给客户端的字符串匹配,就允许该客户端连接。
具体实现:
客户端建立请求时,将数据字段+两个0字节用密钥加密
服务端接受请求并解密,如果最后两个字段为0,便认为客户端验证通过
最后这个大佬的可以看看,跟我们的课设很像。
引用原文:
https://www.cnblogs.com/hhjfighting/p/7770891.html
https://blog.csdn.net/happy_single/article/details/106175275
https://blog.csdn.net/qq_35887983/article/details/93595635
关于之前抓包的问题,中间人部分,可以使用pypcap+dpkt库,详情参考:
https://blog.csdn.net/weixin_39138707/article/details/74612637