Шифр Виженера неправильно шифрует после пробела
Я делал программу, в которой были собраны разные Шифры, но заметил, что при шифровании методом Виженера программа начинает неправильно шифровать после пробела. При шифровании слова "арбуз" с кодовым словом "фрукт", программа правильно выдаёт "фбфюъ", но при шифровании текста "арбуз дыня абрикос лимон" с тем же кодовым словом, программы выдаёт "фбфюъ цнвп улгыэгв яуяба", хотя должна "фбфюъ шлбй тхбьхбё ььчбв". Первые слова совпадают, а вот после пробела - нет.
Пытался реализовать проверку на пробел, но результат либо не менялся, либо программа начинала выдавать полный бред. Заранее спасибо за помощь. Вот код:
private string VigenereEncrypt(string message, string key)
{
string alphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"; // Алфавит русского языка
var table = new char[alphabet.Length, alphabet.Length];
for (int i = 0; i < alphabet.Length; i++)
{
for (int j = 0; j < alphabet.Length; j++)
{
int shift=(i+j)%alphabet.Length;
table[i,j] = alphabet[shift];
}
}
int para1 = 1, para2 = 0, perem = 1;
string result = "";
message = message.ToLower();
key = key.ToLower();
for (int i = 0;i < message.Length;i++)
{
if (char.IsLetter(message[i]))
{
for (int row = 0; row < alphabet.Length; row++)
{
if (table[row, 0] == message[i])
{
para1 = row;
break;
}
}
for (int column = 0; column < alphabet.Length; column++)
{
if (table[0, column] == key[perem - 1])
{
para2 = column;
break;
}
}
result += table[para1, para2];
}
else
{
result+= message[i];
perem--;
}
if(perem%key.Length == 0)
{
perem = 0;
}
perem++;
}
return result;
}
Ответы (1 шт):
Это НЕ ответ. Это замечание к будущим ответам.
При шифровании текста "арбуз дыня абрикос лимон" с тем же кодовым словом, программы выдаёт "фбфюъ цнвп улгыэгв яуяба", хотя должна "фбфюъ шлбй тхбьхбё ььчбв".
Dot.NET Framework v4.7.2 / x64 Release
Запущенный код выдаёт "фбфюъ шлбй тхбьхбё ььчбв".
Проверено и на сторонних сайтах. Где есть он-лайн кодировщики по Виженеру. Результат такой же.
И это не значит, что на других рантаймах будет тот же результат. Авторский код навскидку имеет дыру, это string.ToLower() и char.IsLetter(), и от версии к версии дот.нета реализации этих методов - разные.