python实现Diffie-Hellman 协议并使用aes256进行加密传输
实验原理参见旧帖子
大概说一下代码的思想流程:
1.第一阶段实现的是双方就DH协议进行交换得到对称密钥
使用的是命令行参数实现的,循环调用命令行控制函数
全程使用了多线程实现后台的循环接收消息,就基本上除了git版本管理老师的要求都有了吧。
首先得到q,a这两个数。q为大素数,a为其本原根,为了省事直接从网上找了个本原根表,静态定义了这两个数。
其次进行socket通信,将两方的根据q,a,自己选择的公钥ya,yb实现得到计算后的公钥YA,YB传输给对方。
得到传输的公钥后,发送消息时利用公钥根据DH算法计算得到私钥,利用私钥进行加密解密操作(我只解密偷了个懒)。
传输的加密后信息因为使用了私钥进行aes256加密,很安全。
但是问题来了,不能确定我就是跟我想的对象进行私钥的沟通,于是产生中间人攻击问题。
2.第二阶段实现中间人攻击DH协议(这玩意我也没做的太好)
以下是大佬想出来的中间人攻击代码实现原理:
在不影响双方通信的情况下(不能让人发现啊),首先自己实现一个协议如:
自定义的协议头:
开头两个字节为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字段。
因为中间人攻击主要是在进行连接的过程中实现的,所以想要防御得在这个过程中下功夫,接下来就引出了第三阶段,预定义密钥对中间人攻击进行抵御
3.预定义密钥对中间人攻击实现抵御
中间人想要得到攻击效果,得知道密钥,我预定义密钥就可以实现对这种攻击的抵御了
在代码内部直接进行定义私钥,然后连接对面的客户端即可,无需进行密钥的沟通,直接预定义密钥进行aes256加解密即可,安全性较高。
备注:上面的只是第一部分的截图因为懒得截了。暂时还在课设期间所以不会放出源码,课设完了再放出来吧。
急着想要的找我:qq:,但是只能看看,别交上去。。