- 1、本文档共43页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
针对DiffieHellman协议的中间人攻击与协议改进
本文为网络空间安全实践与设计III的报告内容,最终得分92分。该项目实现了客户端与服务器通过DiffieHellman协议进行密钥交换、AES加密通信内容、中间人攻击实现窃听等,并针对中间人攻击对DiffieHellman协议进行了改进。
课设要求:使用C语言,在Linux平台进行开发。
第一阶段:Diffie-Hellman协议的实现
客户端与服务器之间通过TCPSocket通信;
客户端与服务器之间通过Diffie-Hellman协议协商出对称密钥;
客户端使用协商出的对称密钥对传输内容做加密,并发送给服务端;
服务端接受客户端发送过来的内容,进行解密;
对称加密算法采用AES256-GCM;
第二阶段:Diffie-Hellman中间人攻击方法研究与实现
研究Diffie-Hellman协议,研究中间人攻击方法并完成相关代码。当通信双方进行通信时,中间人攻击程序可以解密出传输内容;
第三阶段:Diffie-Hellman协议改进
基于预共享密钥的方式对Diffie-Hellman做改进,使协议抵抗中间人攻击。完成协议设计,实现代码并用第2阶段的中间人攻击程序做验证。www.biyezuopin.vip
为完成本次课设,总共用到了?libgmp?和?libpcap?两个库(aptinstalllibgmp-devlibpcap-dev);使用了arpspoof(aptinstalldsniff)工具进行局域网内的arp攻击;用到了三台虚拟机,均为UbuntuServer20.04,分别扮演了服务器、客户端与中间人的角色。
在开始通信时,客户端生成一个大素数p,发送给服务器保存,然后各自生成自己的私钥和公钥,并交换公钥,最后计算出用于AES加密的密钥,并互相发送消息。进行中间人攻击时,需要先使用arpspoof进行双向投毒:arpspoof-i网卡(如ens33)-t客户端IP-r服务器IP,然后再启动中间人程序。中间人程序后台运行,将客户端服务器通信的内容写入同目录下的middle.txt文件中,偶尔会乱码,大部分情况下正常。
预共享密钥我是按照自己理解写的,可能并不完全正确,大致过程就是提前在代码中为服务器和客户端写入一个相同的密钥,运行时在DH结束后,服务器随机生成一个字符串,以明文形式发送给客户端,客户端使用预共享密钥加密这段明文并返回给服务器,服务器解密,得到的明文如果与发送的相同,那么就允许通信,否则中断连接。而且这个过程中发送的数据包都是以公钥形式发送的,中间人截获后写入自己的公钥,自然就替换掉原来的随机字符串了。
以上就是大致的过程,详细请看下文,并结合代码自行理解。
目录
TOC\o1-3\h\u针对DiffieHellman协议的中间人攻击与协议改进 1
概要设计 3
抽象数据类型定义 3
Socket结构 3
DiffieHellman结构 3
AES加密结构 4
中间人数据包捕获结构 4
主程序流程 5
客户端主程序流程 5
服务器主程序流程 5
中间人主程序流程 6
各程序调用关系 6
技术开发思路 6
Socket通信的实现 7
DiffieHellman协议的实现 7
AES256-GCM加解密的实现 8
中间人捕获数据包的实现 9
防止中间人攻击的实现 10
git版本管理 10
使用makefile将多个源文件结合 10
详细设计 10
客户端程序流程图 10
服务器程序流程图 12
中间人程序流程图 14
AES加解密详细设计 19
中间人攻击详细设计 24
预共享密钥详细设计 28
调试分析 30
如何生成一个较大的随机数? 30
如何让中间人知道发送的数据包是什么? 31
inet_ntop()处报错 31
如何让中间人代码后台运行? 31
如何开启编译器优化? 32
测试结果 32
第一阶段测试结果 32
第二阶段测试结果 34
第三阶段测试结果 35
概要设计
抽象数据类型定义
Socket结构
数据对象?:客户端与服务器进行通信所需要的所有函数等元素。
数据关系?:根据IP地址和端口号,服务器绑定端口号并监听,等待客户端连接;客户端尝试连接指定IP的指定端口号,成功连接则可以相互通信。
基本操作?:
socket():创建一
文档评论(0)