четверг, 29 мая 2014 г.

Генерация пар открытых/закрытых ключей (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.

    1. using Org.BouncyCastle.Asn1.Pkcs;
    2. using Org.BouncyCastle.Asn1.X509;
    3. using Org.BouncyCastle.Crypto;
    4. using Org.BouncyCastle.Crypto.Parameters;
    5. using Org.BouncyCastle.Pkcs;
    6. using Org.BouncyCastle.Security;
    7. using Org.BouncyCastle.X509;
    8. using Org.BouncyCastle.Crypto.Generators;
    9.  
    10. RsaKeyPairGenerator rsa = new RsaKeyPairGenerator();
    11. rsa.Init(new KeyGenerationParameters(new Org.BouncyCastle.Security.SecureRandom(), 1024));
    12. AsymmetricCipherKeyPair pair = rsa.GenerateKeyPair();
    13. PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(pair.Private);
    14. byte[] serializedPrivateBytes = privateKeyInfo.PrivateKey.ToAsn1Object().GetDerEncoded();
    15. string privateKey = Convert.ToBase64String(serializedPrivateBytes);
    16. SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pair.Public);
    17. byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
    18. string publicKey = Convert.ToBase64String(serializedPublicBytes);

===
Перепечатка материалов блога разрешается с обязательной ссылкой на blog.coolsoftware.ru