Diffie-Hellman密鑰交換代碼如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.math.*;
public class DHtest {
public static void main(String[] args){
System.out.println("Alice和Bob確定一個4位的隨機大素數n, 5位的隨機大素數g");
//獲得一個4位數的隨機大素數
long longPrimeVar4_n = createRadomPrimeNunber(4);
System.out.println("n="+longPrimeVar4_n);
//獲得一個5位數的隨機大素數
long longPrimeVar5_g = createRadomPrimeNunber(5);
System.out.println("g="+longPrimeVar5_g);
//獲得一個4位的隨機大數
long longVar4_x = createRandomNumber(3);
System.out.println("Alice選擇一個3位的大隨機數x="+longVar4_x);
//獲得一個5位的隨機大數
long longVar5_y = createRandomNumber(3);
System.out.println("Bob選擇一個3位的大隨機數y="+longVar5_y);
//計算A,B
long A = (long)largeMOD(longPrimeVar5_g,longVar4_x,longPrimeVar4_n);
System.out.println("Alice根據x計算出A="+A+" 併發給Bob");
long B = (long)largeMOD(longPrimeVar5_g,longVar5_y,longPrimeVar4_n);
System.out.println("Bob根據y計算出B="+B+" 併發給Alice");
//計算K1,K2
long K1 = (long)largeMOD(B,longVar4_x,longPrimeVar4_n);
System.out.println("Alice根據B計算出密匙K1="+K1);
long K2 = (long)largeMOD(A,longVar5_y,longPrimeVar4_n);
System.out.println("Bob根據A計算出密匙K2="+K2);
//判斷K1是否等於k2
if(K1==K2) {
System.out.println("K1=K2");
}
else {
System.out.println("error");
}
}
/*
* 產生隨機的大素數
*/
public static long createRadomPrimeNunber(int n){
long recLong = 0;
List list = listAllPrimeNumber(n);
Random rd = new Random();
int randomIndex = Math.abs( rd.nextInt()%list.size());
recLong = ((Long)list.get(randomIndex)).longValue();
return recLong;
}
public static List listAllPrimeNumber(int n){
List list = new ArrayList();
long low = (long)Math.pow(10,n-1);
long high = (long)Math.pow(10,n) - 1;
for(long i= low; i < high; i++){
if(isPrimeNumber(i)) {
list.add(new Long(i));
}
}
return list;
}
//定義一個判斷一個數是否是素數的函數
public static boolean isPrimeNumber(long x){
if(isProbablePrime(x))
return true;
else
return false;
}
private static boolean isProbablePrime(long x) {
return true;
}
/*
* 產生大的隨機數
*/
public static long createRandomNumber(int n){
long recLong = 0;
List list = listAllPrimeNumber(n);
Random rd = new Random();
int randomIndex = Math.abs( rd.nextInt()%list.size());
recLong = ((Long)list.get(randomIndex)).longValue();
return recLong;
}
public static List listAllNumber(int n){
List list2 = new ArrayList();
long low = (long)Math.pow(10,n-1);
long high = (long)Math.pow(10,n) - 1;
for(long i= low; i < high; i++){
list2.add(new Long(i));
}
return list2;
}
public static double largeMOD(long x,long y,long z)
{
if(y==1)
return x%z;
else
{
--y;
return ((x%z) * largeMOD(x,y,z)) % z ;
}
}
}