Требуется/рекомендуется ли аутентификация с использованием потокового шифра?

Я хочу защитить связь программы на основе TCP, используя общую парольную фразу/ключ. Самый простой способ сделать это, не имея дело с размером блока, заполнением и т. д., — напрямую использовать потоковый шифр. Таким образом, количество данных не изменяется между открытыми и зашифрованными данными, и модификация является тривиальной.

Использование только потокового шифра означает отсутствие аутентификации, и я всегда считал/слышал, что шифрование без аутентификации недостаточно безопасно и не должно использоваться.

Если добавление аутентификации к потоковому шифру является обязательным, мы теряем простоту, которую добавило потоковое шифрование, потому что мы должны добавить HMAC или использовать метод шифрования с аутентификацией (например, crypto_secretbox из NaCl), есть минимальная длина сообщения, мы должны обрабатывать заполнение, ...

Что бы вы порекомендовали? Безопасно ли использовать только потоковое шифрование без аутентификации в некоторых конкретных случаях?


person math    schedule 20.10.2009    source источник
comment
Это немного расплывчато. Что вы хотите защитить и от каких злоумышленников? Общий совет по криптографии: не сворачивайте свои собственные, если вам это действительно не нужно, и если вы ТОЧНО не знаете, что делаете. Используйте стандарты. В вашем случае, возможно, вы можете использовать TLS (openssl). Или даже используйте туннель SSH и оставьте свой поток TCP незашифрованным.   -  person digitalarbeiter    schedule 20.10.2009
comment
Я могу порекомендовать прочитать Криптография для разработчиков для получения дополнительной информации об этой проблеме: books.google.at/   -  person Inshallah    schedule 20.10.2009


Ответы (2)


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

Вы не можете просто слепо пойти и применить потоковый шифр, не добавляя к потоку никакой дополнительной информации, в любом случае — помните самое важное правило потоковых шифров:

НИКОГДА ПОВТОРНО НЕ ИСПОЛЬЗУЙТЕ ОДИН KEYSTREAM

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

В любом случае использование потокового шифра, потому что он кажется более простым, обычно является ошибкой. Вы упомянули crypto_secretbox из NaCl - я рекомендую использовать его, он позаботится о проблемах аутентификации и заполнения для вас.

person caf    schedule 21.10.2009

Вы можете рассмотреть возможность использования AES в режиме GCM. Это даст вам потоковый шифр со встроенной аутентификацией.

person Rasmus Faber    schedule 21.10.2009