Я прочитал несколько примеров использования Java Cipher для шифрования и дешифрования данных. Например:
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom();
keyGenerator.init(256, secureRandom);
SecretKey secretKey = keyGenerator.generateKey();
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, secretKey);
У меня есть 2 вопроса о процессе расшифровки.
- Несмотря на то, что требуется IV, мы можем оставить его неявным, используя
Cipher.init(Cipher.ENCRYPT_MODE, Key)
. Случайный IV будет автоматически применен к нему. Однако в режиме дешифрования должен использоваться тот же IV. Означает ли это, что следует использовать только Cipher.init(int opmode, Key key, AlgorithmParameters params)
, и IV следует получить из шифрования, сохранить и передать здесь?
Кроме '' KeyGenerator '', я также видел пример чтобы сгенерировать ключ с помощью '' 'SecretKeyFactory' '':
String key = ...
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
SecretKeySpec keySpec = factory.generateSecret(new DESKeySpec(key));
Полагаю, я могу использовать его для AES, если я изменю последнюю строку на
SecretKeySpec keySpec = factory.generateSecret(new SecretKeySpec(key,"AES"));
Я не понимаю, когда использовать
SecretKeyFactory
для генерации ключа и когда использовать
KeyGenerator
. Кажется, что последний генерирует случайный ключ, первый генерируется из данного материала ключа. Значит ли это, что в режиме расшифровки можно использовать только SecretKeyFactory?