2013-03-18 45 views
4

我有下面的代码行生成私钥:的Diffie-Hellman私钥

int Xa = randomNo.nextInt(10000); 
int Ya = (int) Math.pow(G, Xa) % P; 

GP是静态的数字。而Xa是随机产生的。每次运行该程序时,它都会给我提供Ya的相同结果。这对Diffie-Hellman是否正确?我认为每次运行算法时都必须更改私钥。

+0

您可以发布初始化用于创建Xa的随机对象的行吗? – 2013-03-18 18:05:03

+0

编辑原创@VitoShadow - 我输出了随机数,它的工作原理。 – 2013-03-18 18:07:59

+0

你有没有试过我的答案? – 2013-03-18 18:13:59

回答

2

我认为这个问题可能是你四溢双您的幂,造成无穷,每次产生相同的值(除非你足够幸运地结束了播种的发电机为您的指数返回一个非常低的数字)。

此外,一定要使用安全的随机,让您的随机值:

Random random = new SecureRandom(); 

// If you use more than 100 here, then 
// with your value of 486 for G you will 
// end up with infinity when doing Math.pow(G,Xa). 
// Of course, this does not provide enough possible 
// values to be cryptographically secure. 
int Xa = random.nextInt(100); 
int Ya = (int) (Math.pow(G, Xa) % P); 

编辑:代码调试(以下为我的作品):

double G = 42; 
int P = 26; 


Random random = new SecureRandom(); 
int Xa = random.nextInt(100); 
double val = Math.pow(G, Xa); 
System.out.println("Xa: " + Xa); 
System.out.println("(double) Math.pow: " + val + " (int): " + (int) val); 
int Ya = (int) (val % P); 
System.out.println("Ya: " + Ya); 
+0

我有完全相同的代码,只有P是26,G是42.仍然生成相同的数字? (random.nextInt是100)。 – 2013-03-18 18:42:58

+0

这是由于代码的第二个问题(上面刚刚修复),您需要在投射前执行模块。添加上面的括号以使其工作。 – 2013-03-18 18:48:08

+0

试过 - 仍然没有运气。我很难过。 – 2013-03-18 18:49:37

3

的问题是Random类在Java中有一个long参数(称为种子),可让您以特定方式启动伪随机数序列的构造。

如果您总是使用相同的种子,您将始终获得相同的序列。

为了解决这个问题,试试这个:

Random randomNo = new Random(System.nanoTime()); 
int Xa = randomNo.nextInt(10000); 

这样,种子始终是不同的,序列改变你拨打上面的行每次。

+0

所以,如果我理解正确 - 种子现在是否来自内部时钟? – 2013-03-18 18:13:19

+0

我也收到错误“找不到适合nextInt(long)的方法。 – 2013-03-18 18:15:09

+0

是的,这是一个典型的技巧,用于从伪随机数中创建随机数 – 2013-03-18 18:15:11

1

如果Xa不同,这只能给出不同的结果。你是如何产生Xa的价值的?你有可能使用了一个通常需要种子的伪随机生成器。如果每次采用默认种子(每次都是相同的种子),它将始终返回相同的随机数序列。

尝试System.currentTimeMillis();

3

其他人似乎有在你们这一代随机数的问题上给出了很好的答案,所以我会回答你的问题:“这对Diffie-Hellman是否正确?”

我认为你对迪菲赫尔曼的理解有点偏离。首先,您继续使用“私钥”这个术语,就好像还有一个“公钥”一样。 Diffie-Hellman密钥交换是用于交换一个对称密钥的技术。没有私钥和公钥,只有双方将用来加密其消息的密钥。此外,你说这是“生成”密钥的代码。有了Diffie-Hellman,它需要两个探戈。此代码不足以生成密钥的最终产品。您需要将Ya发送给第二方,并从该第二方获取一些信息以完成此过程。请参阅下面的更多信息。

您的公式为Ya是正确的,假设Xa是它应该是。我有点担心你对Xa应该做什么的理解,因为你在生成Ya之后将其重新分配给一个随机值。您将需要挂在Xa以创建密钥的最终版本。

生成Ya后,您应该将其发送给对方。对方会给你回一些号码(我们称之为R)。为了让您创建对称密钥(我们称之为SK)的最终版本,你需要计算它作为

SK = (int)Math.pow(R, Xa) % P; 
简而言之

所以,不重新计算Xa您计算出Ya后,否则你将无法生成密钥。过程如下:

  1. 生成Ya(我只是使用这个变量名称,因为它是你使用的)。
  2. 发送Ya给某个人。
  3. 从你发送Ya的人那里收到一些号码(在上面的例子中称为这个号码R)。
  4. 计算使用R,XaP进行加密时应使用的对称密钥。 (请参阅上面的公式SK
+0

干杯@ 2to1mux - 这就更清楚了。我一直在关注网络上的教程。 (http://www.codeproject.com/Articles/70330/Implementation-of-Diffie-Hellman-Algorithm-of-Key) – 2013-03-18 18:26:57

+0

+1。很好的解释 – Leigh 2013-03-19 16:52:28