1

我想在我用 java 实现的密钥生成中实现更多的随机性,因为密钥强度取决于它。

我想用java.security.KeyPairGenerator来创建私钥和公钥。可以使用SecureRandom对象定义种子。

  SecureRandom random = new SecureRandom();
  byte[] rand = new byte[8]; // or only one byte

想象一下,我创建random byte[]如下:

// new KeyPress registered
long currentTime = System.currentTimeMillis();
long time = currentTime - lastTime;
lastTime = currentTime;
byte = time % Byte.MAX_VALUE;
// add byte to array or to the SecureRandom object
random.setSeed(byte);

初始化方法允许将种子添加到生成器对象。这应该会增加密钥的随机性。

// adds the seed to the generator
keyGen.initialize(4096, random);

问题是我应该在所有用户输入之后还是在例如 8 个字节之后设置密钥生成器的种子?我知道这里获得的随机性取决于系统时钟的精度。但我认为 currentTimeMillis() 方法是精确的。

你认为这是更多随机性的解决方案吗?或者你认为这不会改变什么?

EDIT 1 03.12.13 首先,感谢您的意见和想法!@Quincunx“我会说 SecureRandom 可能足够随机。” 够了干什么?我的意思是我认为这取决于你需要它。正确的?问题是我怎样才能增加随机性?!@IT-Pro 是的,我可以使用时间的平方,但我认为用户输入更随机,对吧?您的意思是说在用户输入后收集一个字节数组并在用户完成所有输入到生成器后将其传递?

编辑 2 03.12.13 @Erickson 我认为你所说的不是真的!“这些系统级设备已经从按键中收集熵”你能分享一个链接吗?你可能比我对这个话题有更多的理解,但是如果你说这样的话,我想阅读更多关于它的细节!

4

2 回答 2

3

这是没有必要的。它不会损害您的安全性,但会损害代码的可读性和可信度。

的提供者SecureRandom将为您播种生成器。提供SUN者和其他质量提供者将使用来自底层系统的熵源,例如 /dev/random 或 /dev/urandom;这些系统级设备已经从按键和其他难以预测的来源,甚至从真正随机的物理过程中收集熵。

所以,我建议你不要打扰。充其量,按键时间只会为您每次按键提供一两个熵,并且仅在系统源尚未包含该事件的情况下。

于 2013-12-03T00:27:01.447 回答
0

你总是可以取 currentTimeMillis()*currentTimeMillis() 的立方根

这是一个非常随机的种子。

是的。似乎在用户输入之后是最好的解决方案。

于 2013-12-02T22:47:09.823 回答