使用 openssl 实现 DH 算法及其中间人攻击

2 篇文章 0 订阅
1 篇文章 0 订阅
  1. 生成 DH 密钥对
//! \param prime. DH 的 prime.
//! \param gen. DH 的 gen.
//! \param dh. 返回数据.
//! \return. 成功与否.
int generate_dh_key(const char *prime, const char *gen, DH *dh) 
{
	BIGNUM *p = BN_new();
	BIGNUM *g = BN_new();

	BN_hex2bn(&p, prime);
	BN_hex2bn(&g, gen);
	DH_set0_pqg(dh, p, NULL, g);

	/* generate key */
	if (1 != DH_generate_key(dh)) {
		perror("DH_generate_key failed!");
		return -1;
	}

	return 0;
}

  1. 生成 DH 共享密钥,此处有坑:使用 openssl DH_compute_key() 函数计算 DH 密钥长度不对的问题
//! \param dh. DH,其中有本端的公钥和私钥.
//! \param peer_pub_key. 对端 DH 公钥.
//! \param peer_pub_key_len. 对端 DH 公钥长度.
//! \param shared_key. 输出 DH 共享密钥.
//! \return. DH 共享密钥长度.
int gene_shared_key(DH *dh, uint8_t *peer_pub_key, 
		uint16_t peer_pub_key_len, unsigned char *shared_key) {
	BIGNUM *p_pub_key = BN_bin2bn(peer_pub_key, peer_pub_key_len, NULL);

	/* computer shared_dh_secret */
	int shared_key_len = DH_compute_key_padded(shared_key, p_pub_key, dh);
	if(-1 == shared_key_len) {
		perror("DH_compute_key_padded failed!");
		return -1;
	}

	return shared_key_len;
}
  1. 中间人攻击
  • 截获双方发送的 DH 公共值
  • 修改为自己的公共值发送给双方
  • 使用两端的公共值同自身的 dh 分别生成中间人到客户端以及中间人到服务器的共享密钥
  • 实现中间人
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值