是AES密钥随机?

可以通过此代码生成AES密钥

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

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

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

这种方法可靠获得的关键是什么?

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

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. 对于非安全相关情况可接受的轻微统计偏差,但是对于安全应用程序而言,分布范围变得不可接受。
  2. 它们由系统DATETIME播种。 即使知道你生成密钥的时间 – 精确到+/- 6个月 – 也会大大减少暴力搜索空间。

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

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

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

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