2016-04-22 4 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が生成されるとは思われません。この背後にある 理由コード

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()メソッドに変更または渡そうとすると、それが実現する可能性があります。

+0

同じSecureRandomを使用すると、確実にすべての呼び出しで異なる値が生成されます。 – greyfairer

0

JavaのSecureRandomの実装は、利用可能なプロバイダによって異なるため、異なるOSや実装によって異なる場合があります。

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