Требуется / рекомендуется ли аутентификация с потоковым шифром?
Я хочу защитить связь с программой на базе TCP с помощью общей парольной фразы / ключа. Самый простой способ сделать это без необходимости иметь дело с размером блока, заполнением, ... это напрямую использовать потоковый шифр. Таким образом, объем данных не изменяется между чистыми и зашифрованными данными, и изменение является тривиальным.
Использование только потокового шифра означает, что аутентификация отсутствует, и я всегда считал / слышал, что шифрование без аутентификации недостаточно надежно и не должно использоваться.
Если добавление аутентификации в потоковый шифр является обязательным, мы теряем простоту, которую добавил потоковый шифр, потому что мы должны добавить HMAC или использовать аутентифицированный метод шифрования (например, crypto_secretbox из NaCl), существует минимальная длина сообщения, мы должны обрабатывать заполнение, ...
Чтобы вы посоветовали? Безопасно ли в некоторых случаях использовать потоковый шифр без аутентификации?
2 ответа
Использование какого-либо средства проверки подлинности сообщений особенно важно для потоковых шифров, поскольку взаимосвязь между изменениями в зашифрованном тексте и изменениями в открытом тексте очень проста.
Вы не можете просто слепо пойти и применить потоковый шифр, не добавляя никакой дополнительной информации в поток, во всяком случае - помните самое важное правило потоковых шифров:
НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ТО ЖЕ КЛАВИШУ
Поэтому, если только вы не собираетесь шифровать только одно соединение и впоследствии выбрасываете парольную фразу, вам нужно будет генерировать ключ сеанса для каждого соединения из общего секрета. Это подразумевает, что вам нужно будет отправить некоторую дополнительную информацию в начале соединения, и, так как вы отправляете ее в любом случае, отправка HMAC после каждого сообщения не должна быть большой проблемой.
В любом случае, использование потокового шифра, потому что оно кажется более простым, обычно является ошибкой. Ты упомянул crypto_secretbox
от NaCl - я рекомендую использовать это, он позаботится о проблемах аутентификации и заполнения.
Вы могли бы рассмотреть возможность использования AES в GCM-режиме. Это даст вам потоковый шифр со встроенной аутентификацией.