Рейтинг:0

Могу ли я использовать половину 256-битного ключа в качестве AES 256 IV?

флаг cn

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

Мое шифрование AES256 обрабатывается с помощью ключа случайного 256-битного ключа и IV, сгенерированного из текстовой строки.

Я думаю о MD5 для создания такого ключа, но MD5 кажется устаревшим.

Итак, должно ли быть нормально, если я использую SHA256 для создания 256-битного ключа, а затем разделяю шестнадцатеричную строку ключа поровну на 2 части и использую первую часть в качестве IV в 256-битном шифровании AES?

kelalaka avatar
флаг in
НЕЕЕТ!! IV общедоступен, а ключ секретен! Ты выдал половину своего секрета!
Kim Mỹ avatar
флаг cn
не могли бы вы уточнить, кому это дается? Я имею в виду, что ключ полностью случайный, и весь 256-битный IV не сохраняется, только пользователи знают его, только чтобы использовать половину?
kelalaka avatar
флаг in
Вы не упомянули об этом. В любом случае, используйте $IV = SHA256(ключ, случайный\; соль)$, чтобы быть в безопасности. IV не должен быть секретным...
poncho avatar
флаг my
Вы собираетесь зашифровать более одного сообщения одним и тем же ключом (и, следовательно, по вашему предложению, одним и тем же IV)? Если нет, то в режиме CTR или режиме GCM это полностью не работает (даже с секретным IV); с режимом CBC это не так плохо, но произойдет утечка информации о том, имеют ли два сообщения общий префикс (что все же больше информации, чем мы хотели бы, чтобы противник имел)
Maarten Bodewes avatar
флаг in
Остерегайтесь, такие вещи, как создание/вывод ключа MD5 и шестнадцатеричное кодирование ключей, являются большими красными флажками. Я часто вижу это на [so], и в 99% случаев это означает, что пользователи понятия не имеют, что они делают.
Рейтинг:1
флаг in

Итак, должно ли быть нормально, если я использую SHA256, генерирую 256-битный ключ, а затем разделяю шестнадцатеричную строку ключа поровну на 2 части и использую первую часть в качестве IV в 256-битном шифровании AES?

Нет, есть способы лучше.

Прежде всего, когда вы создаете ключ, вам нужен криптографически безопасный генератор случайных чисел. если ты вывести ключ из главного секрета — иногда называемый начальным числом — вам нужна функция деривации ключа или KDF. В последнем случае вы могли бы, например. используйте HKDF с хорошим хэшем, например SHA-256. В принципе, вы можете создать, например. 384-битный вывод с использованием HKDF - даже при использовании SHA-256, но я не думаю, что это хорошая идея из-за следующей части ответа.


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

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

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

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


Наконец, клавиши не буквенно-цифровые; они состоят из битов. Каждый раз, когда ключ переводится в текст, вы открываете проблему безопасности. Так что не делайте этого: сохраняйте ключи бинарными.Я бы предпочел использовать AES-128 с полностью случайным ключом и использовать остальные 128 бит для IV, чем вернуться к использованию шестнадцатеричных чисел.

Шестнадцатеричные числа полезны только для потребления человеком, например. во время тестирования или отладки, когда речь идет о секретных ключах.

Рейтинг:0
флаг us

Я предполагаю, что вы не раскрываете этот IV. Зависит от того, что вы хотите и какой режим вы используете. IV для AES должен быть 128-битным для таких режимов, как OFB, CBC или CFB, но обычно он короче для таких режимов, как CTR или его варианты с проверкой подлинности, где наиболее распространенным способом создания блока, используемого для генерации потока, будет конкатенация IV (одноразовый номер) и прилавок. Может быть много проблем с использованием части ключа в качестве IV:

На этот раз я не знаю огромного риска, связанного с безопасностью, связанного с раскрытием $E_k(k_{0..|k|/2})$ или же $E_k(k_{0..|k|/2} \oplus P)$ или же $E_k(k_{0..m} || контроль)$ для некоторого известного сообщения $P$ для полного AES (пожалуйста, исправьте, если я ошибаюсь). Это функции, которые вы можете увидеть в зависимости от используемых режимов. Однако фактическое использование может быть небезопасным.

  1. По существу делает ваше шифрование детерминированным. Таким образом, это не полностью скрывает сообщение. Для таких режимов, как CBC или CFB, вы можете обнаружить общие префиксы (префиксы полного блока в сообщении). Для CFB это также может позволить вам вывести взаимосвязь между простыми текстами, соответствующими первым расходящимся блокам, в частности $P_{1_i} \oplus P_{2_i}$ где шифротексты расходятся в $ я ^ {й} $ блокировать. Для таких режимов, как CTR или OFB, если вы когда-нибудь повторно используете ключ, это может быть разрушительным, вы можете вывести отношение xor для всего открытого текста для этих двух. Эта проблема сохраняется, даже если вы используете MD5 для IV. Следовательно, это делает его очень непригодным для повторного использования, даже случайно, что легче сказать, чем сделать.

  2. В некоторых протоколах, если злоумышленник находит способ получить $E_k(k_{0..|k|/2})$ например, обманом в шифровании $0^{|к|}$ в режиме CBC, а затем обмануть их в шифровании $p_i||c_{i}$ где он получил $с_{я}$ от предыдущего взаимодействия, чтобы выявить $E_k(0^{|k|})$, он может обманом заставить их раскрыть половину ключа, попросив расшифровать $E_k(0^{|k|})$. Это не моя первоначальная идея, поэтому я предлагаю вам посмотреть ответ fgrieu на Здесь, см. недостаток 2.

  3. Его использование может быть безопасным, если вы не используете повторно ключ или другие подобные протоколы. Для таких режимов, как CBC или даже ECB с некоторой высокой энтропией (случайные) сообщения без известной структуры также могут подойти, если вы используете их более одного раза.

SAI Peregrinus avatar
флаг si
«Я предполагаю, что вы не раскрываете этот IV». Это предположение плохо. Анализ безопасности всех распространенных режимов AES предполагает общедоступный IV. Таким образом, вам придется изобрести новый режим с секретным IV и убедиться, что он защищен (существующие библиотеки не пытаются скрыть IV). Это означает добавление сопротивления бокового канала к обработке IV. Это намного сложнее, чем просто использовать хэш или KDF для ключа, или, что еще лучше, режим SIV.
Manish Adhikari avatar
флаг us
@SAIPeregrinus Согласно вопросу ОП, IV является частью ключа, поэтому я предположил, что это то, чего хотел ОП.
SAI Peregrinus avatar
флаг si
Да, но IV является общедоступным по определению. Таким образом, никакие программные библиотеки не пытаются его скрыть, в большинстве случаев он добавляется к выводу зашифрованного текста! Таким образом, вопрос сводится к «а что, если я передам злоумышленникам половину секретного ключа».
poncho avatar
флаг my
В режиме ECB мы обычно не особо беспокоимся о IV... :-)
Kim Mỹ avatar
флаг cn
Спасибо вам всем! Если IV должен быть общедоступным и добавляться перед зашифрованным выводом, это означает, что я должен поменять местами IV как ключ и ключ как IV?
Kim Mỹ avatar
флаг cn
Можно ли преобразовать зашифрованный вывод base64 и показать IV?
Manish Adhikari avatar
флаг us
Поменяйте местами IV и ключ, что вы имеете в виду? Я надеюсь, вы не предлагаете хранить ключ в открытом доступе и IV в секрете, это не обеспечивает никакой безопасности.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.