2012-03-23 7 views
2

私はgenerate a keyにしようとしていますが、クラスが実行されるたびにキーがまったく同じであることが重要です。時間の経過とともに一貫性のあるキーを生成

これを行う方法はありますか?

+0

あなたがにリンクされドキュメントが古いです:http://docs.oracle.com/javase/7/docs/api/java/security/Key.htmlまた、Javaのチュートリアルは、鍵生成のまともな説明を持っていますデジタル署名:http://docs.oracle.com/javase/tutorial/security/apisign/step2.html –

+1

何が必要ですか?私は、キー生成の背後にあるアイデアは正反対です:ジェネレータが同じキーを2回生成してはならないからです。多分あなたは間違った問題を解決しようとしていますか? –

+0

キーを受け取るCypherクラスを使用して、ゲーム用の保存ファイルを暗号化しようとしています。データを暗号化してファイルに保存する必要があります。ユーザーがゲームを再開すると、そのファイルを(同じキーを使用して)復号化する必要があります。 – user1231120

答えて

1

あなたのリンクにあるように、Keyは暗号化アルゴリズム(RSA、DSA)によって生成されます。 Javaには、が付属しています。KeyFactoryで鍵を生成することができます。私は同じキーを何度も再現したいというあなたの希望によって混乱しています。通常は、キーを1回作成し、エンコードされたフォームを格納します。将来、エンコードされたフォームからキーを再作成することができます。


編集: 私はあなたの問題をより良く理解しています。パブリック/プライベート暗号化の鍵ペアが必要だと思った。ゲームを保存するためには、対称キーが十分です。この "十分に良い"例は、多くのショートカットを必要とすることに注意してください。 対称鍵アルゴリズムは、コードがクライアント上で実行されるとクラックすることがあります。しかし、ゲームでは、99.9%のユーザーがセーブ状態を解読できなくなります。

// I use String.getBytes() as a convenince a lot. I specify the encoding 
// to ensure that the result is consistent. 
final String utf8 = "utf-8"; 

String password = "It's a secret! Make sure it's long enough (24 bytes)"; 
byte[] keyBytes = Arrays.copyOf(password.getBytes(utf8), 24); 
SecretKey key = new SecretKeySpec(keyBytes, "DESede"); 

// Your vector must be 8 bytes long 
String vector = "ABCD1234"; 
IvParameterSpec iv = new IvParameterSpec(vector.getBytes(utf8)); 

// Make an encrypter 
Cipher encrypt = Cipher.getInstance("DESede/CBC/PKCS5Padding"); 
encrypt.init(Cipher.ENCRYPT_MODE, key, iv); 

// Make a decrypter 
Cipher decrypt = Cipher.getInstance("DESede/CBC/PKCS5Padding"); 
decrypt.init(Cipher.DECRYPT_MODE, key, iv); 

// Example use 
String message = "message"; 
byte[] messageBytes = message.getBytes(utf8); 
byte[] encryptedByted = encrypt.doFinal(messageBytes); 
byte[] decryptedBytes = decrypt.doFinal(encryptedByted); 

// You can re-run the exmaple to see taht the encrypted bytes are consistent 
System.out.println(new String(messageBytes, utf8)); 
System.out.println(new String(encryptedByted, utf8)); 
System.out.println(new String(decryptedBytes, utf8)); 
+0

どうすればそれをエンコードされたフォームに格納し、そのエンコードされたフォームからキーを再作成できますか? – user1231120

+0

ありがとう!これは完璧です! – user1231120

+0

いいえ、それは完璧ではありません。これは、入力文字のUTF-8範囲にキーを制限します。パスワードの最後の部分(24バイト以上)を変更しても、キーを変更することさえありません。文字列をキーとして使用しないでください。 PBKDF2を使用してパスワードからキーに移動します。 IVは、入力文字列をエンコードするUTF-8にも依存します。文字が1バイト以上取れば、メソッドは失敗します。 –