Во-первых, нет такой вещи, как CTR или CBC с «без IV». Вы, вероятно, просто используете все нули в качестве IV. Всегда есть IV. (CTR называет его IV одноразовым).
CTR должен никогда, никогда повторно использовать пару nonce + Key. Это может полностью разрушить шифрование. Это основная причина избегать CTR, если вы не знаете, что делаете. Это трудно использовать правильно и имеет ужасные режимы отказа. (Тот факт, что WEP теперь считается полностью нарушенным, очень тесно связан с этим вопросом.) Я не говорю, что CTR плох при правильном использовании; Я говорю, что маленькие ошибки катастрофичны.
CBC должен никогда не использовать ключ IV +, но это не так разрушительно. Это основная причина того, что CBC является очень хорошим выбором для неспециалистов. Даже при неправильном использовании он относительно безопасен. Однако повторное использование пары IV + Key создает две основные проблемы:
- Предлагает первые 16 байтов для расшифровки, а также дополнительные блоки, если два сообщения имеют одинаковый префикс.
- Идентично шифрует идентичные сообщения (и идентичные префиксы одинаково). Это косвенно приводит к утечке существенной информации о сообщениях.
Стандартная конструкция, хорошо подходящая для неспециалистов, поскольку инструменты легко доступны на многих платформах и относительно просты в использовании, выглядит следующим образом:
Random IV + CBC-ciphertext + HMAC
IV не секрет. Это стандартно и правильно, чтобы отправить его вместе с сообщением. IV должен быть непредсказуемым только для атакующих. Даже случайное повторное использование теряет мало информации, если злоумышленники не могут предсказать (или контролировать) IV. Очевидно, что если он всегда равен нулю, предсказывать это тривиально.
CBC (а также CTR) не обеспечивает аутентификацию сообщения. Это может быть изменено в пути. Если злоумышленник знает текстовое сообщение, в некоторых случаях он может изменить зашифрованное сообщение, чтобы его можно было расшифровать известным способом. Например, если я знаю (или могу догадаться) сообщение «To Bob: $ 100», то можно изменить это сообщение, не зная пароля на «To Eve: $ 100». Аутентификация предотвращает это. Для проверки подлинности CBC используется HMAC (сначала шифрование, затем хеш).
Пример такого формата на практике приведен в формате RNCryptor , включая RNCryptor-js .
Мартен упоминает GCM, и я согласен с тем, что это отличная криптография, но я не согласен с тем, что ее должны использовать неспециалисты. В противодействии он имеет те же опасности, что и CTR. Если используется неправильно, он полностью разваливается (против CBC, который имеет гораздо более гладкую потерю безопасности). Тем не менее, это очень самоуверенная тема, и поклонники GCM не ошибаются. Я просто не согласен с тем, какой должна быть «стандартная лучшая практика для неспециалистов».
Для «Я хочу наилучшую возможную безопасность», вам обязательно нужно привлечь экспертов по безопасности. Выбор правильного режима блокировки является самой простой частью защиты системы, и есть много других подводных камней, которые так же важны.