C语言模拟D-H密钥交换及中间人攻击

本文介绍了使用C语言在Linux环境下模拟Diffie-Hellman(D-H)密钥交换过程,包括大素数p和原根g的生成,以及密钥协商。同时探讨了中间人攻击的原理和实现,提出了通过预共享密钥来防止此类攻击。文中详细阐述了密钥交换的每个步骤,并展示了如何利用Libtommath、Libtomcrypt和Libpcap库进行大数计算、加密和抓包操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 概述

这是一次课程设计,话说这个题目有些复杂,但毕竟是最后一次,可以理解
实现目标:

  1. 用C语言在Linux系统环境下模拟D-H密钥交换,并以协商出的密钥对传输信息用AES-256-GCM进行加密,实现加密通信
  2. 对其进行中间人攻击,在不干扰正常通信的情况下,截获其通讯内容
  3. 使用预共享密钥的方法防止中间人攻击

实现内容:
可自由发挥的空间不多,在密钥交换后,我实现的是客户端可以输入简单指令在服务端执行,并获取反馈

使用工具:
因为限定了C语言和Linux
大数计算:Libtommath
加密: Libtomcrypt
抓包发包: Libpcap
由于这三个库安装起来较简单,这里就不叙述了(网上一堆)
libtommath和libtomcrypt网上资料较少,看github上的pdf文档即可

部分内容凭记忆写的,有问题欢迎指正

1. 密钥交换

libtomcrypt虽然本身有D-H密钥交换的功能实现,但是直接用的话怕是太水了(总不能课设一个include就完事),故以学习为目的手动实现了下,设计如下:
符号&&流程概述:
双方共享p,g,g为p的原根
A生成一个只有自己知道的数字a,计算x=g^a mod p
将x发送给B
B生成一个只有自己知道的数字b,计算y=g^b mod p
将y发送给A
A计算key = y^a mod p
B计算key = x^b mod p
根据交换原理,二者生成key相同

具体实现:

  1. 客户端建立连接,计算并发送p,g,x
  2. 服务端接收到p, g, x,生成b并计算y,将y返回,同时计算出密钥key
  3. 客户端收到y,计算出key

(1) p的生成

libtommath 生成一个大素数

mp_prime_random_ex(p, 8, 256, LTM_PRIME_2MSB_ON | LTM_PRIME_SAFE, rng, NULL);

注意,一定要带上 LTM_PRIME_SAFE 参数,原因在下一部分会说

(2) g的生成

g是p的原根&#

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值