是AES密钥随机?

时间:2012-04-20 19:33:17

标签: java aes

此密码可以生成AES密钥

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

但是

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

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

这个方法获得的关键是可靠的吗?

或者它只能由某些SPECIAL算法生成

4 个答案:

答案 0 :(得分:11)

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只是一个字节[]的薄包装器 - 它不会以任何方式转换密钥。没有“特殊算法”。

答案 1 :(得分:3)

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

  1. 对于非安全相关情况可接受的轻微统计偏差,但会使安全应用程序的分发范围缩小。
  2. 它们由系统DATETIME播种。即使知道你生成密钥的时间 - 精确到+/- 6个月 - 也会大大减少暴力搜索空间。

答案 2 :(得分:1)

您可以使用SecureRandom添加随机算法:

    KeyGenerator keyGen = KeyGenerator.getInstance("AES");
    SecureRandom random = new SecureRandom(); // cryptograph. secure random 
    keyGen.init(random); 
    SecretKey secretKey = keyGen.generateKey();

答案 3 :(得分:1)

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

如果是这种情况,您可以使用javax.crypto.SecretKeyFactory的generateSecret方法,传入javax.crypto.spec.PBEKeySpec作为参数。 PBEKeySpec允许将密码指定为其构造函数的参数。