Генерация пар открытых/закрытых ключей (RSA) на C#
Понадобилось мне создать пару открытый/закрытый ключ на C#. Я поискал немного и нашел замечательную криптографическую библиотеку под названием Bouncy Castle: https://www.bouncycastle.org/. Для C# исходники можно скачать здесь: http://www.bouncycastle.org/csharp/. Ниже описан порядок установки и использования.
Качаем bccrypto-net-1.7-src.zip, распаковываем в какой-нибудь каталог на диске.
Открываем проект csharp.sln в Visual Studio 2010.
В свойствах проекта crypto в Build->General->Conditional compilation symbols комментируем INCLUDE_IDEA.
Пробуем выполнить Build и видим ошибки:
error CS1504: Source file ‘C:\temp\csharp\crypto\src\crypto\engines\IDEAEngine.cs’ could not be opened (‘Неопознанная ошибка ‘)
error CS1504: Source file ‘C:\temp\csharp\crypto\test\src\crypto\test\IDEATest.cs’ could not be opened (‘Неопознанная ошибка ‘)
error CS1504: Source file ‘C:\temp\csharp\crypto\src\asn1\misc\IDEACBCPar.cs’ could not be opened (‘Неопознанная ошибка ‘)Удаляем из проекта crypto отсутствующие файлы:
src\crypto\engines\IDEAEngine.cs
src\asn1\misc\IDEACBCPar.cs
test\src\crypto\test\IDEATest.csПробуем еще раз выполнить Build - на этот раз все должно получиться и будет создана библиотека crypto.dll.
Прописываем созданную библиотеку в References проекта.
Код для генерации пары открытый/закрытый ключ приведен ниже. Открытый ключ - в формате PKCS#8. Закрытый ключ - в формате PKCS#1.
using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;
using Org.BouncyCastle.Crypto.Generators;
RsaKeyPairGenerator rsa = new RsaKeyPairGenerator();
rsa.Init(new KeyGenerationParameters(new Org.BouncyCastle.Security.SecureRandom(), 1024));
AsymmetricCipherKeyPair pair = rsa.GenerateKeyPair();
PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(pair.Private);
byte[] serializedPrivateBytes = privateKeyInfo.PrivateKey.ToAsn1Object().GetDerEncoded();
string privateKey = Convert.ToBase64String(serializedPrivateBytes);
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pair.Public);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
string publicKey = Convert.ToBase64String(serializedPublicBytes);===
Перепечатка материалов блога разрешается с обязательной ссылкой на blog.coolsoftware.ru