㈠ 如何对diffie-hellman密钥交换协议
DH算法的最终目的是为了完成通信双方对称秘钥的交互,但是它牛逼在即使处在不安全的环境(有人侦听)也不会造成秘钥泄露。
这里举一个最简单的反面例子:A和B要进行银行密码的交换,他们需要一个秘钥来加密自己的信息,A发给B ‘2’ 作为暗号,B再回一个‘2’,OK,以后他们发的所有信息都将加2(假设信息都是数字且运算不会溢出)。现在C偷听到了,A发一个‘456’给B,那么完蛋了,C知道A的银行密码是‘234’了。
有了DH就不一样了,A和B协定用23和5运算,A想了一个6(这个数字不用发给B),用23和5算出来一个8,发给B; B想了一个15(这个数字也不用发给A),算出来一个19又发给A;
现在A用B发过来的19可以算出2,B用A发过来的8算出来也是2,所以他们以后发的信息都是加2的。
假设C一直在偷听,那么他知道一开始用的是23和5,还有发送过程中的8和19,然而这并没有什么卵用,因为他有生之年算不出最后这个2,所以之后A和B交换的银行密码’456’ 他也就没法破解了。
至于“为什么要选择23和5、8和19还有最后的2是怎么算出来的、为什么C有生之年都算不出来”见wiki-迪菲-赫尔曼密钥交换
㈡ Diffie-Hellman的定义
由于该算法本身限于密钥交换的用途,被许多商用产品用作密钥交换技术,因此该算法通常称之为Diffie-Hellman密钥交换(简写为DH算法,基于DH算法的密钥交换通常也被称为DH交换).这种密钥交换技术的目的在于使得两个用户安全地交换一个秘密密钥以便用于以后的报文加密. Diffie-Hellman密钥交换算法的有效性依赖于计算离散对数的难度.简言之,可以如下定义离散对数:首先定义一个素数p的原根,为其各次幂产生从1 到p-1的所有整数根,也就是说,如果a是素数p的一个原根,那么数值 a mod p,a2 mod p,...,ap-1 mod p 是各不相同的整数,并且以某种排列方式组成了从1到p-1的所有整数. 对于一个整数b和素数p的一个原根a,可以找到惟一的指数i,使得 b = a^i mod p 其中0 ≤ i ≤ (p-1) 指数i称为b的以a为基数的模p的离散对数或者指数.该值被记为inda,p(b).
㈢ 如何改进DH算法,使其抵御中间人攻击
改进DH算法使其抵御中间人攻击的方法是:在途中根据需要修改它们的密文,使得A和B都不知道他们在和C共享通信。
DH算法的缺点是没有提供双方身份的任何信息.。它是计算密集性的,因此容易遭受阻塞性攻击,即对手请求大量的密钥。受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作.,没办法防止重演攻击。
容易遭受中间人的攻击,第三方C在和A通信时扮演B;和B通信时扮演A.A和B都与C协商了一个密钥,然后C就可以监听和传递通信量。
(3)dh密钥交换算法c扩展阅读:
基于原根的定义及性质,可以定义Diffie-Hellman密钥交换算法.该算法描述如下:
1、有两个全局公开的参数,一个素数q和一个整数a,a是q的一个原根。
2、假设用户A和B希望交换一个密钥,用户A选择一个作为私有密钥的随机数XA(XA<q),并计算公开密钥YA=a^XA mod q。A对XA的值保密存放而使YA能被B公开获得。类似地用户B选择一个私有的随机数XB<q,并计算公开密钥YB=a^XB mod q。B对XB的值保密存放而使YB能被A公开获得。
3、用户A产生共享秘密密钥的计算方式是K = (YB)^XA mod q.同样,用户B产生共享秘密密钥的计算是K = (YA)^XB mod q.这两个计算产生相同的结果:
K = (YB)^XA mod q = (a^XB mod q)^XA mod q = (a^XB)^XA mod q = a^(XBXA) mod q = (a^XA)^XB mod q = (a^XA mod q)^XB mod q = (YA)^XB mod q 因此相当于双方已经交换了一个相同的秘密密钥。
㈣ DH算法问题。
DH组的本质是使用非对称密钥来加密对称密钥。 DH算法过程: 1、相互产生密钥对 2、交换公钥 3、用对方的公钥和自己的私钥运行DH算法——得到另外一个密钥X
㈤ 验证DH密钥交换算法
我自己写了个DH秘钥的demo代码, 以前加密用过AES的加密,全套代码写下来太费时间又没技术含量。
如果你需要AES的加密代码可以留个邮箱给我。
java">publicclassTest1{
publicstaticfinalintP=30;//公开的大家都知道的
publicstaticfinalintG=9;//公开的大家都知道的
publicstaticvoidmain(String[]args){
Ax=newA();
intone=x.getV();
//分割A代表A这边的系统加密one代表是给别人的值
By=newB();
inttwo=y.getV();
//B代表另外一边加密two代表是给别人的值
System.out.println(x.getKey(two));
System.out.println(y.getKey(one));
}
}
classA{
privateinta;//自己的私有密值,不会告诉任何人
publicA(){
Randomr=newRandom(200);
a=r.nextInt();
}
publicintgetV(){
return(Test1.G^a)%Test1.P;
}
publicintgetKey(intv){
return(v^a)%Test1.P;
}
}
classB{
privateintb;//自己的私有密值,不会告诉任何人
publicB(){
Randomr=newRandom(200);
b=r.nextInt();
}
publicintgetV(){
return(Test1.G^b)%Test1.P;
}
publicintgetKey(intv){
return(v^b)%Test1.P;
}
}
㈥ 简述DH算法
DH组的本质是使用非对称密钥来加密对称密钥。 DH算法过程: 1、相互产生密钥对 2、交换公钥 3、用对方的公钥和自己的私钥运行DH算法——得到另外一个密钥X
㈦ 求解DH密钥交换系统怎么通过实例实现
密钥管理密钥是一种读娶修改或验证保护数据的保密代码或数字。密钥与算法(一个数学过程)结合在一起以保护数据。Windows XP 自动处理密钥生成并执行以下可以最大化保护的密钥属性:动态重生成密钥IPSec 策略通过一种称为动态重新加密的方法来控
㈧ 什么是dh算法
DH组的本质是使用非对称密钥来加密对称密钥。
DH算法过程:
1、相互产生密钥对
2、交换公钥
3、用对方的公钥和自己的私钥运行DH算法——得到另外一个密钥X(这里的奇妙之处是这个值两端都是一样的)
4、A产生对称加密密钥,用密钥X加密这个对称的加密密钥——发送到B
5、B用密钥X解密——得到对称的加密密钥
6、B用这个对称的加密密钥来解密A的数据
㈨ dh交换密钥,为什么还要两端都配置共享秘钥
共享密钥是用来通过算法计算公私钥的。不用来做数据加密
㈩ 求C或C++实现Diffie-Hellman密钥交换和RSA算法的加解密
找个大数软件包,比如NTL或者GMP,用来实现DH或者RSA很容易。