Использование одного и того же ключа AES для CBC и ECB

Обзор

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

Причина, по которой мне нужна эта возможность, заключается в том, что я использую шифрование AES для реализации схемы одноразового пароля (OTP). Когда клиент входит на сервер, ему дается начальное число. Первый OTP генерируется путем шифрования этого начального числа. Для каждого последующего запроса клиент шифрует последний OTP, используя общий ключ AES между сервером и клиентом. Следовательно, даже если злоумышленник перехватит последний OTP без общего ключа, он не сможет получить следующий OTP. OTP шифруется с помощью AES в режиме CBC. Проблема возникает, если сервер и клиент не синхронизируются. Я планировал справиться с этим путем создания нескольких одноразовых паролей в будущем на стороне сервера и проверки, соответствует ли какой-либо из них клиентскому. Однако без способа детерминированного расчета IV для каждой итерации шифрования это невозможно.

Прежде чем я перейду к предлагаемому решению, позвольте мне выразить свое понимание AES, IV, CBC и ECB. Таким образом, если у меня возникнут какие-либо недоразумения в моих основах, на них можно будет указать и исправить.

Теория

ЕЦБ

Я знаю, что ECB выдаст одинаковый результат для идентичных блоков открытого текста, зашифрованных с одинаковыми ключами. Следовательно, его не следует использовать для нескольких блоков данных, потому что информацию об открытом тексте можно распознать путем статистического анализа данных. Исходя из этого, может показаться, что если бы вы могли гарантировать, что ваши данные всегда меньше 16 байт (128 бит), это устранило бы проблему статистической атаки. Кроме того, если бы вы также могли гарантировать, что никогда не шифруете один и тот же открытый текст одним и тем же ключом, вы никогда не получите тот же результат. Поэтому мне кажется, что использование ECB безопасно, если ваша система всегда будет соответствовать этим очень строгим критериям.

CBC и IV

Я знаю, что CBC призван устранить обе эти проблемы. Объединяя блоки в цепочку, он устраняет многоблочную статистическую атаку ECB. Никогда не используя один и тот же IV для одного и того же ключа AES, вы устраняете проблему шифрования одним и тем же открытым текстом одного и того же вывода с одним и тем же ключом.

Ключевая уникальность

Если каждый клиент получает сгенерированный ключ AES, тогда, хотя существует небольшая вероятность того, что несколько пользователей будут иметь один и тот же ключ, шансы чрезвычайно малы. Поэтому можно с уверенностью предположить, что никакие два клиента не будут использовать один и тот же ключ AES.

Предлагаемое решение

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

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

Я считаю, что этот IV защищен от статистической атаки, потому что он равен размеру блока AES. Вдобавок он будет разным для каждого пользователя каждый раз, потому что у каждого пользователя будет уникальный ключ, а счетчик всегда будет увеличиваться. Очевидно, что ключи AES должны передаваться безопасно (прямо сейчас клиент шифрует сгенерированный ключ открытым ключом RSA сервера).

Мои вопросы

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

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

Заранее спасибо.


person rhololkeolke    schedule 12.07.2011    source источник
comment
Вы можете спросить об этом в разделе безопасности StackExchange.   -  person 101100    schedule 13.07.2011
comment
Насколько я могу судить, ваше понимание правильное, но в криптографии вы никогда не захотите изобретать велосипед. Как именно ваш клиент и сервер согласовывают свой общий ключ? Есть ли причина, по которой вы не можете рассматривать общий секрет как пароль и использовать такой стандарт, как PBKDF2, для создания ключевого материала?   -  person Nemo    schedule 13.07.2011
comment
Я пытался избежать статического пароля любого типа, поэтому я просто не использовал общий секрет. Я не знаком с PBKDF2. Достаточно ли хороша Википедия, чтобы получить хорошее представление о ней, или у вас есть другое место, чтобы предложить?   -  person rhololkeolke    schedule 13.07.2011


Ответы (3)


Как указано в комментариях, я бы избегал изобретать протокол любой ценой и скорее попытался бы реализовать стандартизованный протокол. Некоторые протоколы OTP требуют, чтобы клиенты использовали второе внеполосное устройство для получения OTP при входе на сервер, общий сценарий с банками заключается в том, что после вашего запроса на вход в серверное приложение сервер отправит вам OTP на Ваш сотовый телефон. Генераторы OTP для клиента и сервера обычно синхронизируются по времени или противосинхронизируются, если я правильно понял, вы планируете использовать последнее решение. Я не нашел в вашем описании, как вы собираетесь управлять счетчиком клиента на отдельном устройстве?

В любом случае, я бы рекомендовал использовать стандартизированную процедуру, которая была «проверена в полевых условиях», вместо того, чтобы использовать мою собственную схему. HOTP может быть тем, что вы ищете, хотя он использует решение HMAC с ключом, а не симметричное шифрование, но это должно упростить задачу, так как вам больше не нужно беспокоиться о внутривенном введении.

В любом случае вам следует заранее спланировать, как вы хотите установить симметричные ключи с вашими клиентами. Если вы не можете справиться с этим по безопасному каналу (например, лично передать ключи), это станет проблемой для безопасности всей системы.

person emboss    schedule 13.07.2011
comment
У меня нет внешнего устройства для распространения ключа, иначе я бы им воспользовался. Мне нравится звучание HOTP, посмотрю ссылку. Если это звучит так, как будто для меня это сработает, то, вероятно, я этим и займусь. Что касается установки ключей, я генерирую их на клиенте, а затем шифрую с помощью открытого ключа сервера перед отправкой. Насколько я понимаю, это довольно стандартный способ надежно установить симметричные ключи. - person rhololkeolke; 13.07.2011
comment
@rhololkeolke: Говоря языком учебников о криптографии, да, но тогда вы все равно подвержены атакам с повторением, атакам с ретрансляцией и прочим. Почему бы не взять что-то, что доказало свою надежность и безопасность, например TSL (бывший SSL) для транспорта? - person emboss; 13.07.2011
comment
Все это предназначено для использования в небольшой некоммерческой организации. На их веб-сайте есть только самоподписанный сертификат. Я собираюсь настаивать на правильном сертификате, но мне нужен другой способ обмена ключами, который бы дополнял / заменял их самоподписанный сертификат. Есть ли у вас какие-либо предложения или обмен ключами некорректен без надлежащего сертификата? - person rhololkeolke; 13.07.2011
comment
@rhololkeolke: Теоретически это не так, вы можете использовать https с самоподписанным сертификатом. Проблема с этими некоммерческими сертификатами заключается в том, что они явно не включены во встроенные механизмы доверия браузеров. Это означает, что любой клиент сначала должен добавить этот самозаверяющий сертификат в свое хранилище доверенных сертификатов, что нормально, когда вы находитесь в закрытой среде, но непрактично и считается плохой практикой для неограниченной группы пользователей, например в сети. - person emboss; 13.07.2011
comment
Я понимаю. Я пытался предотвратить атаку MITM. Но если я упакую самоподписанный сертификат с клиентом, то MITM-атака будет невозможна. Я просто перейду на использование TLS с самоподписанным сертификатом и загляну в HOTP. Спасибо за помощь. - person rhololkeolke; 13.07.2011

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

person DarkSquirrel42    schedule 13.07.2011

Вы даже можете отказаться от части ECB, в принципе, единственное, что действительно важно для IV - это то, что он должен быть уникальным, а счетчик вполне может им быть. Поскольку сложно добиться уникальности счетчика во время атак (см., Например, шифрование WEP), гораздо лучше использовать безопасное случайное число (настоящее безопасное случайное число, а не безопасное случайное число Sony PS3 или безопасное случайное число XKCD).

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

person Maarten Bodewes    schedule 14.07.2011