Есть ли способ выполнить шифрование закрытым ключом в 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 байт в длину.