DH算法的简单的Java实现

前言

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());
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章