RSA шифрование с закрытым ключом - PullRequest
4 голосов
/ 24 июля 2010

Есть ли способ выполнить шифрование закрытым ключом в C #?

Я знаю о стандарте RSACryptoServiceProvider в System.Security.Cryptography, но эти классы обеспечивают только шифрование с открытым ключом и дешифрование с закрытым ключом . Кроме того, они предоставляют функцию цифровой подписи, которая использует внутреннее шифрование закрытого ключа , но нет никаких общедоступных функций для выполнения шифрования закрытого ключа и дешифрования с открытым ключом .

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

Знаете ли вы какие-нибудь хорошие компоненты (желательно бесплатные) для выполнения шифрования закрытым ключом ?
Я использую .NET 3.5.

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

Дополнительное объяснение

Считайте, что у вас есть

var bytes = new byte[30] { /* ... */ };

и вы хотите использовать 2048bit RSA, чтобы убедиться, что никто не изменил ничего в этом массиве.

Обычно вы используете цифровую подпись (т. Е. RIPEMD160), которую затем присоединяете к исходным байтам и отправляете получателю.

Итак, у вас есть 30 байтов исходных данных и дополнительные 256 байтов цифровой подписи (потому что это 2048bit RSA), что в целом составляет 286 байт . Однако, только 160 битов из этих 256 байтов на самом деле являются хэшем, поэтому в точности не используется 1888 бит ( 236 байтов ).

Итак, моя идея была такой:

Возьмите 30 байтов исходных данных, присоедините к нему хэш ( 20 байтов ) и зашифруйте эти 50 байтов . Вы получаете сообщение длиной 256 байт , что намного короче 286 байт , потому что «вы смогли вставить фактические данные в цифровую подпись».

Ресурсы ECDSA

* MSDN 1082 *
Eggheadcafe.com
c-plusplus.de
Блог MSDN
Wiki

Ресурсы DSA

CodeProject
MSDN 1
MSDN 2
MSDN 3

Окончательное решение

Если кому-то интересно, как я решил эту проблему, я собираюсь использовать 1024bit DSA и SHA1, которые широко поддерживаются во многих различных версиях Windows (Windows 2000 и новее), безопасность хорошая достаточно (я не подписываю заказы, мне просто нужно убедиться, что какой-то ребенок не может взломать подпись на своем iPhone (:-D)), а размер подписи составляет всего 40 байт в длину.

Ответы [ 4 ]

3 голосов
/ 24 июля 2010

То, что вы пытаетесь создать, называется «Схема подписи с восстановлением сообщений».

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

Одним предложением для схем подписи с восстановлением сообщений является RSA PSS-R. Но, к сожалению, это предложение защищено патентом.

Группа стандартизации IEEE P1363 однажды обсуждала добавление схем подписи с восстановлением сообщений. Однако я не уверен в текущем состоянии этих усилий, но, возможно, стоит проверить.

2 голосов
/ 24 июля 2010

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

Итак, вот основная идея:

  1. Создание ключа сеанса с использованием криптографически стойкого ГСЧ.

  2. Передача через PKE.

  3. Используйте ключ сеанса для создания HMAC-SHA1 (или HMAC-RIPEMD160, или чего-либо еще).

  4. Если размер хеша для данных данных абсурдно велик, разрежьте его пополам, XOR верх с низом. Повторите при необходимости.

  5. Отправьте данные и (возможно, сокращенный) хэш.

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

  7. Часто меняйте сеансовые ключи.

Это компромисс между безумием катания вашей собственной системы и использованием неподходящей системы.

Я широко открыт для конструктивной критики ...

2 голосов
/ 24 июля 2010

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

В .NET ваши закрытый и открытый ключи хранятся в структуре RSAParameters.Структура содержит поля для:

  • D
  • DP
  • DQ
  • Экспонент
  • InverseQ
  • Модуль
  • P
  • Q
1 голос
/ 24 июля 2010

Я понял это сейчас, после прочтения комментариев.

Ответ: не делайте этого.

Алгоритмы криптографической подписи не являются алгоритмами, из которых выможет выбирать и изменять - или изменять - шаги.В частности, предположим, что подпись sig выглядит примерно так: encrypt(hash), orig + sig - это , а не так же, как encrypt(orig + hash).Более того, даже устаревшие алгоритмы подписи, такие как PKCS v1.5 , не так просты, как, например, encrypt(hash).

Методика, подобная той, которую вы описываете, жертвует безопасностью ради хитрости,Если у вас нет пропускной способности для 256-байтовой подписи, вам понадобится один из:

  1. другого алгоритма,
  2. больше пропускной способности или
  3. aменьший ключ.

И если вы воспользуетесь (1), убедитесь, что это не алгоритм, который вы составили!Простым фактом является то, что крипто сложный .

...