可以通过此代码生成AES密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
Run Code Online (Sandbox Code Playgroud)
但
如果我有一个"非常可靠"的方法来生成随机数,我可以用这种方式使用它
SecureRandom rnd = new SecureRandom();
byte[] key = new byte[16];
rnd.nextBytes(key);
Run Code Online (Sandbox Code Playgroud)
这种方法可靠获得的关键是什么?
或者它只能由一些SPECIAL算法生成
may*_*Van 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));
Run Code Online (Sandbox Code Playgroud)
SecretKeySpec顺便说一句,它只是一个字节[]的薄包装器 - 它不会以任何方式转换密钥.没有"特殊算法".
您可以使用SecureRandom添加随机算法:
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
SecureRandom random = new SecureRandom(); // cryptograph. secure random
keyGen.init(random);
SecretKey secretKey = keyGen.generateKey();
Run Code Online (Sandbox Code Playgroud)