首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Diffie-Hellman私钥

Diffie-Hellman私钥
EN

Stack Overflow用户
提问于 2013-03-19 02:02:40
回答 4查看 1.5K关注 0票数 4

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

代码语言:javascript
复制
int Xa = randomNo.nextInt(10000);
int Ya = (int) Math.pow(G, Xa) % P;

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-19 02:14:15

我认为问题可能是您的指数溢出了double,导致无穷大,导致每次都返回相同的值(除非您足够幸运地为指数返回了一个非常低的数字)。

此外,请确保使用安全随机来获取随机值:

代码语言:javascript
复制
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);

编辑:带调试的代码(以下代码适用于我):

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2013-03-19 02:08:29

问题在于,Java语言中的Random类有一个带有一个种子参数(称为long )的构造函数,它允许您以一种特定的方式启动伪随机数序列。

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

要解决此问题,请尝试执行以下操作:

代码语言:javascript
复制
Random randomNo = new Random(System.nanoTime());
int Xa = randomNo.nextInt(10000);

在这种情况下,种子总是不同的,并且每次调用上述代码行时,序列都会发生变化。

票数 3
EN

Stack Overflow用户

发布于 2013-03-19 02:24:15

其他人似乎已经用您生成的随机数给出了很好的答案,所以我将回答您的问题“这对于Diffie-Hellman是正确的吗?”

我认为你对Diffie-Helman的理解有点偏差。首先,你一直在使用“私钥”这个词,就好像还有一个“公钥”。Diffie-Hellman密钥交换是用于交换一个对称密钥的技术。没有私钥和公钥,只有一个密钥,双方都将使用它来加密他们的消息。此外,您还说这是用于“生成”密钥的代码。对于Diffie-Hellman,需要两个人才能跳探戈。这段代码不足以生成密钥的最终产品。你需要将Ya发送给第二方,并从第二方得到一些东西来完成这个过程。更多信息见下文。

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

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

代码语言:javascript
复制
SK = (int)Math.pow(R, Xa) % P;

因此,简而言之,在计算Ya之后不要重新计算Xa,否则将无法生成密钥。过程是这样的:

  1. 生成Ya (我只是使用这个变量名称,因为它就是您使用的)。
  2. Ya发送给您发送Ya的人的某个号码(在示例中称为此号码R,您将使用RXaP将对称密钥用于加密)。(有关SK)

,请参阅上面的公式

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15483736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档