Рейтинг:3

Правильное использование AES CTR

флаг cn

Я читал, что AES CTR безопасен только при правильном использовании. Поэтому я хочу быть уверен, что использую его правильно.

  1. Исходный вектор (IV) можно использовать только один раз, он не обязательно должен быть случайным. Безопасно ли использовать счетчик для одной части IV, а другая часть представляет собой просто некоторый текст const. Счетчик передается всем в открытом виде, а конфиденциальная часть сообщения шифруется. Это проблема, что следующий IV предсказуем?
  2. Я понимаю, что IV никогда не может повториться, но на всякий случай, сколько итераций этого условия требуется для взлома системы. Я имею в виду два повторения одного и того же счетчика или 100?
  3. И последнее, но не менее важное: повышает ли безопасность использование AES-256 вместо AES-128 для шифрования 16-байтового сообщения?
Рейтинг:2
флаг in

Здесь мы сделали различие. $nonce \mathbin\|аналог$ составляет $IV$

  • Это проблема, что следующий IV предсказуем?

Нет, это не проблема в режиме CTR, подробнее см. [1]. $IV= (одноразовый номер\mathbin\|аналог)$ шифруется, а зашифрованный текст сверяется с открытым текстом.

$$C_i = \operatorname{AES-CTR}(nonce\mathbin\|encode(i)) \oplus P_i$$

Пока $(IV,ключ)$ пара никогда не повторяется нет проблем для ваших 16-байт, предполагая, что вы всегда начинаете с 0 в счетчике для каждого шифрования с новым одноразовым номером или новым ключом.

Если есть повтор, то конфиденциальность теряется.

Я понимаю, что IV никогда не может повториться, но на всякий случай, сколько итераций этого условия требуется для взлома системы. Я имею в виду два повторения одного и того же счетчика или 100?

Двух пар достаточно, чтобы нарушить конфиденциальность с помощью техники колыбели и перетаскивания. Теперь это автоматизировано [2]. Если вы знаете один из них, то найти другой с помощью x-or несложно.

И последнее, но не менее важное: повышает ли безопасность использование AES256 вместо AES128 для шифрования 16-байтового сообщения?

Режим CTR безопасен, если используется правильно. AES-128 безопасен (в основном)[3] однако, используя AES-256, он будет защищен даже от квантовых противников, поставляемых с машиной Гровера.


Обратите внимание, что в режиме CTR вы можете получить только безопасность CPA, т. е. нет целостности и аутентификации. Для достижения целостности и аутентификации можно использовать AES-GCM (с SIV). Режим SIV использует это сообщение, чтобы избежать проблемы с IV.Когда IV повторяется, он пропускает только равенство сообщений, а не содержимое.

Правильное использование AES CTR

Ваши обязательства: в качестве договора обеспечения

  • Выбрать единый случайный ключ $к$ размера 256 и всегда держите это в секрете.

  • Выберите IV и убедитесь, что $(к,IV)$ никогда не повторяется даже при увеличении счетчика;

    • использовать детерминированный счетчик или LFSR следить за $одноразовый номер$, убедитесь, что новый ключ заменен, если есть ошибка / остановка системы, они могут быть не в состоянии записать последний использованный $одноразовый номер$.

    • Или используйте случайный $одноразовый номер$, убедитесь, что вы находитесь низко на столкновении $одноразовый номер$ под тем же ключом.

    • Всегда запускайте счетчик с $0$. Если счетчик не запускается с $0$ существует опасный путь, который может привести к повторению IV, если одноразовый номер тот же.

  • Зашифруйте сообщение и убедитесь, что оно не длиннее $2^{32}$.

    • Гарантия отсутствия различителя и
    • Гарантия того, что счетчик никогда не пройдет все 1 состояние, т. е. никогда не превысит максимальное значение счетчика.
  • Храните это.

Что вы получаете

  • Безопасность Ind-CPA и ничего больше!

Вместо этого можно использовать XChaCha20-Poly1305 со 192-битными одноразовыми номерами, которые $(IV,ключ)$ возникновение незначительно. Вы также получите аутентификацию и целостность. И поскольку режим CTR предназначен для PRF, XChaCha20 лучше использовать с режимом CTR (XChaCha20 использует CTR внутри).


Gilles 'SO- stop being evil' avatar
флаг cn
Нет! Для CTR недостаточно, чтобы IV не повторялся. **Значение счетчика** не должно повторяться.
kelalaka avatar
флаг in
@Gilles'SO-stopbeevil', перестань быть твоим ником. Во-первых, речь идет о 16-байтном, во-вторых, я сказал "Гарантия того, что счетчик никогда не перейдет все 1 состояние". Где сказано, что продолжают значение счетчика?
Maarten Bodewes avatar
флаг in
Я вижу, как использование термина IV используется для счетчика Nonce +, поскольку IV используется только как начальное значение - в конце концов, это вектор инициализации. Как определено, 16 байт лучше назвать *блоком счетчика*, состоящим из одноразового номера + счетчика.@Gilles'SO-stopbeingevil' Если вы придерживаетесь определений NIST, то простого повторения счетчика также недостаточно, так как это только часть блока ввода/счетчика, так что да, терминология.
Gilles 'SO- stop being evil' avatar
флаг cn
@MaartenBodewes Если вы разделяете блок счетчика на одноразовый номер для каждого сообщения и значение счетчика для каждого блока, то возникает требование, чтобы одноразовый номер для каждого сообщения не повторялся и чтобы значение счетчика для каждого блока не переполнялось. Не все презентации режима CTR делают это. Этот ответ явно определяет «IV» как полный начальный блок, состоящий из одноразового номера, объединенного со счетчиком, и для того, чтобы _that_ было уникальным, недостаточно: одноразовая часть должна быть уникальной. Повторения одноразового номера с разными начальными значениями счетчика недостаточно.
kelalaka avatar
флаг in
@Gilles'SO-stopbeevil' Дело в том, что я хорошо знаю об этой проблеме, и для 16 байт это не было проблемой. Я никогда не говорил, что нужно продолжать значение счетчика или использовать другое значение счетчика. Счетчик начинается с 0, продолжение счетчика — опасный путь, а не хорошая перспектива безопасности, которая увеличивает количество ловушек. Теперь я провел различие между счетчиком и ответной частью IV.
Gilles 'SO- stop being evil' avatar
флаг cn
В крайне специфичном случае, когда все сообщения имеют длину (максимум) в один блок, тогда да, IV и значение счетчика совпадают. Но это очень особый случай, которым вопрос явно не ограничен (он возникает только в одном подвопросе). Ваш ответ теперь верен со строгой математической точки зрения, но он по-прежнему вводит в заблуждение, поскольку тот факт, что он специфичен для случая одноблочных сообщений, что является очень необычным сценарием, едва заметен.
kelalaka avatar
флаг in
@Gilles'SO-stopbeevil' Я указал общий случай в договоре безопасности. Мне не нравится идея непрерывности счетчика. Что ж, в некоторых средах с ограничениями это нужно людям, чтобы они обменивались меньшим количеством ключей. Тем не менее, я не рассматриваю их здесь. Запускаем счетчик с 0. Снова и снова проверяем формулировку, чтобы не вводить в заблуждение...
Gilles 'SO- stop being evil' avatar
флаг cn
Нет, в общем случае, когда блок счетчика структурирован как одноразовый номер||двойная часть (что делают не все представления и реализации CTR), обязательство состоит в том, что одноразовый номер не повторяется.А из-за ограниченного размера одноразового номера это практически требует отслеживания ранее использованных одноразовых номеров, что не всегда выполнимо. Это ловушка CTR, в которой пользователи склонны ошибаться, и ваш ответ побудил их ошибиться.
kelalaka avatar
флаг in
@Gilles'SO-stopbeingevil' Возможно, можно объединить случайное и контейнерное значение, чтобы сформировать одноразовый номер, хотя для этого требуются вычисления, а также срок службы ключа и количество сообщений на ключ. Как я уже сказал, если есть проблема, замените новый ключ. Мой общий совет — использовать xChaCha, так как он имеет лучший диапазон одноразовых номеров. Как однажды сказал Линделл, 256-битный блок необходим, чтобы мы могли иметь лучшие границы CTR и GCM. Я не думаю, что веду их в ловушку, я уже ограничил их, чтобы они не попали в одну из них.
флаг au
Также следует отметить, что (для каждого дизайна) CTR использует один и тот же алгоритм для шифрования и дешифрования. Это может привести к несанкционированному дешифрованию в некоторых контекстах (хотя это требует повторения IV).
Рейтинг:1
флаг cn

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

Неважно, предсказуемо ли значение счетчика. Если вы можете организовать так, чтобы счетчик начинался с 0 и увеличивался на 1 для каждого блока сообщений, это очень хороший способ использования CTR. Обратите внимание, что с несколькими сообщениями это означает, что первое сообщение использует значения счетчика $0, 1, 2, \ldots, $, то второе сообщение использует значения счетчика $а+1, а+2, \ldots, б$, третье сообщение использует $b+1, b+2, \ldots, c$, и так далее.

Позвольте мне проиллюстрировать, что происходит с повторяющимся значением счетчика. Позволять $Е$ быть функцией блочного шифрования и написать $\лангле п\рангл$ для кодирования значения счетчика $n$ как блок. Если вы отправляете два двухблочных сообщения $P_0||P_1$ и $P'_0||P'_1$ (где каждый $P^{(j)}_i$ представляет собой один блок), один с IV $n$ и следующий с IV $n+1$, то соответствующие шифротексты $C_0||C_1 = (E(\langle n\rangle) \oplus P_0) || (E(\langle n+1\rangle) \oplus P_1)$ и $C'_0||C'_1 = (E(\langle n+1\rangle) \oplus P'_0) || (E(\langle n+2\rangle) \oplus P_1)$. Обратите внимание, как оба этих зашифрованных текста используют $E(\langle n+1\rangle)$. Злоумышленник может выполнить операцию xor для двух блоков зашифрованного текста, использующих одно и то же значение счетчика, и их маска шифрования аннулируется: $C_1 \oplus C'_0 = P_1 \oplus P'_0$. Часто этого достаточно, чтобы угадать некоторые или все блоки открытого текста. Например, многие сообщения содержат известный или наиболее известный заголовок, и в этом примере повторение значения счетчика превращается в раскрытие содержимого того, что находится через 16 байтов после заголовка в первом сообщении.

Если вы не можете отследить, какие значения счетчика были использованы, общепринятым способом избежать повторения является использование 16-байтового случайного числа для IV. Это делает вероятность повторного использования значения счетчика достаточно малой, чтобы этого не произошло на практике.

В большинстве случаев следует использовать стандартный аутентифицированное шифрование (AEAD) режим вместо этого, например, SIV или или GCM-SIV или GCM или CCM. Это имеет два преимущества. Во-первых, зашифрованные тексты аутентифицируются: при расшифровке вы можете убедиться, что зашифрованный текст не был изменен. (Невозможно проверить подлинность зашифрованного текста без секретного ключа. Злоумышленник все равно может поменять местами два подлинных сообщения, поэтому подлинность не совсем означает целостность.) Другое преимущество использования стандартного режима AEAD заключается в том, что для безопасности достаточно, чтобы значение счетчика не повторяется: других тонких условий нет. Преимущество режимов SIV состоит в том, что даже если IV случайно повторяется, это может показать только идентичность сообщений, ничего не раскрывая об их содержании.

Использование AES-256 вместо AES-128 только повышает безопасность от квантовых компьютеров, если они станут практичными.

kelalaka avatar
флаг in
Мы говорим о 16 байтах!
Maarten Bodewes avatar
флаг in
Полная рандомизация IV может привести к более раннему повторению счетчика, хотя разница относительно невелика — реализации обычно выполняют увеличение модуля на $2^{128}$ всего блока, поэтому, если одна часть счетчика имеет высокий уровень, а одна из следующих последовательность низка, тогда у вас будет столкновение, прежде чем будут израсходованы все возможные значения счетчика. Разделение одноразового номера и счетчика, вероятно, является лучшим способом продолжить работу, когда начальный счетчик может быть инициализирован нулем.
Gilles 'SO- stop being evil' avatar
флаг cn
@MaartenBodewes «Полная рандомизация IV может привести к тому, что счетчик будет повторяться раньше» — это не может быть правильным. Например, если вы возьмете крайний случай 1/127-битного разделения между одноразовым номером для каждого сообщения и счетчиком для каждого блока, это гарантирует повторение значений счетчика не более чем в третьем сообщении.
Maarten Bodewes avatar
флаг in
Допустим, у вас есть максимальный размер сообщения 2^32 блока. Затем вы используете оставшиеся 96 бит в качестве (случайного) одноразового номера, и если вы используете 32-битный счетчик, чтобы оставаться в одноразовом номере; таким образом, приращение счетчика не может создать коллизию с блоком счетчика с другим одноразовым номером.Однако это может произойти, если вы полностью рандомизируете блок счетчиков, поскольку расстояние между счетчиками двух последующих одноразовых номеров меняется. Вопрос, конечно, не в том, когда повторение гарантировано, а в том, когда оно возможно или вероятно.
Gilles 'SO- stop being evil' avatar
флаг cn
@MaartenBodewes Предполагается, что вы можете отслеживать, какие одноразовые номера использовались ранее. Я рекомендовал использовать случайный IV (занимающий весь блок) только в том случае, когда вы _не можете_ отслеживать, какие одноразовые номера были использованы, поэтому лучшее, что вы можете сделать, это чтобы неповторяющееся значение было статистически уникальным. Существует сценарий, в котором предпочтительнее детерминированный одноразовый номер + счетчик сообщений, когда вы можете отслеживать порядковые номера сообщений, но не знаете заранее длину сообщений. Это несколько распространено в протоколах связи. Но это слишком выходит за рамки моего ответа здесь.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.