насколько я знаю, в режиме CTR не используется начальный вектор.
Он просто берет счетчик, шифрует его с заданным ключом, а затем XOR возвращает результат с открытым текстом, чтобы получить зашифрованный текст.
В других режимах блочного шифрования, таких как CBC, перед выполнением шифрования они XOR представляют собой открытый текст с начальным вектором.
Итак, вот моя проблема. У меня есть следующий код в 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, это было бы безопасно?
Любые идеи были бы очень полезны.
Спасибо