此密码可以生成AES密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
但是
如果我有一种“非常可靠”的生成随机数的方法,我可以用这种方式使用它
SecureRandom rnd = new SecureRandom();
byte[] key = new byte[16];
rnd.nextBytes(key);
这个方法获得的关键是可靠的吗?
或者它只能由某些SPECIAL算法生成
答案 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)
添加到其他答案......我认为基本随机函数不安全的原因有两个:
答案 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允许将密码指定为其构造函数的参数。