打印值问题
问题描述:
我已经为密码学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);
}
}
}
}
}
答
您的打印语句在您的情况下。你有没有考虑过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);
}
}
答
你只有在做任何事情,如果if(s/i != (int)(s/i))
。由于s
和i
都是整数,所以这种情况不可能是真的。
(澄清:用“不可能”,我的意思是,这种情况不可能是真的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?
请选择它并按下CTRL + K来格式化您的代码。 – EboMike 2010-11-30 00:59:54
顺便说一句,你的问题是什么?你说你不确定如何打印这些值,但是你打电话给`System.out.println`。那么发生了什么?他们没有打印出来吗? – EboMike 2010-11-30 01:00:35