Шифр Виженера неправильно шифрует после пробела

Я делал программу, в которой были собраны разные Шифры, но заметил, что при шифровании методом Виженера программа начинает неправильно шифровать после пробела. При шифровании слова "арбуз" с кодовым словом "фрукт", программа правильно выдаёт "фбфюъ", но при шифровании текста "арбуз дыня абрикос лимон" с тем же кодовым словом, программы выдаёт "фбфюъ цнвп улгыэгв яуяба", хотя должна "фбфюъ шлбй тхбьхбё ььчбв". Первые слова совпадают, а вот после пробела - нет.

Пытался реализовать проверку на пробел, но результат либо не менялся, либо программа начинала выдавать полный бред. Заранее спасибо за помощь. Вот код:

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 шт):

Автор решения: InterceptorTSK

Это НЕ ответ. Это замечание к будущим ответам.

При шифровании текста "арбуз дыня абрикос лимон" с тем же кодовым словом, программы выдаёт "фбфюъ цнвп улгыэгв яуяба", хотя должна "фбфюъ шлбй тхбьхбё ььчбв".

Dot.NET Framework v4.7.2 / x64 Release

Запущенный код выдаёт "фбфюъ шлбй тхбьхбё ььчбв".

Проверено и на сторонних сайтах. Где есть он-лайн кодировщики по Виженеру. Результат такой же.

И это не значит, что на других рантаймах будет тот же результат. Авторский код навскидку имеет дыру, это string.ToLower() и char.IsLetter(), и от версии к версии дот.нета реализации этих методов - разные.

→ Ссылка