- 生成 DH 密钥对
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);
if (1 != DH_generate_key(dh)) {
perror("DH_generate_key failed!");
return -1;
}
return 0;
}
- 生成 DH 共享密钥,此处有坑:使用 openssl DH_compute_key() 函数计算 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);
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;
}
- 中间人攻击
- 截获双方发送的 DH 公共值
- 修改为自己的公共值发送给双方
- 使用两端的公共值同自身的 dh 分别生成中间人到客户端以及中间人到服务器的共享密钥
- 实现中间人