是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
只是一个字节[]的薄包装器 – 它不会以任何方式转换密钥。 没有“特殊算法”。
添加到其他答案……我认为基本随机函数不安全的原因有两个:
- 对于非安全相关情况可接受的轻微统计偏差,但是对于安全应用程序而言,分布范围变得不可接受。
- 它们由系统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允许将密码指定为其构造函数的参数。