Режим CTR использует начальный вектор (IV) - PullRequest
8 голосов
/ 10 февраля 2011

насколько я знаю, в режиме 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, это было бы безопасно?

Любые идеи были бы очень полезны. Спасибо

Ответы [ 3 ]

6 голосов
/ 10 февраля 2011

Самое важное предупреждение с режимом CTR заключается в том, что вы никогда, никогда не будете повторно использовать одно и то же значение счетчика с одним и тем же ключом. Если вы это сделаете, вы фактически отдали свой открытый текст.

Чтобы помочь этому, в некоторых реальных реализациях режима CTR блок, который должен быть передан в блочный шифр, разделен на две части, помеченные как IV и счетчик (вместо того, чтобы называть все это счетчиком) , IV генерируется случайным образом, и счетчик начинается с 0.

Это позволяет вам начинать часть "счетчик" с нуля для нескольких сообщений, если вы никогда не используете повторно часть "IV".

Обратите внимание, что это всего лишь соглашение о маркировке. Математически это то же самое, что называть все это «счетчиком» и запускать счетчик случайным образом кратным некоторому целому числу для каждого сообщения.

Я не уверен, как конкретно работает реализация Bouncy Castle - возможно, он позволяет вам установить весь начальный блок, счетчик и все, со значением IV. По-видимому, он генерирует разумный IV для вас, если вы его не предоставляете, поэтому вы получаете разные выходные данные с одним и тем же входом. Суть в том, что это хорошо , и именно то, что вы хотите - все нули - это плохо , а не то, что вы хотите.

3 голосов
/ 10 февраля 2011

CTR работает путем шифрования последовательных значений счетчика.Первое значение для этой последовательности - a IV (IV означает «начальное значение» ...).Таким образом, CTR действительно использует IV.

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

«Простой» способ избежать повторения счетчика - всегда выбирать IV с криптографически безопасным случайным числом генератор (подумайте «java.security.SecureRandom») среди множества возможных IV, то есть всех 16-байтовых последовательностей.Это пространство достаточно велико, чтобы можно было пренебречь риском повторного использования значения счетчика в какой-то момент.

Просто чтобы завершить, фиксированный IV допустим, если вы убедитесь, что используете данный ключ только один раз.Проблемы безопасности возникают при повторном использовании одного и того же значения счетчика с одним и тем же ключом.Однако иметь новый ключ для каждого сообщения по меньшей мере так же сложно, как и новый IV для каждого сообщения.

0 голосов
/ 10 февраля 2011

Режим CTR использует то, что по существу эквивалентно IV, и это начальное значение счетчика.

...