我有以下代码来生成私钥行:
int Xa = randomNo.nextInt(10000);
int Ya = (int) Math.pow(G, Xa) % P;
G
和P
是静态的数字。 而Xa
是随机生成的。 我每次运行程序时,它给了我同样的结果Ya
。 这是正确的的Diffie-Hellman? 我以为私钥有充分的算法运行时间改变。
我有以下代码来生成私钥行:
int Xa = randomNo.nextInt(10000);
int Ya = (int) Math.pow(G, Xa) % P;
G
和P
是静态的数字。 而Xa
是随机生成的。 我每次运行程序时,它给了我同样的结果Ya
。 这是正确的的Diffie-Hellman? 我以为私钥有充分的算法运行时间改变。
我认为这个问题可能是你四溢双您的幂,造成无穷,每次产生相同的值(除非你足够幸运地结束了一个非常低的数字为您指数返回)。
此外,一定要使用安全的随机,让您的随机值:
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);
问题是,在Random
的Java类有一个构造long
参数(称为种子 ),可让您以特定方式启动伪随机数序列。
如果你总是使用相同的种子,你总是会得到相同的序列。
为了解决这个问题,试试这个:
Random randomNo = new Random(System.nanoTime());
int Xa = randomNo.nextInt(10000);
通过这种方式,种子始终是不同的,序列改变每次你打电话以上线。
其他人似乎已经放弃了对这一问题很好的答案与你产生随机数的,所以我会回复您的问题“这是正确的的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
,否则你将无法生成密钥。 该过程进行:
Ya
(我只是用这个变量名,因为它是你使用的是什么)。 Ya
一些人。 Ya
来(被称为这个号码R
例如上文)。 R
Xa
,和P
。 (见以上公式为SK
) 这只能给出不同的结果,如果Xa
是不同的。 你是如何产生的价值Xa
? 机会是你已经使用了伪随机生成,通常需要进行接种。 如果你把默认种子每次(相同的种子每一次),它总是会返回随机数的顺序相同。
试着用你的播种发电机System.currentTimeMillis();