#c# #encryption #rsa #bouncycastle
#c# #шифрование #rsa #bouncycastle
Вопрос:
Я работаю над методом расшифровки для сервиса, который я создаю с помощью BouncyCastle. Метод должен выглядеть примерно так:
public string RSADecryptString(string inputString, string privateKey)
{
//decription process here
}
Метод получает 2 параметра:
- inputString = строка зашифрованных данных, которые я хочу расшифровать.
- 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? Я хотел бы узнать, как вы это распознали, чтобы я мог сделать это в будущем. И еще раз спасибо за вашу помощь.