本文目录一览:
1、验证DH密钥交换算法 2、DH 迪菲-赫尔曼密钥交换 3、如何改进DH算法,使其抵御中间人攻击
验证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 \equiv g^{ab} \mod p
$$
$$
(g^b \mod p)^a \mod p \equiv g^{ba} \mod p
$$
所以服务端与客户端计算得到的密钥是相同的。
Redis 应用 DH 配置实践
如何改进DH算法,使其抵御中间人攻击
改进 DH 算法使其抵御中间人攻击的方法是:在途中根据需要修改它们的密文,使得 A 和 B 都不知道他们在和 C 共享通信。 DH 算法的缺点是没有提供双方身份的任何信息。它是计算密集性的,因此容易遭受阻塞性攻击,即对手请求大量的密钥。受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作,没办法防止重演攻击。 容易遭受中间人的攻击,第三方 C 在和 A 通信时扮演 B;和 B 通信时扮演 A。A 和 B 都与 C 协商了一个密钥,然后 C 就可以监听和传递通信量。
扩展资料:
基于原根的定义及性质,可以定义 Diffie-Hellman 密钥交换算法。该算法描述如下:
- 有两个全局公开的参数,一个素数
q
和一个整数a
,a
是q
的一个原根。 - 假设用户 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 公开获得。 - 用户 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