Генерация случайного IV для AES в Java

Я внедряю механизм шифрования AES для PBE в Android, и я нашел два способа реализовать создание IV, и я хотел бы знать, какой из них лучше и безопаснее для получения IvParameterSpec:

Способ 1.

SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);

IvParameterSpec ivParams = new IvParameterSpec(iv);

Способ 2.

AlgorithmParameters params = cipher.getParameters();
byte[] iv2 = params.getParameterSpec(IvParameterSpec.class).getIV();

ivParams = new IvParameterSpec(iv2);

person user1576396    schedule 25.03.2015    source источник


Ответы (1)


Я бы использовал метод №1, потому что Java API указывает следующее для Cipher.init() API, который просто принимает режим и ключ шифрования/дешифрования:

Если этому экземпляру шифра нужны какие-либо параметры алгоритма или случайные значения, которые не может предоставить указанный ключ, предполагается, что базовая реализация этого шифра сгенерирует требуемые параметры (используя своего поставщика или > случайные значения).

(выделено мной).

Таким образом, неясно, что будут делать разные поставщики при выборе метода 2. Глядя на исходный код Android, кажется, что по крайней мере некоторые версии (включая версию 21?) не создают случайный IV — создание случайного IV кажется закомментированным.

Метод 1 также более прозрачен и, на мой взгляд, более удобен для глаз.


Обратите внимание, что обычно лучше использовать new SecureRandom() и позволить системе выяснить, какой ГСЧ лучше. "SHA1PRNG" определен нечетко, может различаться в разных реализациях и, известно, что у него есть недостатки в реализации, особенно на Android.


Таким образом, конечный результат должен быть примерно таким:

SecureRandom randomSecureRandom = new SecureRandom();
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);

Имейте в виду, что режим GCM лучше всего работает с 12-байтовым IV вместо 16-байтового IV — размера блока AES.

person Maarten Bodewes    schedule 25.03.2015