Вопрос
Мне было поручено реализовать библиотеку PKI на C# для проекта компании, и я не смог найти ее хорошую реализацию.Похоже, существует несколько библиотек и множество неработающих ссылок, указывающих на библиотеки MSDN, которые были удалены.Я видел людей, использующих Crypt32.dll, людей, создающих свои собственные библиотеки, людей, использующих P/Invoke для доступа к хранилищам системных сертификатов, людей, расширяющих встроенные библиотеки, примеры, которые просто не применимы к C# (например,примеры Java) и коммерческие библиотеки.
Мой вопрос: какая реализация/библиотека наиболее рекомендуется для простого шифрования/дешифрования данных?
В качестве основы того, что я планирую с ним делать, мне просто нужно зашифровать сообщения с помощью закрытого ключа (.pfx) и расшифровать с помощью открытых ключей (.cer).Подписание сообщений и аутентификация не требуются на этом уровне проекта, хотя это может потребоваться в будущем.Я видел ссылку на длину шифрования, которая меня беспокоит.Нам нужно иметь возможность шифровать сообщения любой длины (конечно, в пределах разумного!).Стоит ли мне беспокоиться об этом, и если да, то есть ли способ с этим справиться?
Я бы предпочел не хранить открытые/закрытые ключи в диспетчере сертификатов Windows, если это вообще возможно, но если это значительно упрощает реализацию, пусть будет так.
Я понимаю, что PKI и шифрование — это большая и сложная тема, но я все равно надеюсь на относительно простую библиотеку...(можно надеяться, правда?)
Спасибо!
Решение
Ну, вы не упомянули, что встроенный класс не удовлетворяет вашим потребностям, так как насчет System.Security.Cryptography.RSACryptoServiceProvider?
Он имеет большой набор квалифицированных способов асимметричного шифрования/дешифрования потоков.
Есть несколько учебных пособий/руководств, которые помогут вам:
http://www.codeproject.com/KB/security/RSACryptoPad.aspx
http://www.eggheadcafe.com/articles/20020630.asp
Есть бесчисленное множество других, которые можно найти через Google.
Обновлять:Что касается ограничений длины, проблем не должно возникнуть, если вы просто реализуете один и тот же алгоритм буфера с обеих сторон, шифрование и дешифрование.
Обновление2:Да, мой пример был RSACryptoProvider, но вы можете использовать любой класс, производный от System.Security.Cryptography.AsymmetricAlgorithm, если вам нужно решение с открытым/закрытым ключом.Или построить свой собственный...а может и нет :)
Другие советы
Да, а что не так со встроенными классами?
И если вы не хотите использовать хранилище сертификатов Windows, вы можете использовать что-то вроде этого
RSACryptoServiceProvider rscp = new RSACryptoServiceProvider();
rscp.FromXmlString("<RSAKeyValue><Modulus>key data gere</Modulus><Exponent></Exponent></RSAKeyValue>");
Однако не уверен, что это хорошая идея для закрытых ключей.
Есть хороший урок по этой теме здесь