打印值问题

问题描述:

我已经为密码学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

您的打印语句在您的情况下。你有没有考虑过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

你只有在做任何事情,如果if(s/i != (int)(s/i))。由于si都是整数,所以这种情况不可能是真的。

(澄清:用“不可能”,我的意思是,这种情况不可能是真的s/i返回一个整数,(int)(s/i)将返回完全相同的整数)

千万不要使用浮动密码学的点算法。特别是对于求幂,你需要的结果比double可以给你的更精确。改为使用BigInteger

在测试过程中,您不应每次使用“新”随机数。改为使用new Random(0),这样您可以在下次启动调试器时重现您的计算。

如何保证s是一个质数?我无法从代码中看到它。

请正确并一致地缩进您的代码。 由于您使用的是Eclipse,所以您只需按Ctrl-Shift-F一次。

为S所产生的intger:

s = generator.nextInt(50000); 

有25000到1机会:

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

将永远是正确的。 如果s> 2,也许哟umeant?