Сгенерируйте пару ключей с помощью RandomSecure

Могу ли я вообще всегда генерировать один и тот же закрытый ключ? Я устал инициализировать KeyPairGenerator с помощью RandomSecure, который использует тот же seed:

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

Они разные, мой вопрос: есть ли способ всегда генерировать один и тот же закрытый ключ?


person Leem.fin    schedule 22.04.2016    source источник
comment
я думаю, что единственный способ - создать пользовательский алгоритм Rsa   -  person Panagiotis Drakatos    schedule 22.04.2016
comment
Вы имеете в виду SecureRandom?   -  person user207421    schedule 22.04.2016


Ответы (2)


Реализация 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(); 
...
person GreyFairer    schedule 22.04.2016

Я не думаю, что этот код будет генерировать одно и то же private-key при каждом запросе. Причиной этого является этот конкретный фрагмент кода

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(); будет генерировать разные private-key.

Если вы попытаетесь изменить или передать тот же объект SecureRandom в методе initialize(), то только это может быть достигнуто. Возможно.

person Vikrant Kashyap    schedule 22.04.2016
comment
Если вы используете один и тот же SecureRandom, то он обязательно будет генерировать разные значения при каждом вызове. - person GreyFairer; 22.04.2016