DH群密钥交换算法

        Diffie-Hellman(DH)密钥交换是一种在不安全的通信渠道上安全地交换密钥的方法。它允许两个或多个通信方在没有共享秘密的情况下建立一个共享的秘密密钥。这个共享密钥可以用于之后的通信过程中进行加密。

具体怎么做?

  1. 选择全局公共参数:
    1. 选择一个大的质数 ( p )(模数)
    2. 选择一个基数 ( g ),它是一个小于 ( p ) 的正整数
  2. 每个参与者选择一个私有密钥:
    1. 参与者 ( Alice ) 选择一个私有密钥 ( a ),这是一个随机数,通常小于 ( p )
    2. 参与者 ( Bob) 选择一个私有密钥 ( b ),这是一个随机数,通常小于 ( p )
  3. 计算并共享公共密钥:
    1. Alice 计算公共密钥 ( A = g^a mod p )
    2. Bob 计算公共密钥 ( B = g^b mod p )
    3. 双方交换公共密钥
  4. 计算共享密钥:
    1. Alice 收到Bob 的公共密钥 ( B ) 后,她可以计算共享密钥 ( S = A^b mod p )
    2. Bob 收到Alice 的公共密钥 ( A ) 后,他可以计算共享密钥 ( S = B^a mod p )

        根据幂的幂定律,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

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fireplusplus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值