0. 概述
这是一次课程设计,话说这个题目有些复杂,但毕竟是最后一次,可以理解
实现目标:
- 用C语言在Linux系统环境下模拟D-H密钥交换,并以协商出的密钥对传输信息用AES-256-GCM进行加密,实现加密通信
- 对其进行中间人攻击,在不干扰正常通信的情况下,截获其通讯内容
- 使用预共享密钥的方法防止中间人攻击
实现内容:
可自由发挥的空间不多,在密钥交换后,我实现的是客户端可以输入简单指令在服务端执行,并获取反馈
使用工具:
因为限定了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相同
具体实现:
- 客户端建立连接,计算并发送p,g,x
- 服务端接收到p, g, x,生成b并计算y,将y返回,同时计算出密钥key
- 客户端收到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的原根&#