Должен ли я генерировать ключ из хеша для шифрования?

В настоящее время я использую 256-битный Rijndael в режиме CBC для шифрования некоторых данных, которые необходимо отправить в другое место. Чтобы повысить безопасность, я беру случайно сгенерированный хэш SHA-256 и использую формулу, чтобы отрубить его разные части, чтобы использовать ключ шифрования и вектор инициализации (конечно, хеш отправляется вместе с данными). Формула для генерации ключа и IV довольно проста, и поскольку код написан на PHP, он закодирован на странице, доступной пользователю. Что мне интересно: это более или менее безопасно, чем иметь один постоянный ключ и / или IV?


person Palladium    schedule 27.06.2012    source источник
comment
Если ключ отправляется с данными, это не шифрование, а просто обфускация.   -  person Hot Licks    schedule 27.06.2012
comment
Основное правило криптографии - никогда не использовать повторно одну и ту же комбинацию ключ + IV. Это означает, что у каждого сообщения должен быть свой IV.   -  person David R Tribble    schedule 27.06.2012
comment
На самом деле это не основное правило, иначе не было бы идеи о том, чтобы ключ сеанса был спроектирован очень хорошими криптографами. Однако это хорошее правило, если вы действительно можете его выполнить !!!   -  person trumpetlicks    schedule 27.06.2012


Ответы (2)


Вероятно, это НЕ тот путь, по которому вы хотите идти. По сути, хорошему хакеру не понадобится много времени, чтобы выяснить вашу математическую формулу для управления HASH для генерации вашего ключа и IV. Таким образом, вы, по сути, отправляете ключи от королевства вместе с самим королевством.

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

Теперь у обеих сторон есть связь. сеансовый ключ канала и ваши НАСТОЯЩИЕ данные могут быть зашифрованы с помощью этого ключа, поскольку сеансовый ключ не был отправлен в открытом виде.

Риджиндаэль является примером симметричного криптоалгоритма, в котором криптоалгоритмы с открытым ключом асимметричны. Примеры криптоалгоритмов с открытым ключом: RSA, ECDSA (Crypto) и т. Д.

person trumpetlicks    schedule 27.06.2012
comment
Спасибо за информацию. Из-за трудностей с передачей сеансового ключа я решил использовать один ключ шифрования для всего процесса. Как я могу сделать это безопаснее? - person Palladium; 27.06.2012
comment
На самом деле вы не можете, если у вас есть единственный ключ, то в какой-то момент через ссылку пройдет достаточно данных для попытки криптографической атаки. - person trumpetlicks; 27.06.2012
comment
Еще кое-что. Есть ли какие-либо преимущества в асимметричном шифровании и отправке идентификатора сеанса для использования в качестве симметричного ключа шифрования для расшифровки моих данных, в отличие от простого открытого ключа для шифрования самих данных? - person Palladium; 27.06.2012
comment
Асимметричное по сути является шифрованием с открытым ключом !!! Идея состоит в том, что открытый ключ является асимметричным, потому что ключ для дешифрования отличается от ключа для шифрования. Вы (владелец секрета) зашифруете ключ симметричного алгоритма, используя свой закрытый асимметричный ключ. Никто, кроме вас, не знает этот закрытый асимметричный ключ. Каждый, кого вы ХОТИТЕ знать, может получить ваш публичный ключ дешифрования. Теперь это защищает симметричный сеансовый ключ, поскольку только те, о которых вы хотите знать, будут знать о нем, и даже они никогда не получат ваш закрытый асимметричный ключ, поэтому вы всегда можете изменить симметричный ключ. - person trumpetlicks; 27.06.2012
comment
Я знаю об этом. Я имел в виду, что я не понимал, почему я должен асимметрично зашифровать ключ для симметричного шифрования моих данных, когда асимметричное шифрование моих данных (по крайней мере, из моего ограниченного понимания криптологии) работает так же хорошо, поскольку асимметричное шифрование - более сложный бит. сломать. В конце концов, если бы они могли взломать мои асимметрично зашифрованные данные, они могли бы взломать мой асимметрично зашифрованный ключ, а затем использовать его для кражи моих данных. - person Palladium; 27.06.2012
comment
Обычно это не делается во многих приложениях, потому что асимметричные алгоритмы ОЧЕНЬ ОЧЕНЬ МЕДЛЕННЫЕ. Из-за этого вы, по сути, делаете это один раз, чтобы зашифровать сеансовый ключ для НАМНОГО БЫСТРЕЕ симметричного алгоритма. Большинство симметричных алгоритмов во много раз быстрее асимметричных алгоритмов. - person trumpetlicks; 27.06.2012

О генерации ключей краткосрочного использования. Имейте долгосрочный ключ. Согласуйте формат даты с получателем. Каждый день объединяйте свой долгосрочный ключ с датой дня и хешируйте его с помощью SHA-256, чтобы сгенерировать дневной ключ для использования только в эту дату:

dayKey <- SHA256("my very secret long term key" + "2012-06-27")

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

Вам нужно будет согласовать протоколы примерно на полночь и некоторые другие детали.

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

person rossum    schedule 27.06.2012