насколько я знаю, режим CTR не использует начальный вектор. Он просто берет счетчик, шифрует его заданным ключом и затем выполняет операцию XOR с открытым текстом, чтобы получить зашифрованный текст.
В других режимах блочного шифрования, таких как CBC, перед шифрованием выполняется XOR открытого текста с начальным вектором.
1238] Итак, вот моя проблема. У меня есть следующий код на Java (с использованием библиотеки bouncycastle):
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal("Some plaintext");
Каждый другой вызов приведенного выше кода с одним и тем же ключом дает разные результаты! Но при выполнении:
byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key, IV);
byte[] result = cipher.doFinal("Some plaintext");
я получаю один и тот же результат при каждом вызове приведенного выше кода. Но почему это? Я имею в виду, что для CTR не нужен IV, так почему, когда я не использую IV при каждом вызове, я получаю другой результат, а когда я ввожу IV, он возвращает тот же результат? Если я всегда использую вышеупомянутый IV (все нули) при использовании CTR, будет ли это безопасно?
Любые идеи будут очень полезны. Спасибо