Java 随机生成密钥对

Java 随机生成密钥对,java,private-key,key-pair,secure-random,Java,Private Key,Key Pair,Secure Random,我是否可以生成始终相同的私钥?我厌倦了用一个使用相同种子的对象初始化: private PrivateKey getPrivateKey(String seed) { try { SecureRandom sr = new SecureRandom(seed.getBytes()); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initi

我是否可以生成始终相同的私钥?我厌倦了用一个使用相同种子的对象初始化:

private PrivateKey getPrivateKey(String seed) {
    try {   
        SecureRandom sr = new SecureRandom(seed.getBytes());

        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(1024, sr);
        KeyPair keyPair = keyGen.generateKeyPair();
        return keyPair.getPrivate();
    } catch (NoSuchAlgorithmException e) {
        System.out.println("Failed to generate key pair!");
    }
    return null;
}
我调用上述函数并检查私钥是否相同:

String seed = "xyzabc123";
PrivateKey key1 = getPrivateKey(seed);
PrivateKey key2 = getPrivateKey(seed);

boolean same = key1.equals(key2); // false

它们是不同的,我的问题是有没有一种方法可以始终生成相同的私钥?

我认为这段代码不会在每次请求时生成相同的
私钥。
这背后的原因就是这段特殊的代码

SecureRandom sr = new SecureRandom(seed.getBytes());
每次调用
getPrivateKey(String)
方法时。每次
SecureRandom
类都会生成一个新的随机数

keyGen.initialize(1024, sr); //each time secure random number will be different.
KeyPair keyPair = keyGen.generateKeyPair();
keyGen.initialize()
方法始终使用不同的键初始化,因此每次
keyGen.generateKeyPair()
方法将生成不同的
私钥


如果您尝试在
initialize()
方法中更改或传递相同的
SecureRandom
对象,则只能实现它。

我认为此代码不会在每次请求时生成相同的
私钥。
这背后的原因就是这段特殊的代码

SecureRandom sr = new SecureRandom(seed.getBytes());
每次调用
getPrivateKey(String)
方法时。每次
SecureRandom
类都会生成一个新的随机数

keyGen.initialize(1024, sr); //each time secure random number will be different.
KeyPair keyPair = keyGen.generateKeyPair();
keyGen.initialize()
方法始终使用不同的键初始化,因此每次
keyGen.generateKeyPair()
方法将生成不同的
私钥


如果尝试在
initialize()
方法中更改或传递相同的
SecureRandom
对象,则只能实现它。

Java的SecureRandom实现取决于可用的提供程序,因此在不同的操作系统或不同的实现中可能会有所不同

在linux上,默认实现是NativePRNG,它会忽略您的种子AFAIK

您可以做的是在调用生成之前序列化您的安全随机变量,并反序列化它以为下一代重置它

我在过去做过这件事,并且记得它至少适用于一些Java实现

String seed = "xyzabc123";
SecureRandom sr = new SecureRandom(seed.getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);   
out.writeObject(sr);
byte[] superseed = bos.toByteArray();
PrivateKey key1 = getPrivateKey(superseed);
PrivateKey key2 = getPrivateKey(superseed);

private PrivateKey getPrivateKey(byte[] superseed) {
    ByteArrayInputStream bis = new ByteArrayInputStream(superseed);
    ObjectInput in = new ObjectInputStream(bis);
    SecureRandom sr = (SecureRandom)in.readObject(); 
...

Java的SecureRandom实现取决于可用的提供程序,因此在不同的操作系统上或对于不同的实现,它可能是不同的

在linux上,默认实现是NativePRNG,它会忽略您的种子AFAIK

您可以做的是在调用生成之前序列化您的安全随机变量,并反序列化它以为下一代重置它

我在过去做过这件事,并且记得它至少适用于一些Java实现

String seed = "xyzabc123";
SecureRandom sr = new SecureRandom(seed.getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);   
out.writeObject(sr);
byte[] superseed = bos.toByteArray();
PrivateKey key1 = getPrivateKey(superseed);
PrivateKey key2 = getPrivateKey(superseed);

private PrivateKey getPrivateKey(byte[] superseed) {
    ByteArrayInputStream bis = new ByteArrayInputStream(superseed);
    ObjectInput in = new ObjectInputStream(bis);
    SecureRandom sr = (SecureRandom)in.readObject(); 
...

我认为唯一的方法是创建自定义Rsa算法你的意思是
SecureRandom
?我认为唯一的方法是创建自定义Rsa算法你的意思是
SecureRandom
?如果你使用相同的SecureRandom,那么它肯定会在每次调用时生成不同的值。如果你使用相同的SecureRandom,然后它肯定会在每次调用时生成不同的值。