2016-04-22 43 views
1

反正我總是可以生成相同的私鑰嗎?我厭倦了與使用相同seed一個RandomSecure對象初始化KeyPairGenerator使用RandomSecure生成KeyPair

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 

他們是不同的,我的問題是否有辦法生成總是相同的私鑰?

+0

我認爲唯一的辦法是創建自定義Rsa algotihm – xXxpRoGrAmmErxXx

+0

你的意思是'SecureRandom'嗎? – EJP

回答

-1

我不認爲這個代碼會在每個請求中生成相同的private-key。這背後的原因 是每次調用getPrivateKey(String)方法時間碼

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

該特定片。在每個時間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()方法,那麼只有它可以實現。

+0

如果您使用相同的SecureRandom,那麼它肯定會在每次調用時生成不同的值。 – greyfairer

0

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