????????Diffie-Hellman(DH)密钥交换是一种在不安全的通信渠道上安全地交换密钥的方法。它允许两个或多个通信方在没有共享秘密的情况下建立一个共享的秘密密钥。这个共享密钥可以用于之后的通信过程中进行加密。
????????根据幂的幂定律,Alice 的式子可以转化为:(A^b mod p) = ((g^a mod p) ^ b mod p) = (g^(a*b) mod p),同理,Bob的式子也可以转化为 (g^(a*b) mod p)。?这样,两个参与者就能够得到一个相同的共享密钥 ( S?),而不需要直接交换它。这个共享密钥可以用于对后续通信进行加密。
? ? ? ? 由于明文传输的公共密钥通过指数(基数^私钥)结果再求余方法得出,其结果为离散的,在现有数学水平下,不存在快速找到有效私钥的算法,所以是安全的。数学上称之为离散对数问题。
? ? ? ? 如下为基于openssl库实现的dh密钥交换方法:通过dh_create生成私钥,dh_pubkey函数生成公钥,拿到对端的公钥后,通过dh_sharekey方法求出共享密钥:
void dh_group_example()
{
openssl_init();
struct dh_group_st *dh1 = dh_create();
struct dh_group_st *dh2 = dh_create();
unsigned char pubkey1[1024];
unsigned char pubkey2[1024];
unsigned int sz1 = sizeof(pubkey1), sz2 = sizeof(pubkey2);
dh_pubkey(dh1, pubkey1, &sz1);
dh_pubkey(dh2, pubkey2, &sz2);
unsigned char sharekey1[1024];
unsigned char sharekey2[1024];
unsigned int s1 = sizeof(sharekey1), s2 = sizeof(sharekey2);
dh_sharekey(dh1, pubkey2, sz1, sharekey1, &s1);
dh_sharekey(dh2, pubkey1, sz1, sharekey2, &s2);
DUMP_HEX("dh1", sharekey1, s1);
DUMP_HEX("dh2", sharekey2, s2);
if (memcmp(sharekey1, sharekey2, s1) == 0)
printf("success\n");
else
printf("failed\n");
}
附完整源码链接:https://github.com/Fireplusplus/fire-engine-vpn/blob/master/utils/dh_group.cpp