none
Алгоритм Виженера RRS feed

  • Вопрос

  • Вот я пишу расшифровщик алгоритма Виженера, расшифровка латиницы.

    public static string decrypt(string key, string text)
            {
                string ntext=null;
                int k;
                int t;
                char[,] table = genTable(); /// Таблица виженера
                for (int i = 0,j = 0; i < text.Length; i++,j++)
                {
                    if (j == key.Length) { j = 0; }    
                    k = (int)key[j] - 97; /// Столбец таблицы
                    t = (int)text[i] - 97; /// Зашифрованный ключ
                    for (int y = 0; y < 26; y++) 
                    {
                          if (table[y,k] == text[i]) { ntext += (char)y; }
    // находим в таблице Виженера строку [b]table[k,y] == text[i] [/b], соответствующую первому символу ключевого слова
    // [b]y[/b] - Номер строчки в которой находится данный символ, соответствует первому символу исходного текста
                    }
                }
                return ntext;
            }
    


    Расшифрование производится следующим образом: находим в таблице Виженера строку, соответствующую первому символу ключевого слова; в данной строке находим первый символ зашифрованного текста. Столбец, в котором находится данный символ, соответствует первому символу исходного текста. Следующие символы зашифрованного текста расшифровываются подобным образом.
    [URL=http://ru.wikipedia.org/wiki/%D0%A8%D0%B8%D1%84%D1%80_%D0%92%D0%B8%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0]http://ru.wikipedia.org/wiki/%D0%A8%D0%B8%...%B5%D1%80%D0%B0[/URL]

    [b]Что я делаю не правильно?[/b]

    Выложу, еще сам шифратор, он работает правильно, сам проверял:

    public static string encrypt(string text, string key)
            {
                string ntext =null;
                int k;
                int t;
                char[,] table = genTable();
                for (int i = 0,j = 0; i < text.Length; i++,j++)
                {
                    if (j == key.Length) { j = 0; }    
                    k = (int)key[j] - 97;
                    t = (int)text[i] - 97;
                    ntext+=Convert.ToString(table[k, t]);
                }         
                return ntext;
            }
    
    


    10 октября 2010 г. 7:09

Ответы

  • Первое, что бросается в глаза это кусок

                for (int y = 0; y < 26; y++)

                {

                    if (table[y, k] == text[i]) { ntext += (char)y; }

                }

    цифры [0 .. 26] не соответсвуют алфавитным, скорей всего надо написать так

                for (int y = 0; y < 26; y++)

                {

                    if (table[y, k] == text[i]) { ntext += (char)(y + 97); }

                }

    попробуйте, еси не поможет, будем разбираться дальше

    • Помечено в качестве ответа Abolmasov Dmitry 27 октября 2010 г. 8:38
    10 октября 2010 г. 18:28

Все ответы

  • Первое, что бросается в глаза это кусок

                for (int y = 0; y < 26; y++)

                {

                    if (table[y, k] == text[i]) { ntext += (char)y; }

                }

    цифры [0 .. 26] не соответсвуют алфавитным, скорей всего надо написать так

                for (int y = 0; y < 26; y++)

                {

                    if (table[y, k] == text[i]) { ntext += (char)(y + 97); }

                }

    попробуйте, еси не поможет, будем разбираться дальше

    • Помечено в качестве ответа Abolmasov Dmitry 27 октября 2010 г. 8:38
    10 октября 2010 г. 18:28
  • Ребят, мне это тоже интересно, но не совсем понятно. Если это переделать в паскаль, то сложно ли это реализовать?
    11 октября 2010 г. 2:31
  • нет не сложно, точно также

    15 октября 2010 г. 12:23