Автоматизация бизнеса

Пользовательский поиск

пятница, 8 июня 2012 г.

Библиотека Bouncy Castle и C#, шифрования RSA

Bouncy Castle — это набор API используемого в криптографии. Включает в себя интерфейсы для языков программирования Java и C#.
Библиотеку Bouncy Castle можно скачать по этой ссылке.
Что такое RSA и как реализовать в .Net обсуждалось в теме "Асимметричное шифрование c# (RSA)". В этой теме будем говорить как шифровать RSA ключом с помощью библиотеки Bouncy Castle. Надо заметить что .Net Framework не поддерживает работу с pem ключами, и для этого нам на помощь приходит библиотека Bouncy Castle.
На примере увидим как шифровать RSA ключом, когда есть pem файлы.
Сперва необходимо подключить пространства имен, а так же добавить ссылку на библиотеку Bouncy Castle.
using System.IO;
using System.Security.Cryptography;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto.Parameters;

Как нам известно будем шифровать публичном ключом и расшифровать приватном.
Для шифровки напишем следующий код


                StreamReader sr = new StreamReader("public.pem"); //Надо указать путь к pem  файлу
                PemReader pr = new PemReader(sr);
                RsaKeyParameters KeyPair = (RsaKeyParameters)pr.ReadObject();
                RSAParameters rsapar = new RSAParameters();
                sr.Close();
                rsapar.Modulus = KeyPair.Modulus.ToByteArrayUnsigned();
                rsapar.Exponent = KeyPair.Exponent.ToByteArrayUnsigned();
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.ImportParameters(rsapar);
                encrypted = rsa.Encrypt(Encoding.Default.GetBytes("HELLO WORLD"), false);
                string enc = Convert.ToBase64String(encrypted);

В строке enc содержится уже зашифрованная строка HELLO WORLD в виде Base64. Преобразование шифрованной строки в Base64 необязательно, но строку Base64 можно сохранить и опять преобразовать в байты без каких либо потерь.



Теперь, когда мы уже можем шифровать строку, попробуем расшифровать.
Следующий код для расшифровки


                StreamReader sr = new StreamReader("private.pem"); //Надо указать путь к pem  файлу
                IPasswordFinder passwordFinder = new PasswordStore("Karen".ToCharArray()); //Пароль от    pem файла
                PemReader pr = new PemReader(sr, passwordFinder);
                AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pr.ReadObject();
                RSAParameters rsapar = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)KeyPair.Private);
                sr.Close();
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.ImportParameters(rsapar);
                byte[] cc = Convert.FromBase64String(txtEncrypted.Text); //Текст бокс где находится зашифрованный текст в Base64 формате
                byte[] decrypted = rsa.Decrypt(cc, false); //Получаем расшифрованные байты
                string decr = Encoding.UTF8.GetString(decrypted); //Получаем расшифрованную строку


И ещё надо добавить класс реализующий интерфейс IPasswordFinder

class PasswordStore : IPasswordFinder
        {
            private char[] password;

            public PasswordStore( char[] password)
            {
                this.password = password;
            }

            public char[] GetPassword()
            {
                return (char[])password.Clone();
            }
        }

Так же можете скачать Демо программу. Если исходники понадобятся пишите в комментариях. УДАЧИ!!!

13 комментариев:

  1. Добрый день. Закиньте исходник на test_woker@mail.ru пожалуйста).

    ОтветитьУдалить
  2. Добрый день. При вызове метода PemReader.ReadObject() генерируется исключение TypeInitializationException. Не могу понять с чем это может быть связано. Использую приватный ключ
    -----BEGIN RSA PRIVATE KEY-----
    MIICXQIBAAKBgQCWX.....
    -----END RSA PRIVATE KEY-----

    ОтветитьУдалить
    Ответы
    1. А какой утилитой Вы создаете ключ? и если возможно выложите код который обрабатывает код ключа.

      Удалить
    2. Ключ, экспортирую из .jks файла утилитой KeyTool IUI. Портирую Android приложение на Windows Phone 7. Код такой
      var ResourceStream = Application.GetResourceStream(new Uri("Resources/key.pem", UriKind.Relative));
      StreamReader streamReader = new StreamReader(ResourceStream.Stream);
      PemReader pr = new PemReader(streamReader);
      RsaKeyParameters KeyPair = (RsaKeyParameters)pr.ReadObject();

      Удалить
    3. А пароль к приватному ключу у вас есть?

      Удалить
    4. пароль есть на jks файл.

      Удалить
    5. Пароль к jks файлу это другое, Вам нужно сперва JKS преобразовать в PKCS12 и после в pem. вот полезная ссылка http://www.swview.org/node/191 .

      Удалить
    6. К сожалению, не помогло

      Удалить
    7. Я подозреваю, что проблема не в ключах, а в том, что я что-то упустил, когда компилировал исходники Bounty Castle под Windows Phone,

      Удалить
    8. А какая версия оперативки Windows Phone?

      Удалить
    9. эмулятор с 512 Мб

      Удалить
    10. А Вы смотрели все inner exception-ы может там есть подсказка. И еще при компиляции исходника может надо добавить флаг для SILVERLIGHT.

      Удалить