Для 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 только повышает безопасность от квантовых компьютеров, если они станут практичными.