此代码可能会生成 AES 密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
但
如果我有一种“非常可靠”的生成随机数的方法,我可以这样使用它吗
SecureRandom rnd = new SecureRandom();
byte[] key = new byte[16];
rnd.nextBytes(key);
这种方法得到的key可靠吗?
或者它只能由一些特殊的算法生成
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[] 周围的薄包装器——它不会以任何方式转换密钥。没有“特殊算法”。
添加到其他答案......我认为基本随机函数不安全的原因有两个:
您可以使用SecureRandom添加随机算法:
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
SecureRandom random = new SecureRandom(); // cryptograph. secure random
keyGen.init(random);
SecretKey secretKey = keyGen.generateKey();
听起来您正在尝试根据密码生成 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.