6

AES キーは、このコードによって生成される可能性があります

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128); 

しかし

乱数を生成する「非常に信頼できる」方法があれば、そのような方法で使用できますか

SecureRandom rnd = new SecureRandom();
byte[] key = new byte[16];
rnd.nextBytes(key);

この方法で得られた鍵は信頼できますか?

または、SPECIALアルゴリズムによってのみ生成する必要があります

4

4 に答える 4

13

AESキー任意の128ビットにすることができます。それを作成する方法が何であれ、それは事実上推測できないはずです。

例えば:

SecureRandom sr = new SecureRandom()

key = new byte[16];
iv = new byte[16];

sr.nextBytes(key);
sr.nextBytes(iv);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key,"AES"), new IvParameterSpec(IV));

SecretKeySpecちなみに、これはbyte[]の単なる薄いラッパーです---キーを変換することはありません。「特別なアルゴリズム」はありません。

于 2012-04-20T19:57:41.603 に答える
3

他の回答に追加するには...基本的な Random 関数が安全でない理由は2つあると思います:

  1. セキュリティに関連しない状況では許容できるわずかな統計的偏りがありますが、セキュリティ アプリケーションでは許容できないほど分布を狭めます。
  2. これらは、システム DATETIME によってシードされます。キーをいつ生成したかを知っていても、精度は +/- 6 か月と低く、ブルート フォース検索スペースが大幅に削減されます。
于 2012-04-21T14:56:18.967 に答える
1

パスワードに基づいてAESキーを生成しようとしているようです。

この場合、javax.crypto.SecretKeyFactoryのgenerateSecretメソッドを使用して、javax.crypto.spec.PBEKeySpecをパラメーターとして渡すことができます。PBEKeySpecを使用すると、コンストラクターへの引数としてパスワードを指定できます。

于 2012-04-20T19:58:32.920 に答える
1

SecureRandomを使用してランダム アルゴリズムを追加できます。

    KeyGenerator keyGen = KeyGenerator.getInstance("AES");
    SecureRandom random = new SecureRandom(); // cryptograph. secure random 
    keyGen.init(random); 
    SecretKey secretKey = keyGen.generateKey();
于 2012-04-20T19:51:44.253 に答える