У меня есть серверная клиентская система, которая использует шифрование rsa для отправки ключей rijindal.
это называется инкапсуляцией ключей.
прямо сейчас я уже отправил открытые ключи RSA, я протестировал код с обычной строкой, и они работают
теперь я передаю ключи после шифрования (шифрование работает со строками, так что все в порядке?).
мой ключ Rajindal (то, что я шифрую)
61,87,46,105,139,250,42,153,173,72,205,42,26,36,227,156,50,160,38,95,180,237,17,183,232,37,215,136,179,75,227,204
что выходит
1,10,38,205,13,99,127,55,139,71,212,100,221,181,175,93,84,228,31,116,190,254,220,41,64,253,135,146,128,115,174,234,52,84,220,98,34,253,167,77,24,166,104,119,133,173,199,155,236,32,107,10,7,153,253,242,197,80,136,117,177,217,153,97,65,132,29,23,42,157,206,91,183,133,34,204,143,83,13,244,120,115,59,50,196,176,8,146,90,189,195,249,171,120,96,54,85,6,234,129,166,94,255,202,76,249,153,107,146,64,221,45,50,50,237,113,138,152,85,39,113,90,215,197,235,121,23,191
что отправляется на сервер
"###KEY191,23,121,235,197,215,90,113,39,85,152,138,113,237,50,50,45,221,64,146,107,153,249,76,202,255,94,166,129,234,6,85,54,96,120,171,249,195,189,90,146,8,176,196,50,59,115,120,244,13,83,143,204,34,133,183,91,206,157,42,23,29,132,65,97,153,217,177,117,136,80,197,242,253,153,7,10,107,32,236,155,199,173,133,119,104,166,24,77,167,253,34,98,220,84,52,234,174,115,128,146,135,253,64,41,220,254,190,116,31,228,84,93,175,181,221,100,212,71,139,55,127,99,13,205,38,10,1"
теперь в этот момент сервер получит сообщение и выполнит следующий код
if (messageReceived.StartsWith("###KEY"))
{
Console.WriteLine(messageReceived);
string tempkey = messageReceived.Remove(0, 6);
this.key = rsa.DecryptBytes(tempkey);
myRijndael.Key = key;
Console.WriteLine(tempkey);
SendMessage("keyOK");
}
временный ключ будет
191,23,121,235,197,215,90,113,39,85,152,138,113,237,50,50,45,221,64,146,107,153,249,76,202,255,94,166,129,234,6,85,54,96,120,171,249,195,189,90,146,8,176,196,50,59,115,120,244,13,83,143,204,34,133,183,91,206,157,42,23,29,132,65,97,153,217,177,117,136,80,197,242,253,153,7,10,107,32,236,155,199,173,133,119,104,166,24,77,167,253,34,98,220,84,52,234,174,115,128,146,135,253,64,41,220,254,190,116,31,228,84,93,175,181,221,100,212,71,139,55,127,99,13,205,38,10,1
и это хорошо.
переходя к decryptBytes, который получает строку с именем data и возвращает byte[]
try
{
var dataArray = data.Split(',');
byte[] dataByte = new byte[dataArray.Length];
for (int i = 0; i < dataArray.Length; i++)
{
dataByte[i] = Convert.ToByte(dataArray[i]);
}
_rsa.FromXmlString(_privateKey);
var decryptedByte = _rsa.Decrypt(dataByte, false);
return decryptedByte;
}
catch (Exception e)
{
Console.WriteLine(e);
}
return new byte[7];
Класс RSA выглядит так
public RSA()
{
_encoder = new UnicodeEncoding();
_rsa = new RSACryptoServiceProvider();
_privateKey = _rsa.ToXmlString(true);
_publicKey = _rsa.ToXmlString(false);
}
У меня нет проблем с конверсионной частью, и dataByte будет тем, что нужно, то есть отправленным ключом.
моя проблема в следующей строке
var decryptedByte = _rsa.Decrypt(dataByte, false);
что возвращает мне исключение {"The parameter is incorrect."}
теперь я искал в Интернете и нашел несколько объяснений.
1- ключи поменялись
2- Мне нужно изменить false
на true
(не сработало).
дайте мне знать, если нужен еще код
По какой-то причине вы, кажется, перевернули зашифрованный текст. Шифрованный текст RSA всегда кодируется в одном и том же порядке, определенном стандартом PKCS#1 (в настоящее время RFC). Он указывает статический размер без знака большой порядок байтов для кодирования зашифрованного текста результата RSA (который представляет собой число, созданное модульным возведением в степень).
То, что отправляется на сервер, должно начинаться с 1
, а не 191
, вторая и третья строки должны быть идентичными, за исключением заголовка.
Обратите внимание, что ключи не кодируются в соответствии со спецификациями PKCS#1, потому что в этом отношении Microsoft особенная. Вам может понадобиться изменить модуль или показатель степени, если вы работаете с другими системами.
Обратите внимание, что довольно часто вы можете отправлять байты напрямую, многие транспортные протоколы допускают бинарную связь. Если вы используете текст, вы можете, по крайней мере, закодировать его в базе 64, что относительно эффективно, используя 4 символа для каждых 3 байтов.
YESSSS на самом деле решил это, не глядя на ваш комментарий, но да, я заметил, что отправлял его кусками, которые были слишком маленькими, поэтому я использовал конструкцию, чтобы увеличить размер строки, а затем увидел, что она была изменена как-то так, поэтому я изменил ее. агиан и бум получить это СПАСИБО ВАМ