Понадобилось мне создать пару открытый/закрытый ключ на C#. Я поискал немного и нашел замечательную криптографическую библиотеку под названием Bouncy Castle: https://www.bouncycastle.org/. Для C# исходники можно скачать здесь: http://www.bouncycastle.org/csharp/. Ниже описан порядок установки и использования.
===
Перепечатка материалов блога разрешается с обязательной ссылкой на blog.coolsoftware.ru
- Качаем 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