Генерация пар открытых/закрытых ключей (RSA) на C#

Понадобилось мне создать пару открытый/закрытый ключ на C#. Я поискал немного и нашел замечательную криптографическую библиотеку под названием Bouncy Castle: https://www.bouncycastle.org/. Для C# исходники можно скачать здесь: http://www.bouncycastle.org/csharp/. Ниже описан порядок установки и использования.

  1. Качаем bccrypto-net-1.7-src.zip, распаковываем в какой-нибудь каталог на диске.

  2. Открываем проект csharp.sln в Visual Studio 2010.

  3. В свойствах проекта crypto в Build->General->Conditional compilation symbols комментируем INCLUDE_IDEA.

  4. Пробуем выполнить 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 (‘Неопознанная ошибка ‘)

  5. Удаляем из проекта crypto отсутствующие файлы:
    src\crypto\engines\IDEAEngine.cs
    src\asn1\misc\IDEACBCPar.cs
    test\src\crypto\test\IDEATest.cs

  6. Пробуем еще раз выполнить Build - на этот раз все должно получиться и будет создана библиотека crypto.dll.

  7. Прописываем созданную библиотеку в References проекта.

  8. Код для генерации пары открытый/закрытый ключ приведен ниже. Открытый ключ - в формате 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