Расшифровка RSA с использованием BouncyCastle с закрытым файлом PEM

1

Я делаю некоторые тесты с BouncyCastle в С#, и я хочу зашифровать некоторые данные и расшифровать их позже с помощью пары ключей, которые у меня есть на моем компьютере, хранящихся в виде файлов PEM.

  public static string RSABouncyEncrypt(string content)
    {
        var bytesToEncrypt = Encoding.UTF8.GetBytes(content);
        AsymmetricKeyParameter keyPair;
        using (var reader = File.OpenText(@"C:\Users\Diego\Documents\public.pem"))) 
            keyPair = (AsymmetricKeyParameter)new org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject();



        var engine = new RsaEngine();
        engine.Init(true, keyPair);

        var encrypted = engine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length);

        var cryptMessage = Convert.ToBase64String(encrypted);
        Logs.Log.LogMessage("encrypted: " + cryptMessage);
        System.Windows.MessageBox.Show(cryptMessage);

        //Decrypt before return statement to check that it has been encrypted correctly
        RSADecrypt(cryptMessage);
        return cryptMessage;
    }

public static void RSADecrypt(string string64)
    {
        var bytesToDecrypt = Convert.FromBase64String(string64); // string to decrypt, base64 encoded

        AsymmetricCipherKeyPair keyPair;

        using (var reader = File.OpenText(@"C:\Users\Diego\Documents\private.pem"))
            keyPair = (AsymmetricCipherKeyPair)new Org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject();

        var decryptEngine = new RsaEngine();
        decryptEngine.Init(false, keyPair.Private);

        var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length));
        Logs.Log.LogMessage("decrypted: " + decrypted);
        System.Windows.MessageBox.Show(decrypted);
    }

Функция RSADecrypt показывает ошибку. когда я показываю окно сообщения после дешифрования, я получаю следующее:

Z 8o >>;; /Z ב?# F (͌5 o1I, 4 S W ) w x 4p $ - | А & Rv} G V c & wU? D } E O 7 n ! (E E $ y g9ςO أ P t d T nN K $ bQ ! v - Hb 1 ? @B y r Le h=*Yr w l W| 嘟 |g EV @ [ M

который определенно не то, что я зашифровал. Что я делаю не так?

  • 0
    Какая ошибка отображается?
Теги:
rsa
cryptography

2 ответа

2
Лучший ответ

Я воспроизвел эту проблему, и это произошло потому, что вы использовали закрытый ключ и открытый ключ, которые не совпадают. Другими словами, сообщение было зашифровано с помощью закрытого ключа (пусть его называют private_key_1), который поступает из одной пары (private_key_1/public_key_1), но вы пытались расшифровать его с помощью открытого ключа (пусть его называют publick_key_2), который поступает из другой пары ( private_key_2/public_key_2). Попробуйте создать новую пару ключей и использовать ее в своем примере, например:

var kpgen = new RsaKeyPairGenerator();
kpgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));

var keyPair = kpgen.GenerateKeyPair();

using (var writer = new StreamWriter(File.OpenWrite(@"C:\Users\Diego\Documents\private2.pem")))
{
    new PemWriter(writer).WriteObject(keyPair.Private);
}

using (var writer = new StreamWriter(File.OpenWrite(@"C:\Users\Diego\Documents\public2.pem")))
{
    new PemWriter(writer).WriteObject(keyPair.Public);
}
  • 0
    Да, это сработало! код генератора пар ключей был очень полезен
3

На самом деле ответ, почему он не работает, заключается в том, что нет информации о заполнении. Правильный способ создания RsaEngine - это sth. как это

var decryptEngine = new Pkcs1Encoding (RsaEngine())

    var bytesToDecrypt = Convert.FromBase64String(string64); // string to decrypt, base64 encoded

    AsymmetricCipherKeyPair keyPair;

    using (var reader = File.OpenText(@"C:\Users\Diego\Documents\private.pem"))
        keyPair = (AsymmetricCipherKeyPair)new Org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject();

    var decryptEngine = new Pkcs1Encoding(RsaEngine());
    decryptEngine.Init(false, keyPair.Private);

    var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length));
    Logs.Log.LogMessage("decrypted: " + decrypted);
    System.Windows.MessageBox.Show(decrypted);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню