2010-05-13 7 views
2

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

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

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

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

+0

Звучит неплохо. Увеличенная скорость для больших файлов, а также вы можете поддерживать несколько получателей, включив в себя один ключ AES несколько раз, зашифрованный с помощью разных ключей RSA. – Thorarin

+0

Что вы используете для открытого ключа RSA для шифрования ключа RSA, который вы упоминаете? Я предполагаю, что вы используете режим RSA CBC? – JM4

ответ

3

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

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

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

+0

+1 для рекомендации PGP вместо запуска. –

+0

Спасибо, я посмотрю, смогу ли я использовать PGP для этого. Я обычно сталкиваюсь с блокпостом, когда я хочу использовать ранее существовавший инструмент здесь, им нравится делать все в доме. :( –

+0

Криптография должна * никогда * быть сделана в доме, если ваш дом не набит криптографами мирового класса и математиками –

3

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

+0

Спасибо, зная, что это называется, определенно поможет в моих исследованиях! –

2

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

0

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