用java編程實現Diffie-Hellman算法

 

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("AliceBob確定一個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");

         

          //計算K1K2

          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 ;

          }

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章