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