Как создать пару ключей из строки для описания BouncyCastle?

#c# #encryption #rsa #bouncycastle

#c# #шифрование #rsa #bouncycastle

Вопрос:

Я работаю над методом расшифровки для сервиса, который я создаю с помощью BouncyCastle. Метод должен выглядеть примерно так:

     public string RSADecryptString(string inputString, string privateKey)
    {
        //decription process here
    }
 

Метод получает 2 параметра:

  1. inputString = строка зашифрованных данных, которые я хочу расшифровать.
  2. PrivateKey = строка закрытого ключа для расшифровки моей входной строки (ключ генерируется с помощью BouncyCastle)

Сгенерированный закрытый ключ выглядит следующим образом:

——НАЧАТЬ RSA PRIVATE KEY——MIIEpAIBAAKCAQEA1d22OTGqObdaC1UZUu93fMI MnpSTho8GNgP1ANjDT4KtcmRpe7pBCVCtBNmUJU3kLimXRLtbZDnrrpdaHVadNPdhJrd3G6Ofx3KHkC dSgtQhEXkgs2lmrG8pnM/1Mn69pAQIxfitSw19gxIfdgtkQTl2Lh4FJMDFyC1FwneSzmaOnAjGDc3kFyUg5EMRgbD7/HgU4ULUDLvlOBi6tjpRrbDBnf G5fcFmo8Aw5f1Hw/KR6KVcirR0RKrJyOhMgFfRZsaS9Ngj4GlCt0Kzl8VCQAdGEQrXeFShxX7ffrQa6TUJ26pZVFw5WtskprQefU5LWfOkb9JErsi6kcVyu7QIDAQABAoIBAQCf0PSxPMnmI3voaAlqjoSN GGeOwZyUuyB7EO3vWgxpyE9w4lRpH0Amg EndKheUByp2m6t8AxVk2rppzSyI92KjSpOUl9xig6GbrGbL9msUVQz5D7k GQ e39sK0eR7fXadsF4WAsUNBuG6JrrX7Z9XlmcYA1r4og2qjxpIPi6iqqS2DCaN4 Y/PgsouBsnWtpmSnPUihwM9Zn76CQ7a2FJgVF2eif1eZ8I/fzf5bUYAgpSvCbR//0Z3T78XDmbBuKFahpqKyreB2fmh9tlMZRQjuy6jlfU9SOHBRnyAoqpJU72fmFcLZEBaYT jTCTWkQVuxMn3voV/jTDh1s6ABAoGBAPPdqA43ZIUwWGIORjUuHrMKZvSRi7v9IZdWFygpNiUvKrWcsNdigfmjKgisZfuGR lh58w6I8P1k/mwk11VNC38KU2N3Z5yvkzlIYxHhnBjixmhjfx772VB7mmmVknDGWi9QeKkGlZ4dMnFCebHZcPF nuQ4YWCXbhoXSJhbyQBAoGBAOCB66Z89I YEeMWXWPZTXwig8UDVz 9aEQAyFBMsMRXqlcrRTZoiQQzqRPGP36AcmvKFtj8/E3D5Q/hAaoFSxD2nBI0FIto7iE6GofKdJTmCcgcQ7MCqGEt7nDtf/piA6z1ZEI9xwrzmcWbE5I15uVSB8z6XKEb7GILmlnq0FrtAoGAMZn6Hrohlf2ZXIhuu05gLCaHfmNEOr5n4LJAD4kiXDnVxA7U4VpF ZK4b/8w1xIe ldRoHaK48bFjFnf/3HfJSNO 1lJpHrOPjG0uyWpMJ7uog38JUjIDp50ccTFdEdcmbM0/XZHbSMfDhMnymrwRfu00QFM/azghyujFeUfiAECgYBVlHDVuBAppJg87kuPQkhtJ2L/eLSLkZHrSjkRkwpW7ev66n2prdN9DIxJA2s0t5XmTNTExjsPEbuBgA34V6gzwS3hKoUiV09ezx1J4fzqvX3BEDUmSb8RvEaGOaJtOWuZRLmBHrd/DzjwwJqHQ5DOnaRnmJAywcgr36xo1j ySQKBgQDEwVzruJYXu6MSoiVd0NKeZ2 A1zIdSBPHTiL2c2ofEYFc OFHxu4bMWbINzN4nn7MM3zSB6WollBrgj2HoSHHoMQGb4QZEKj6Orv3Tg9AbzgbWDiPZ12mboEpaJLaqQFbJbv1aIJoCFL890NMBLpad9xvyrwBTSK4dHOJyTrqGg==——END RSA PRIVATE KEY——

Я видел рабочий пример с этого сайта: https://www.programmersought.com/article/19041424475 /

В их примере c # есть логика шифрования и дешифрования, которую мне нужно реализовать, но проблема в том, что они генерируют свои ключи одним и тем же методом. Я также видел много вопросов StackOverflow, где есть примеры того, как читать закрытые ключи из файлов PEM, но в моем случае у меня нет файла PEM, у меня просто есть свой закрытый ключ в строке.

Я думал о создании файла PEM, содержащего закрытый ключ моей строки, но это совсем не кажется эффективным.

Я пытался использовать TextReaders, чтобы превратить мою строку во что-то, что может прочитать мой объект PEMReader, но он всегда возвращает null, и из того, что я прочитал, это из-за ошибки синтаксического анализа. Я также попытался удалить части «—- НАЧАТЬ ЗАКРЫТЫЙ КЛЮЧ RSA —-«, чтобы попытаться устранить ошибку синтаксического анализа, но этого не произошло. Вот пример того, что я пробовал.

     public string RSADecryptString(string inputString, string pK)
    {
        TextReader textReader = new StringReader(pK);
        PemReader pemReader = new PemReader(textReader);
        object privateKeyObject = pemReader.ReadObject();
        AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)privateKeyObject;

        //AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
        Console.WriteLine(keyPair.ToString());
        RsaKeyParameters privateKey = (RsaKeyParameters)keyPair.Private;

        IAsymmetricBlockCipher cipher = new RsaEngine();
        Console.WriteLine("privateKey: "   privateKey.ToString());

        cipher.Init(false, keyPair.Private);
        byte[] bytesl = Convert.FromBase64String(inputString);
        byte[] deciphered = cipher.ProcessBlock(bytesl, 0, bytesl.Length);
        string decipheredText = _encoding.GetString(deciphered);

        return decipheredText;
    }
 

Я думал, есть ли способ создать объект KeyPair, необходимый моему методу decrypt, используя только строку моего закрытого ключа, что-то вроде метода SetPrivateKey . Я очень новичок в BouncyCastle и не знаю, правильно ли я иду.

Любые предложения о том, как действовать дальше?

Комментарии:

1. С разрывом строки сразу после заголовка и непосредственно перед нижним колонтитулом ключ может быть успешно загружен, как показано в Интернете здесь dotnetfiddle.net/e3ocxh .

2. @Topaco это сработало. Большое спасибо. Если не слишком много вопросов, могу я задать вам еще один вопрос? Мой расшифрованный текст возвращается с большим количеством странных символов, вы знаете, что может быть причиной этого? Вот пример входной строки и закрытого ключа, которые я использую dotnetfiddle.net/lhgEX1

3. @Topaco Если это поможет, мне говорят, что способ шифрования входной строки таков: RSACryptoServiceProvider rsa = DecodeX509PublicKey(DecodeOpenSSLPublicKey(xmlString)); return Convert.ToBase64String(rsa.Encrypt(Encoding.ASCII.GetBytes(inputString), false));

4. Во время шифрования использовалось заполнение PKCS # 1 версии v1.5. Это также должно быть применено для расшифровки, смотрите Здесь: dotnetfiddle.net/C92KwB .

5. @Topaco сработал отлично. Большое вам спасибо. Вы не возражаете, если я спрошу, как вы заметили, что используется шифрование PKCS? Я хотел бы узнать, как вы это распознали, чтобы я мог сделать это в будущем. И еще раз спасибо за вашу помощь.