из того, что я знаю, режим CTR не использует начальный вектор. Он просто берет счетчик, шифрует его с помощью заданного ключа, а затем XOR - результат с открытым текстом, чтобы получить зашифрованный текст.Режим CTR с использованием начального вектора (IV)
Другие режимы шифрования блоков, такие как 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, это было бы безопасно?
Любые идеи были бы очень полезными. Спасибо
[Если вы вводите буквы AES в свой код, вы делаете это неправильно.] (Http://chargen.matasano.com/chargen/2009/7/22/if-youre-typing-the -letters-aes-in-your-code-youre-doing.html) –
Crypto * очень легко * испортить. И придирайтесь способами, которые полностью невидимы, пока кто-то их не использует. Вместо этого используйте созданную библиотеку с жестким интерфейсом. –
@Anon. Я даже выбираю свой собственный IV, пожалуйста, приходите и убейте меня сейчас. (Подсказка: некоторые люди знают, что они делают, этот общий совет о том, чтобы не вводить AES в ваш код, является глупым.) – Luc