前言
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());
}