答えて
あなたのリンクにあるように、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));
どうすればそれをエンコードされたフォームに格納し、そのエンコードされたフォームからキーを再作成できますか? – user1231120
ありがとう!これは完璧です! – user1231120
いいえ、それは完璧ではありません。これは、入力文字のUTF-8範囲にキーを制限します。パスワードの最後の部分(24バイト以上)を変更しても、キーを変更することさえありません。文字列をキーとして使用しないでください。 PBKDF2を使用してパスワードからキーに移動します。 IVは、入力文字列をエンコードするUTF-8にも依存します。文字が1バイト以上取れば、メソッドは失敗します。 –
あなたがにリンクされドキュメントが古いです:http://docs.oracle.com/javase/7/docs/api/java/security/Key.htmlまた、Javaのチュートリアルは、鍵生成のまともな説明を持っていますデジタル署名:http://docs.oracle.com/javase/tutorial/security/apisign/step2.html –
何が必要ですか?私は、キー生成の背後にあるアイデアは正反対です:ジェネレータが同じキーを2回生成してはならないからです。多分あなたは間違った問題を解決しようとしていますか? –
キーを受け取るCypherクラスを使用して、ゲーム用の保存ファイルを暗号化しようとしています。データを暗号化してファイルに保存する必要があります。ユーザーがゲームを再開すると、そのファイルを(同じキーを使用して)復号化する必要があります。 – user1231120