Ckpyt
@Ckpyt

Как расшифровать RSA, не имея открытого ключа?

Задача: сервер передает закрытый ключ и шифротекст. Надо его расшифровать.
Вижу в .NET есть класс RSACryptoServiceProvider.
НО! Эта собака требует наличия открытого ключа. Т.е. экспоненты. Почитал про RSA, попробовал вместо экспоненты подсунуть секретную экспоненту, пишет плохие данные...
Может, кто-нибудь подскажет библиотеку RSA или как работать с .NET, чтобы решилась эта задача?
П.с. передавать открытый ключ вместе с закрытым не вариант - на той стороне должны уметь расшифровывать, но не уметь зашифровывать.

П.п.с тестовый кусок кода:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
                String str = rsa.ToXmlString(true);

                MemoryStream config = new MemoryStream();
                BinaryFormatter serial = new BinaryFormatter();
                serial.Serialize(config, str.ToArray());

                byte[] serialObj = config.ToArray();

                
                string RSAKey = "<RSAKeyValue><Modulus>rZfC4KXnycP+MyK7Z94VEurnIkU9+3RoTo8gv1CfNDwdIEGnk9oTWUmScy7cscTYXOyDAGl7L+qFq+0gkf6Y4ssNEbyYIxSpfGuzIHLUYbmm1EWPGSOsADmNGZPB0zK9MIP3+q9Jm766lrlGMs3EwvIm3eaeN2RzqSbQGaE85LM=</Modulus><Exponent>AQAB</Exponent><P>vqjQLNlT+FpCpoCU97DtIJlxg8Zg+8tqmo70nFPw5AWIP4eTDaAVheJ/iCQe9JfT8oId4kJ7vVy1ZBPhZtNQew==</P><Q>6RWjN2gz7Sdjwdk71kJ7JVqpeAlqm3hR1o9DXvHluEWsWPaqqt/2a3G0EnX6q+ToBAO37mjLtqvWFF8gf62zKQ==</Q><DP>JCNPQhD3b418MJ8SnVg1ugYblASYAWHvFNif2Lm4YSADUTdbUivTqIrj7WQbUfUtQTwUefxsA9p8rzltcdX/3Q==</DP><DQ>VyVO4+1i1L1Qb+6/j4lFr56pFAc5Q62Fs5nWz43TnMT3/j8jakXYRS267NgNg+1Ozglx4IJv//lZTj6O0Q3pmQ==</DQ><InverseQ>cTBRRTeFvCuQqUk41gqbZaYBvkvSxOsOYC/2947c4Rrew6Gzokxo2hStOajpEZq+ZNd9qr8Cqkce6WQGqGMBpQ==</InverseQ><D>G1z5PIUaWN0apD/cz54br0w029uTTiBG0t9P16hjOA4jvzJqMm2lMCVfPuXLpv/y5Q7pBXcbEm4C3Rt3T1wVCCQTH/WnzTVtL5h+iwXf6qJYsUlVLOmtg8XD6K6rGKE0XXP8UBOMqSzE72nl0eAn4uXmN8qR7U117QtPpE5skCk=</D></RSAKeyValue>";
                string RSAEncrKey = "<RSAKeyValue><Modulus>rZfC4KXnycP+MyK7Z94VEurnIkU9+3RoTo8gv1CfNDwdIEGnk9oTWUmScy7cscTYXOyDAGl7L+qFq+0gkf6Y4ssNEbyYIxSpfGuzIHLUYbmm1EWPGSOsADmNGZPB0zK9MIP3+q9Jm766lrlGMs3EwvIm3eaeN2RzqSbQGaE85LM=</Modulus><Exponent>G1z5PIUaWN0apD/cz54br0w029uTTiBG0t9P16hjOA4jvzJqMm2lMCVfPuXLpv/y5Q7pBXcbEm4C3Rt3T1wVCCQTH/WnzTVtL5h+iwXf6qJYsUlVLOmtg8XD6K6rGKE0XXP8UBOMqSzE72nl0eAn4uXmN8qR7U117QtPpE5skCk=</Exponent></RSAKeyValue>";
                string RSADecrKey = "<RSAKeyValue><Modulus>rZfC4KXnycP+MyK7Z94VEurnIkU9+3RoTo8gv1CfNDwdIEGnk9oTWUmScy7cscTYXOyDAGl7L+qFq+0gkf6Y4ssNEbyYIxSpfGuzIHLUYbmm1EWPGSOsADmNGZPB0zK9MIP3+q9Jm766lrlGMs3EwvIm3eaeN2RzqSbQGaE85LM=</Modulus><Exponent>AQAB</Exponent><P>vqjQLNlT+FpCpoCU97DtIJlxg8Zg+8tqmo70nFPw5AWIP4eTDaAVheJ/iCQe9JfT8oId4kJ7vVy1ZBPhZtNQew==</P><Q>6RWjN2gz7Sdjwdk71kJ7JVqpeAlqm3hR1o9DXvHluEWsWPaqqt/2a3G0EnX6q+ToBAO37mjLtqvWFF8gf62zKQ==</Q><DP>JCNPQhD3b418MJ8SnVg1ugYblASYAWHvFNif2Lm4YSADUTdbUivTqIrj7WQbUfUtQTwUefxsA9p8rzltcdX/3Q==</DP><DQ>VyVO4+1i1L1Qb+6/j4lFr56pFAc5Q62Fs5nWz43TnMT3/j8jakXYRS267NgNg+1Ozglx4IJv//lZTj6O0Q3pmQ==</DQ><InverseQ>cTBRRTeFvCuQqUk41gqbZaYBvkvSxOsOYC/2947c4Rrew6Gzokxo2hStOajpEZq+ZNd9qr8Cqkce6WQGqGMBpQ==</InverseQ><D>G1z5PIUaWN0apD/cz54br0w029uTTiBG0t9P16hjOA4jvzJqMm2lMCVfPuXLpv/y5Q7pBXcbEm4C3Rt3T1wVCCQTH/WnzTVtL5h+iwXf6qJYsUlVLOmtg8XD6K6rGKE0XXP8UBOMqSzE72nl0eAn4uXmN8qR7U117QtPpE5skCk=</D></RSAKeyValue>";
                RSACryptoServiceProvider rsaEncr = new RSACryptoServiceProvider();
                rsaEncr.FromXmlString(RSAEncrKey);

                byte[] fst = new byte[60];

                for (int i = 0; i < fst.Length; i++)
                    fst[i] = serialObj[i];
                byte[] encr = rsa.Encrypt(fst, false);

                rsa.FromXmlString(RSADecrKey);
                byte[] decr = rsa.Encrypt(encr, false);
  • Вопрос задан
  • 3119 просмотров
Решения вопроса 1
Ckpyt
@Ckpyt Автор вопроса
Задача решена через метод BigInteger.ModPow();
Всем спасибо за участие, закрываю вопрос.
П.с. экспорт в RSAParameters имеет обратный порядок байт по сравнению с импортом BigInteger
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
То есть вы по незащищённому каналу передаёте шифротекст и закрытый ключ?) Но при этом боитесь передать публичный ключ?)) А зачем такое шифрование нужно,, если вы ключ рядом с шифром передаёте?
И да, RSACryptoProvider для расшифровки требует абсолютно все те же значения, что были использованы при генерации ключей.
Ответ написан
@SZolotov
Asp.net core, MAUI,WPF,Qt, Avalonia
У вас неправильный алгоритм. Клиент должен генерит пару ключей, затем он шлёт на сервер открытый ключ, которым все и шифруется
Ответ написан
@mayorovp
Добавлю сюда свой ответ на Хабре.

https://habrahabr.ru/post/279093/#comment_8803859
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы