6

此代码可能会生成 AES 密钥

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

如果我有一种“非常可靠”的生成随机数的方法,我可以这样使用它吗

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

这种方法得到的key可靠吗?

或者它只能由一些特殊的算法生成

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

添加到其他答案......我认为基本随机函数不安全的原因有两个:

  1. 轻微的统计偏差对于非安全相关的情况是可以接受的,但对于安全应用来说,分布范围会变得不可接受。
  2. 它们由系统 DATETIME 播种。即使知道您何时生成密钥(精度差 +/- 6 个月)也会显着减少蛮力搜索空间。
于 2012-04-21T14:56:18.967 回答
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 回答
1

听起来您正在尝试根据密码生成 AES 密钥。

If this is the case, you can use javax.crypto.SecretKeyFactory's generateSecret method, passing in a javax.crypto.spec.PBEKeySpec as the parameter. The PBEKeySpec allows to to specify the password as an argument to its constructor.

于 2012-04-20T19:58:32.920 回答