DH算法

1、通信方A和通信方B约定一个初始数g,如g=5,一个质数p,如p=23,g和p是公开的,且1< g < p

2、A生成一个随机数a,a是保密的,如a=6

3、A计算g^a%p发送给B,g^a%p=5^6%23=8

4、B生成一个随机数b,b是保密的,如b=15

5、B计算g^b%p发送给A,g^b%p=5^15%23=19

6、A接收到g^b%p后,再使用保密的a,计算(g^b%p)^a%p=19^6%23=2

7、B接收到g^a%p后,再使用保密的b,计算(g^a%p)^b%p=8^15%23=2

8、这样通信方A和B得到一个相同的密钥:2

(g^b%p)^a%p=(g^a%p)^b%p的证明:

如果a=2:

(g^b%p)^a%p=(g^b%p)^2%p=(g^b-n*p)^2%p=(g^(2*b)-2*g^b*n*p+(n*p)^2)%p=g^(2*b)%p

可以看出(g^b-n*p)^2展开后除g^(2*b)外,其它都是p的倍数,所以整个算式的结果是g^(2*b)%p

同理对(g^b-n*p)^a展开后除g^(a*b)外,其它都是p的倍数,所以整个算式的结果是g^(a*b)%p

同样可以得出(g^a%p)^b%p=g^(a*b)%p

所以(g^b%p)^a%p=(g^a%p)^b%p

整个通信过程中g、p、g^a%p、g^b%p是公开的,这时通过g、p、g^a%p得到a比较难,同样通过g、p、g^b%p得到b比较难,所以最终的密钥是比较安全的。

以g=5、p=23、g^a%p=8计算a为例,a=log(5, (8+23*n)),这个只能将n的可能值逐个带入公式试验才能得到a的值。如果a、p是比较大的数那么计算更加困难。

如果注意的是,为了防止应用优化算法计算上述问题,质数p不是随便选择的,需要符合一定的条件。随机数a、b的生成算法也必需注意,应使结果尽可能随机,不能出现可预测的规律,否则会使破解变的容易。

通过上述计算过程也可以看出DH算法不仅可以应用在2方通信的情况,如果多方通信,也可以使用该算法。

DH密钥交换算法无法验证对方身份,所以DH密钥交换算法不能抵御中间人攻击(MITM,Man-in-the-middle attack)。

时间: 2024-08-27 15:40:18

DH算法的相关文章

openssl中dh算法Demo

/*下面程序利用openssl库,实现了dh算法,产生密钥以及计算sessionkey*/ #include <openssl/dh.h> #include <memory.h> int main() { DH *d1,*d2; BIO *b; int ret,size,i,len1,len2; char sharekey1[128],sharekey2[128]; /* 构造DH 数据结构 */ d1=DH_new(); d2=DH_new(); /* 生成d1 的密钥参数*/

信息加密之非对称加密DH算法

非对称加密算法是相对于对称加密算法来说的,对于对称加密算法请查阅之前的总结,今天为大家介绍一下DH算法,DH是一种密钥交换算法,接收方根据发送方加密时的密钥,生成接收方解密密钥.下面就一起来学习一下吧: 初始化发送方密钥: KeyPairGenerator sendKeyPairGenerator = KeyPairGenerator.getInstance("DH"); sendKeyPairGenerator.initialize(512); KeyPair sendKeyPair

加密、认证、DH算法

首先理解加密算法 其次理解DH算法 最后解析ipsecVPN 理解加密算法 一个完整的加密方法由很多因素组成,但是最关键的两个因素是加密算法和密钥.加密算法通常是非常复杂的数学公式,这些公式确定如何将明文转化为密文的运作过程与规则.密钥是一串被加入到算法中的随机比特,若要使两个加密点之间进行加密的通信,必须使用相同的加密算法.而且在某些时候他们需要使用相同的密钥(对称式加密),当然在很多时候两者使用不同的密钥来进行加密或者解密(非对称加密). 下面描述对称式加密算法和非对称式加密算法: 对称式加

openssl开源程序dh算法解析之dh_ameth.c

#include <stdio.h> #include "cryptlib.h" #include <openssl/x509.h> #include <openssl/asn1.h> #include <openssl/dh.h> #include <openssl/bn.h> #include "asn1_locl.h" #ifndef OPENSSL_NO_CMS # include <open

openssl开源程序dh算法解析之dh_check.c

/*检查dh自身参数,dh公钥大小是否合适*/ #include <stdio.h> #include "cryptlib.h" #include <openssl/bn.h> //自定义OpenSSL 实现大数管理的结构及其函数 #include <openssl/dh.h> /*- * Check that p is a safe prime and * if g is 2, 3 or 5, check that it is a suitable

openssl开源程序dh算法解析之dh_key.c

/*实现openssl 提供的默认的DH_METHOD,实现了根据密钥参数生成DH公私 钥,以及根据DH 公钥(一方)以及DH 私钥(另一方)来生成一个共享密钥,用于密 钥交换*/ #include <stdio.h> #include "cryptlib.h" #include <openssl/bn.h> #include <openssl/rand.h> //实现了伪随机数生成,支持用户自定义随机数生成 #include <openssl

openssl中dh算法实现

Openssl的DH实现在crypt/dh目录中,各个源码如下: (1) dh.h 定义了 DH 密钥方法数据结构以及各种函数. (2) dh_asn1.c DH密钥参数的DER 编解码实现. (3) dh_lib.c 实现了通用的 DH 函数,设计层面的. (4) dh_gen.c 实现了生成 DH 密钥参数. (5) dh_key.c 实现openssl 提供的默认的DH_METHOD,实现了根据密钥参数生成DH 公私钥,以及根据DH 公钥(一方)以及DH 私钥(另一方)来生成一个共享密钥,

openssl开源程序dh算法解析之dh_gen.c

/*----------------实现了生成 DH 密钥参数------------*/ //DH_generate_parameters_ex #include <stdio.h> #include "cryptlib.h" #include <openssl/bn.h> #include <openssl/dh.h> #ifdef OPENSSL_FIPS # include <openssl/fips.h> #endif stat

openssl开源程序dh算法解析之p1024.c

#include <stdio.h> #include <openssl/bn.h> #include <openssl/asn1.h> #include <openssl/dh.h> #include <openssl/pem.h> /*8*16*8=1024,1024代表密钥长度(二进制位数)*/ unsigned char data[] = { 0x97, 0xF6, 0x42, 0x61, 0xCA, 0xB5, 0x05, 0xDD,