的Diffie-Hellman私钥(Diffie-Hellman Private Key)

2019-08-17 17:16发布

我有以下代码来生成私钥行:

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

GP是静态的数字。 而Xa是随机生成的。 我每次运行程序时,它给了我同样的结果Ya 。 这是正确的的Diffie-Hellman? 我以为私钥有充分的算法运行时间改变。

Answer 1:

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

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

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);


Answer 2:

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

如果你总是使用相同的种子,你总是会得到相同的序列。

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

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

通过这种方式,种子始终是不同的,序列改变每次你打电话以上线。



Answer 3:

其他人似乎已经放弃了对这一问题很好的答案与你产生随机数的,所以我会回复您的问题“这是正确的的Diffie-Hellman?”

您的Diffie-赫尔曼的理解是有点过了,我认为。 对于一件事,你继续使用术语“私钥”,好像还有一个“公共密钥”。 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 Xa ,和P 。 (见以上公式为SK


Answer 4:

这只能给出不同的结果,如果Xa是不同的。 你是如何产生的价值Xa ? 机会是你已经使用了伪随机生成,通常需要进行接种。 如果你把默认种子每次(相同的种子每一次),它总是会返回随机数的顺序相同。

试着用你的播种发电机System.currentTimeMillis();



文章来源: Diffie-Hellman Private Key