打印值有问题

时间:2010-11-30 00:57:53

标签: java

我为密码学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);
            }
            } 

        }


     }    
    }

4 个答案:

答案 0 :(得分:1)

您的打印声明属于您的if情况。你考虑过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);        
    }
}

答案 1 :(得分:1)

如果if(s/i != (int)(s/i)),你只会做任何事情。由于si都是整数,因此这种情况不可能真实。

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

答案 2 :(得分:1)

由s生成的整数:

s = generator.nextInt(50000);  

有25,000比1的机会:

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

永远都是真的。 也许你的意思是s&gt; 2?

答案 3 :(得分:0)

不要使用浮点算术来进行加密。特别是对于取幂,你需要比double更精确的结果。请改用BigInteger

在测试时,每次都不应使用“新”随机数。请改用new Random(0),以便下次启动调试器时可以重现计算。

您如何保证s是素数?我无法从代码中看到它。

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