Шифрование файлов с помощью AES, шифрование ключа с помощью RSA - я на правильном пути?


Обзор: Я пытаюсь разработать приложение, которое будет шифровать файлы для безопасной отправки черезSnail Mail (большие наборы данных). Я планирую использовать шифрование AES/RijndaelManaged из .Net для шифрования файлов изначально, используя случайно сгенерированный ключ с использованием RNGCryptoServiceProvider. Затем я шифрую этот случайный ключ AES открытым ключом RSA. Получатель данных-единственный, у кого есть закрытый ключ RSA для его расшифровки.

Мой вопрос: является ли это правильным как можно сделать что-то подобное? Если да, то безопасно ли отправлять этот зашифрованный RSA ключ с данными, поскольку для его расшифровки требуется закрытый ключ?

EDIT - согласно ответам, это действительно правильный путь.

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

4 2

4 ответа:

Используйте PGP, если нет веской причины этого не делать. PGP-это открытый и повсеместный стандарт гибридной криптографии, широко используемый в электронной почте. Существует множество реализаций PGP. Единственное .Чистый я знаю, это проект после установки BouncyCastle шифрования на C# библиотека. PGP фактически предоставляет набор функций, которые вы описываете; например, PGP может также подписывать сообщения цифровой подписью.

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

Пожалуйста, не повторяйте PGP, если он делает то, что вы хотите. PGP довольно широко поддерживается. Более того, у простых смертных вроде меня (и, вероятно, вас) едва ли есть шанс на спасение. чтобы все было правильно.

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

Это, по сути, то, что делает SSL. RSA используется для аутентификации и обмена ключами симметричного сессионного ключа (например, AES), который затем используется для тела связи.

Традиционный способ сохранить закрытый ключ (используемый в GPG/PGP/PKCS#1 / PKCS#8)-это защитить его паролем с сильной парольной фразой и вставить в файл. Большинство инструментов управления хранилищем ключей имеют возможность экспортировать ключи в формате PKCS#1/PKCS#8 - вы генерируете ключ на одной машине, экспортируете его с паролем и импортируете его на другой машине; ключ находится только за пределами хранилища ключей с целью передачи его между машинами.