2016-04-22 13 views
1

Gibt es trotzdem kann ich immer den gleichen privaten Schlüssel generieren? Ich müde KeyPairGenerator mit einem RandomSecure Objekt zu initialisieren, die die gleiche seed verwendet:Generate KeyPair mit RandomSecure

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; 
} 

ich die obige Funktion aufrufen und prüfen, ob die privaten Schlüssel gleich sind:

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

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

Sie sind anders, meine Frage Gibt es eine Möglichkeit, immer denselben privaten Schlüssel zu generieren?

+0

Ich denke, der einzige Weg, Benutzerdefinierte Rsa algotihm – xXxpRoGrAmmErxXx

+0

zu erstellen ist, dass Sie 'SecureRandom' bedeuten Sie? – EJP

Antwort

-1

Ich glaube nicht, dass dieser Code private-key bei jeder Anfrage erzeugen wird. Grund dahinter ist, diese besondere Stück Code

SecureRandom sr = new SecureRandom(seed.getBytes()); 

jedes Mal, wenn Sie getPrivateKey(String) Methode aufrufen. zu jeder Zeit SecureRandom Klasse wird eine neue Zufallszahl generieren.

keyGen.initialize(1024, sr); //each time secure random number will be different. 
KeyPair keyPair = keyGen.generateKeyPair(); 

und keyGen.initialize() Methode mit verschiedenen Schlüsseln initialisiert die ganze Zeit so, jedes Mal eine andere Methode keyGen.generateKeyPair();private-key generieren.

Wenn Sie versuchen, das gleiche SecureRandom Objekt in initialize() Methode zu ändern oder zu übergeben, dann kann es nur erreicht werden.

+0

Wenn Sie das gleiche SecureRandom verwenden, werden bei jedem Anruf sicher andere Werte generiert. – greyfairer

0

Die Java SecureRandom-Implementierung hängt von den verfügbaren Providern ab und kann daher auf verschiedenen Betriebssystemen oder für verschiedene Implementierungen unterschiedlich sein.

Unter Linux ist die Standardimplementierung NativePRNG, die Ihre Seed AFAIK ignoriert.

Was Sie tun könnten, ist Ihre serialisieren zufällige vor dem Aufruf der Generation, und deserialize es, um es für die nächste Generation zurückzusetzen.

Ich habe dies in der Vergangenheit getan, und erinnere mich, es funktioniert für mindestens einige Java-Implementierung.

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(); 
...