本文目录一览:
验证DH密钥交换算法
我自己写了个DH秘钥的demo代码, 以前加密用过AES的加密,全套代码写下来太费时间又没技术含量。
如果你需要AES的加密代码可以留个邮箱给我。
public class Test1 {
public static final int P=30;//公开的大家都知道的
public static final int G=9;//公开的大家都知道的
public static void main(String[] args) {
A x = new A();
int one = x.getV();
//分割 A 代表A这边的系统加密 one 代表是给别人的值
B y = new B();
int two = y.getV();
//B 代表另外一边加密 two 代表是给别人的值
System.out.println(x.getKey(two));
System.out.println(y.getKey(one));
}
}
class A{
private int a;//自己的私有密值,不会告诉任何人
public A() {
Random r = new Random(200);
a=r.nextInt();
}
public int getV(){
return (Test1.G^a)%Test1.P;
}
public int getKey(int v){
return (v^a)%Test1.P;
}
}
class B{
private int b;//自己的私有密值,不会告诉任何人
public B() {
Random r = new Random(200);
b=r.nextInt();
}
public int getV(){
return (Test1.G^b)%Test1.P;
}
public int getKey(int v){
return (v^b)%Test1.P;
}
}
DH 迪菲-赫尔曼密钥交换
迪菲-赫尔曼密钥交换 (英语:Diffie–Hellman key exchange,缩写为 DH ) 是一种密钥交换协议(不是加密算法),双方使用DH确定对称密钥后,要使用加密算法实现加密和解密。
前向保密 (英语:Forward Secrecy, FS ),指的是如果长期使用的密钥泄漏了,不会导致过去的会话被解密。比如你的一对公钥/私钥泄漏了,过去的会话就可以被解密出来。
g一般是2或者5,p是一个质数。一般来讲 服务端 持有g与p,g与p一般放在xxx.dh文件中
如何生成dh文件
2048代表p是一个2048位的大数,可以指定:
(g a mod p ) b mod p 等价于 g ab mod p
(g b mod p ) a mod p 等价于 g ba mod p
所以服务端与客户端计算得到的密钥是相同的。
redis应用DH配置实践
如何改进DH算法,使其抵御中间人攻击
改进DH算法使其抵御中间人攻击的方法是:在途中根据需要修改它们的密文,使得A和B都不知道他们在和C共享通信。
DH算法的缺点是没有提供双方身份的任何信息.。它是计算密集性的,因此容易遭受阻塞性攻击,即对手请求大量的密钥。受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作.,没办法防止重演攻击。
容易遭受中间人的攻击,第三方C在和A通信时扮演B;和B通信时扮演A.A和B都与C协商了一个密钥,然后C就可以监听和传递通信量。
扩展资料:
基于原根的定义及性质,可以定义Diffie-Hellman密钥交换算法.该算法描述如下:
1、有两个全局公开的参数,一个素数q和一个整数a,a是q的一个原根。
2、假设用户A和B希望交换一个密钥,用户A选择一个作为私有密钥的随机数XA(XAq),并计算公开密钥YA=a^XA mod q。A对XA的值保密存放而使YA能被B公开获得。类似地用户B选择一个私有的随机数XBq,并计算公开密钥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 因此相当于双方已经交换了一个相同的秘密密钥。
参考资料来源:百度百科-Diffie-Hellman