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();
}
}
Так же можете скачать Демо программу. Если исходники понадобятся пишите в комментариях. УДАЧИ!!!
Добрый день. Закиньте исходник на test_woker@mail.ru пожалуйста).
ОтветитьУдалитьДобрый день. При вызове метода PemReader.ReadObject() генерируется исключение TypeInitializationException. Не могу понять с чем это может быть связано. Использую приватный ключ
ОтветитьУдалить-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCWX.....
-----END RSA PRIVATE KEY-----
А какой утилитой Вы создаете ключ? и если возможно выложите код который обрабатывает код ключа.
УдалитьКлюч, экспортирую из .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();
А пароль к приватному ключу у вас есть?
Удалитьпароль есть на jks файл.
УдалитьПароль к jks файлу это другое, Вам нужно сперва JKS преобразовать в PKCS12 и после в pem. вот полезная ссылка http://www.swview.org/node/191 .
УдалитьК сожалению, не помогло
УдалитьЯ подозреваю, что проблема не в ключах, а в том, что я что-то упустил, когда компилировал исходники Bounty Castle под Windows Phone,
УдалитьА какая версия оперативки Windows Phone?
Удалитьэмулятор с 512 Мб
УдалитьWP7.1
УдалитьА Вы смотрели все inner exception-ы может там есть подсказка. И еще при компиляции исходника может надо добавить флаг для SILVERLIGHT.
Удалить