2010-11-30 76 views
0

我已經爲密碼學Deffie Hellman創建了這個基本程序。我希望s是一個隨機生成的素數,q是一個隨機生成的整數。 sk1和sk2是隨機生成的共享密鑰。 pk1和pk2是我必須證明的模數計算值彼此相等。我認爲我的公式是正確的,但我不知道如何打印s,q,sk1,sk2,pk1和pk2的值來驗證我的要求。我的代碼粘貼在下面,如果有人可以幫我打印報表,我會很感激。打印值問題

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package javaapplication1; 
import java.util.Random; 
import java.math.*; 
/** 
* 
* @author Hash 
*/ 
public class DH { 
    public static void main(String [] arg) { 

     int s, q; 
     double sk1, sk2, pk1 = 0, pk2 = 0; 
     Random generator = new Random(); 
     s = generator.nextInt(50000); 
     q = generator.nextInt(50000); 

     sk1 = generator.nextInt(); 
     sk2 = generator.nextInt(); 

     if(s==1 || s==2) { 

     for(int i = 2; i< (int)(s/2); i++) { 
      if(s/i != (int)(s/i)) { 
     double a= Math.pow(q,sk1); 
     pk1 = a%s; 

     double b= Math.pow(q, sk2); 
     pk2 = b%s; 

     if(pk1==pk2) { 
      System.out.println("true"); 

     } 

     System.out.println(s); 
     System.out.println(q); 
     System.out.println(sk1); 
     System.out.println(sk2); 
     System.out.println(pk1); 
     System.out.println(pk2); 
      } 
      } 

     } 


    }  
    } 
+0

請選擇它並按下CTRL + K來格式化您的代碼。 – EboMike 2010-11-30 00:59:54

+0

順便說一句,你的問題是什麼?你說你不確定如何打印這些值,但是你打電話給`System.out.println`。那麼發生了什麼?他們沒有打印出來嗎? – EboMike 2010-11-30 01:00:35

回答

1

您的打印語句在您的情況下。你有沒有考慮過s != 1 or s != 2

package javaapplication1; 
import java.util.Random; 
import java.math.*; 

public class DH { 
    public static void main(String [] arg) { 

     int s, q; 
     double sk1, sk2, pk1 = 0, pk2 = 0; 
     Random generator = new Random(); 
     s = generator.nextInt(50000); 
     q = generator.nextInt(50000); 

     sk1 = generator.nextInt(); 
     sk2 = generator.nextInt(); 

     if(s==1 || s==2) { 
      for(int i = 2; i< (int)(s/2); i++) { 
       if(s/i != (int)(s/i)) { 
        double a= Math.pow(q,sk1); 
        pk1 = a%s; 
        double b= Math.pow(q, sk2); 
        pk2 = b%s; 

        if(pk1==pk2) { 
         System.out.println("true"); 
        } 
       } 
      } 
     } 
     System.out.println(s); 
     System.out.println(q); 
     System.out.println(sk1); 
     System.out.println(sk2); 
     System.out.println(pk1); 
     System.out.println(pk2);   
    } 
} 
+0

@EBO邁克它不是打印值 – Hash 2010-11-30 01:03:46

+0

或那s/i ==(int)(s/i))? – EboMike 2010-11-30 01:04:55

+0

@amir沒有這些條件的工作:(...和S應該是一個主要號碼 – Hash 2010-11-30 01:07:45

1

你只有在做任何事情,如果if(s/i != (int)(s/i))。由於si都是整數,所以這種情況不可能是真的。

(澄清:用「不可能」,我的意思是,這種情況不可能是真的s/i返回一個整數,(int)(s/i)將返回完全相同的整數)

0

千萬不要使用浮動密碼學的點算法。特別是對於求冪,你需要的結果比double可以給你的更精確。改爲使用BigInteger

在測試過程中,您不應每次使用「新」隨機數。改爲使用new Random(0),這樣您可以在下次啓動調試器時重現您的計算。

如何保證s是一個質數?我無法從代碼中看到它。

請正確並一致地縮進您的代碼。 由於您使用的是Eclipse,所以您只需按Ctrl-Shift-F一次。

1

爲S所產生的intger:

s = generator.nextInt(50000); 

有25000到1機會:

if(s==1 || s==2) { 

將永遠是正確的。 如果s> 2,也許喲umeant?