前言
DH加密算法是Diffie-Hellman于2014年提出的一种用于在不安全网络交换密钥的一种算法。这种算法目前已经在数学是一个无解问题,即暂时还没有找到破解办法。所以是一种安全的被广泛应用于密钥加密算法。本文给出了一个Java实现,输出和源代码如下所示。具体的DH算法原理可参考此文。
执行结果
************************ DH算法演示 ************************
Step1: 生成可公开的公共加密因子p和q
A生成可加密因子g和p分别为25和131. 再传送给B,此时A和B都有g和p。
Step2: 生成各自的私钥
A和B分别建立了一个自己的私钥,其中A的私钥 x=18, B的私钥 y=5
Step3: 各自特征码计算
A使用公式 p^x mod q 计算出自己的特征码 p_x=51
B使用公式 p^y mod q 计算出自己的特征码 p_y=99
Step4: 交换特征码生成公共密钥
A使用公式 p^p_y mod q 计算出对称密钥: 97
B使用公式 p^p_x mod q 计算出对称密钥: 97
结论:通过这种方式,双方可以得到相同的对称加密的密钥,而在整个传输过程中,由于x和y是不传输的,
所以即便其他所有信息都被别人获利,也无法计算出对称密钥(因为目前在数学上还无人可以解开此问题)。
源代码
public class DHTest {
public static void main(String[] args) throws Exception {
println("************************ DH算法演示 ************************");
println("Step1: 生成可公开的公共加密因子p和q");
int g = 25;
int p = 131;
println(" A生成可加密因子g和p分别为", g + "和" + p, ". 再传送给B,此时A和B都有g和p。");
println("Step2: 生成各自的私钥");
int x = 18;
int y = 5;
println(" A和B分别建立了一个自己的私钥,其中A的私钥 x=", x, ", B的私钥 y=", y);
println("Step3: 各自特征码计算");
int p_x = (int) (Math.pow(g, x) % p);
int p_y = (int) (Math.pow(g, y) % p);
println(" A使用公式 p^x mod q 计算出自己的特征码 p_x=", p_x);
println(" B使用公式 p^y mod q 计算出自己的特征码 p_y=", p_y);
println("Step4: 交换特征码生成公共密钥");
int p_x_y = (int) ((long) Math.pow(g, p_y) % p);
int p_y_x = (int) ((long) Math.pow(g, p_x) % p);
println(" A使用公式 p^p_y mod q 计算出对称密钥: ", p_x_y);
println(" B使用公式 p^p_x mod q 计算出对称密钥: ", p_y_x);
println("结论:通过这种方式,双方可以得到相同的对称加密的密钥,而在整个传输过程中,由于x和y是不传输的,\n所以即便其他所有信息都被别人获利,也无法计算出对称密钥(因为目前在数学上还无人可以解开此问题)。");
}
public static void println(Object... objs) {
StringBuilder sb = new StringBuilder();
for (Object obj : objs) {
sb.append(obj == null ? "" : obj.toString());
sb.append("");
}
sb.append("\n");
System.out.print(sb.toString());
}