2 / 2 / 4
Регистрация: 13.02.2011
Сообщений: 163
1

Шифр Плейфера - найти ошибку в коде

03.09.2014, 19:40. Показов 6609. Ответов 5
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
namespace Playfair_code
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
       private string[,] encriptionMatrix =
                                         {
                                         {"M", "O", "N", "A", "R"  }, 
                                         {"C", "H", "Y", "B", "D"  }, 
                                         {"E", "F", "G", "I", "J"}, 
                                         {"K", "L", "P", "Q", "S"  }, 
                                         {"T", "U", "V", "W", "X"  }, 
                                         {"Z", ".", "_", ",", "-"  }, 
                                         };
 
       private string text; //исходный текст для шифрования
      
       private int i_first = 0, j_first = 0;  //координаты первого символа пары
       private int i_second = 0, j_second = 0;//координаты второго символа пары
       private string  s1 = "", s2 = ""; //строки для хранения зашифрованного символа 
       private string encodetString; //зашифрованая строка
       private string decodetString; //расшифрованная строка
 
       private string login; //логин
       private string pass; //пароль
 
       #region Кодирование текста
 
       private void button1_Click(object sender, EventArgs e)
       {
            text = ""; //
            encodetString = "";
         
            text = Convert.ToString(richTextBox1.Text).ToUpper();
            int t = text.Length; //длина входного слова
            int i, j;
            ///проверяем, четное ли число символов в строке
            int temp = t % 2;
            if (temp != 0) //если нет
            {               //то добавляем в конец строки символ " " 
                text = text.PadRight((t + 1), ' ');
            }
 
            int len = text.Length / 2; /*длина нового массива -
                                                равная половине длины входного слова
                                                 т.к. в новом масиве каждый элемент будет
                                                   содержать 2 элемента из старого массива*/
 
            string[] str = new string[len]; //новый массив
 
            int l = -1; //служебная переменная
 
            for (i = 0; i < t; i += 2) //в старом массиве шаг равен 2
            {
                l++; //индексы для нового массива
                if (l < len)
                {
                    //Элемент_нового_массива[i] =  Элемент_старого_массива[i] +  Элемент_старого_массива[i+1]
                    str[l] = Convert.ToString(text[i]) + Convert.ToString(text[i + 1]);
                }
 
            }
 
            ///координаты очередного найденного символа из каждой пары
 
            foreach (string both in str)
            {
                for (i = 0; i < 6; i++)
                {
                    for (j = 0; j < 5; j++)
                    {
                        //координаты первого символа пары в исходной матрице
                        if (both[0] == Convert.ToChar(encriptionMatrix[i, j]))
                        {
                            i_first = i;
                            j_first = j;
                           
                        }
 
                        //координаты второго символа пары в исходной матрице
                        if (both[1] == Convert.ToChar(encriptionMatrix[i, j]))
                        {
                            i_second = i;
                            j_second = j;
                           
                        }
                    }
                }
 
                ///если пара символов находится в одной строке
                if (i_first == i_second)
                {
                    if (j_first == 5) /*если символ последний в строке,
                                       кодируем его первым символом из матрицы*/
                    {
                        s1 = Convert.ToString(encriptionMatrix[i_first, 0]);
                    }
                    //если символ не последний, кодируем его стоящим справа от него
                    else
                    {
                        s1 = Convert.ToString(encriptionMatrix[i_first, j_first + 1]);
                    }
 
                    if (j_second == 5) /*если символ последний в строке
                                       кодируем его первым символом из матрицы*/
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second, 0]);
                    }
                    //если символ не последний, кодируем его стоящим справа от него
                    else
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second, j_second + 1]);
                    }
 
                }
 
                ///если пара символов находится в одном столбце
                if (j_first == j_second)
                {
                    if (i_first == 5)
                    {
                        s1 = Convert.ToString(encriptionMatrix[0, j_first]);
                    }
                    else
                    {
                        s1 = Convert.ToString(encriptionMatrix[i_first + 1, j_first]);
                    }
 
                    if (i_second == 5)
                    {
                        s2 = Convert.ToString(encriptionMatrix[0, j_second]);
                    }
 
                    else
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second + 1, j_second]);
                    }
                }
 
                ///если пара символов находиться в разных столбцах и строках
                if (i_first != i_second && j_first != j_second)
                {
 
                    s1 = Convert.ToString(encriptionMatrix[i_first, j_second]);
                    s2 = Convert.ToString(encriptionMatrix[i_second, j_first]);
                }
 
                if (s1 == s2)
                {
                    encodetString = encodetString + s1 + "=" + s2;
                }
                else
                {
 
                    //записыавем результат кодирования
                    encodetString = encodetString + s1 + s2;
                }
 
                richTextBox2.Text = encodetString.ToLower();
            }
       }
ругается на

C#
1
2
3
4
                    else
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second, j_second + 1]);
                    }
Не могу понять где я затупил
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2014, 19:40
Ответы с готовыми решениями:

Шифр Плейфера - найти ошибку в коде
подскажите, почему не работает, не могу найти таких пространств имен, код взят с буржуинского сайта...

Найти ошибку в коде Алгоритм Плейфера (создания решетки кодирования)
Задача: сделать двумерный массив в котором будет ключевое слово и алфавит с неповторяеммых...

Шифр Плейфера
Здравствуйте, для начала расскажу что за шифр такой: Для начала берется матрица и в первую очередь...

Шифр Плейфера
Привет надо на языки с++ программно осуществить реализацию алгоритма ШИФРА Плейфера. Все говорят...

5
214 / 208 / 63
Регистрация: 17.04.2012
Сообщений: 382
03.09.2014, 19:47 2
j_second == 4 a не 5. Индексация начинается с 0, поэтому последний элемент будет под индексом 4

C#
1
2
3
4
5
6
7
8
9
10
if (j_second == 4) /*если символ последний в строке
                                       кодируем его первым символом из матрицы*/
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second, 0]);
                    }
                    //если символ не последний, кодируем его стоящим справа от него
                    else
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second, j_second + 1]);
                    }
1
2 / 2 / 4
Регистрация: 13.02.2011
Сообщений: 163
04.09.2014, 22:22  [ТС] 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
...
 
        private void buttoncoder_click(object sender, EventArgs e)
        {
            StringParametersClass._originaltext = Convert.ToString(richtextboxoriginaltext.Text).ToUpper();
            int halfwordmatrix = StringParametersClass._originaltext.Length / 2;
            string[] tempsymbolsmatrix = new string[halfwordmatrix];
            string[,] encriptionmatrix = 
                                         {
                                         {"M", "O", "N", "A", "R"  }, 
                                         {"C", "H", "Y", "B", "D"  }, 
                                         {"E", "F", "G", "I/J", "K"}, 
                                         {"L", "P", "Q", "S", "T"  }, 
                                         {"U", "V", "W", "X", "Z"  }, 
                                         };
 
            StringParametersClass._originaltext = "";
            StringParametersClass._encodet = "";
            StringParametersClass._originaltext = Convert.ToString(richtextboxoriginaltext.Text).ToUpper();
 
            startcheckanevennumberstring();
            startpastesymbolsmatrix(tempsymbolsmatrix);
            coordinatesfoundcharactereachpair(tempsymbolsmatrix, encriptionmatrix);
 
        }
 
        private void startcheckanevennumberstring()
        {
            int lengthinputword = StringParametersClass._originaltext.Length;
            int checkanevennumberstring = lengthinputword % 2;
            if (checkanevennumberstring != 0)
            {
                StringParametersClass._originaltext = StringParametersClass._originaltext.PadRight((lengthinputword + 1), ' ');
            }
        }
 
        private void startpastesymbolsmatrix(string[] tempsymbolsmatrix)
        {
            int halfwordmatrix = StringParametersClass._originaltext.Length / 2;
            int explotetioncounter = -1; // index for tempsymbolsmatrix
            int i;
 
            for (i = 0; i < StringParametersClass._originaltext.Length; i += 2) 
            {
                explotetioncounter++;
                if (explotetioncounter < halfwordmatrix)
                {
                    tempsymbolsmatrix[explotetioncounter] = Convert.ToString(StringParametersClass._originaltext[i]) + Convert.ToString(StringParametersClass._originaltext[i + 1]);
                }
            }
        }
 
        private void coordinatesfoundcharactereachpair(string[] tempsymbolsmatrix, string[,] encriptionmatrix)
        {
            int i, j;
            int i_first = 0, j_first = 0;
            int i_second = 0, j_second = 0;
            foreach (string both in tempsymbolsmatrix)
            {
                for (i = 0; i < 5; i++)
                {
                    for (j = 0; j < 5; j++)
                    {
                        if (both[0] == Convert.ToChar(encriptionmatrix[i, j]))
                        {
                            i_first = i;
                            j_first = j;
 
                        }
                        if (both[1] == Convert.ToChar(encriptionmatrix[i, j]))
                        {
                            i_second = i;
                            j_second = j;
 
                        }
                    }
                }
            }
 
            if (i_first == i_second)
            {
                if (j_first == 5)
                {
                    StringParametersClass._storingencryptedcharacterone = Convert.ToString(encriptionmatrix[i_first, 0]);
                }
                else
                {
                    StringParametersClass._storingencryptedcharacterone = Convert.ToString(encriptionmatrix[i_first, j_first + 1]);
                }
 
                if (j_second == 4) 
                {
                    StringParametersClass._storingencryptedcharactertwo = Convert.ToString(encriptionmatrix[i_second, 0]);
                }
                else
                {
                    StringParametersClass._storingencryptedcharactertwo = Convert.ToString(encriptionmatrix[i_second, j_second + 1]);
                }
 
            }
 
            if (j_first == j_second)
            {
                if (i_first == 5)
                {
                    StringParametersClass._storingencryptedcharacterone = Convert.ToString(encriptionmatrix[0, j_first]);
                }
                else
                {
                    StringParametersClass._storingencryptedcharacterone = Convert.ToString(encriptionmatrix[i_first + 1, j_first]);
                }
                if (i_second == 5)
                {
                    StringParametersClass._storingencryptedcharactertwo = Convert.ToString(encriptionmatrix[0, j_second]);
                }
                else
                {
                    StringParametersClass._storingencryptedcharactertwo = Convert.ToString(encriptionmatrix[i_second + 1, j_second]);
                }
            }
 
            if (i_first != i_second && j_first != j_second)
            {
                StringParametersClass._storingencryptedcharacterone = Convert.ToString(encriptionmatrix[i_first, j_second]);
                StringParametersClass._storingencryptedcharactertwo = Convert.ToString(encriptionmatrix[i_second, j_first]);
            }
 
            if (StringParametersClass._storingencryptedcharacterone == StringParametersClass._storingencryptedcharactertwo)
            {
                StringParametersClass._encodet = StringParametersClass._encodet + StringParametersClass._storingencryptedcharacterone + "=" + StringParametersClass._storingencryptedcharactertwo;
            }
            else
            {
                StringParametersClass._encodet = StringParametersClass._encodet + StringParametersClass._storingencryptedcharacterone + StringParametersClass._storingencryptedcharactertwo;
            }
        }
    }
}
Начал переписывать это дело нормально... и опять, я уже в стеке смотрел, и опять ругается на это:
C#
1
if (both[0] == Convert.ToChar(encriptionmatrix[i, j]))
0
293 / 233 / 58
Регистрация: 03.02.2011
Сообщений: 1,969
Записей в блоге: 1
05.09.2014, 12:59 4
C#
1
i <= 5
1
1056 / 863 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
05.09.2014, 14:27 5
вот это ужас:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for (i = 0; i < 6; i++)
                {
                    for (j = 0; j < 5; j++)
                    {
                        //координаты первого символа пары в исходной матрице
                        if (both[0] == Convert.ToChar(encriptionMatrix[i, j]))
                        {
                            i_first = i;
                            j_first = j;
                           
                        }
 
                        //координаты второго символа пары в исходной матрице
                        if (both[1] == Convert.ToChar(encriptionMatrix[i, j]))
                        {
                            i_second = i;
                            j_second = j;
                           
                        }
                    }
                }
вот так лучше:
C#
1
2
3
4
5
string encriptionMatrix = "MONARCHYBDEFGIJKLPQSTUVWXZ._,-";
i_first = encriptionMatrix.IndexOf(both[0])/5;
j_first = encriptionMatrix.IndexOf(both[0])%5;
i_second = encriptionMatrix.IndexOf(both[1])/5;
j_second = encriptionMatrix.IndexOf(both[1])%5;
используем так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 ///если пара символов находится в одной строке
                if (i_first == i_second)
                {
 //максимальное значение 4 !!!
                    if (j_first == 4) /*если символ последний в строке,
                                       кодируем его первым символом из матрицы*/
                    {
                        s1 = Convert.ToString(encriptionMatrix[i_first*5]);
                    }
                    //если символ не последний, кодируем его стоящим справа от него
                    else
                    {
                        s1 = Convert.ToString(encriptionMatrix[i_first*5+j_first + 1]);
                    }
 //максимальное значение 4 !!!
                    if (j_second == 4) /*если символ последний в строке
                                       кодируем его первым символом из матрицы*/
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second*5]);
                    }
                    //если символ не последний, кодируем его стоящим справа от него
                    else
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second*5 + j_second + 1]);
                    } 
                }
1
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 32
01.03.2015, 22:10 6
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication15
{
    class Program
    {
        static void Main(string[] args)
        {
     
        string[,] encriptionMatrix ={
                                         {"А", "Ч", "Б", "М", "Ц", "В"}, 
                                         {"Ь", "Г", "Н", "Ш", "Д", "О"}, 
                                         {"Е", "Щ", ",", "Х", "У", "П"}, 
                                         {".", "З", "Ъ", "Р", "И", "Й"}, 
                                         {"С", "-", "К", "Э", "Т", "Л"}, 
                                         {"Ю", "Я", " ", "Ы", "Ф", "Ж"}  
                                         };
 
        string text; 
 
         int i_first = 0, j_first = 0;  
        int i_second = 0, j_second = 0;
        string s1 = "", s2 = ""; 
       Console.Write("text: ");
         text = Console.ReadLine();
            int t = text.Length; 
            int i, j;
            int temp = t % 2;
            if (temp != 0) 
            {              
                text = text.PadRight((t + 1), ' ');
            }
 
            int len = text.Length / 2; 
 
            string[] str = new string[len]; 
 
            int l = -1; 
 
            for (i = 0; i < t; i += 2) 
            {
                l++; 
                if (l < len)
                {
                    str[l] = Convert.ToString(text[i]) + Convert.ToString(text[i + 1]);
                }
 
            }
 
            
 
            foreach (string both in str)
            {
                for (i = 0; i < 6; i++)
                {
                    for (j = 0; j < 6; j++)
                    {
                      if (both[0] == Convert.ToChar(encriptionMatrix[i, j]))
                        {
                            i_first = i;
                            j_first = j;
 
                        }
 
                        if (both[1] == Convert.ToChar(encriptionMatrix[i, j]))
                        {
                            i_second = i;
                            j_second = j;
 
                        }
                    }
                }
 
                if (i_first == i_second)
                {
                    if (j_first == 5) 
                    {
                        s1 = Convert.ToString(encriptionMatrix[i_first, 0]);
                    }
                    else
                    {
                        s1 = Convert.ToString(encriptionMatrix[i_first, j_first + 1]);
                    }
 
                    if (j_second == 5) 
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second, 0]);
                    }
                    else
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second, j_second + 1]);
                    }
 
                }
 
                if (j_first == j_second)
                {
                    if (i_first == 5)
                    {
                        s1 = Convert.ToString(encriptionMatrix[0, j_first]);
                    }
                    else
                    {
                        s1 = Convert.ToString(encriptionMatrix[i_first + 1, j_first]);
                    }
 
                    if (i_second == 5)
                    {
                        s2 = Convert.ToString(encriptionMatrix[0, j_second]);
                    }
 
                    else
                    {
                        s2 = Convert.ToString(encriptionMatrix[i_second + 1, j_second]);
                    }
                }
 
                if (i_first != i_second && j_first != j_second)
                {
 
                    s1 = Convert.ToString(encriptionMatrix[i_first, j_second]);
                    s2 = Convert.ToString(encriptionMatrix[i_second, j_first]);
                }
 
                if (s1 == s2)
                {
                    Console.WriteLine(s1 + "=" + s2);
                }
 
                else
                {
 
                    Console.WriteLine(s1 + s2);
                }
        }
            Console.ReadLine();
        }
    }
}
Добавлено через 37 секунд
vot vam tochnee rewenie
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2015, 22:10
Помогаю со студенческими работами здесь

Шифр Плейфера
https://www.youtube.com/watch?v=mvGgpHMpWzc Здравствуйте помогите мне пожалуйста написать Шифр...

Шифр Плейфера
Помогите пожалуйста реализовать алгоритм шифрования и расшифрования шифра Плейфера. Шифр Плейфера, ...

Шифр Плейфера
Доброго времени суток. Проблема в том, что я почти доделала шифр Плейфера. Но сама замена букв...

Шифр Плейфера
Напишите, пожалуйста, программу, которая шифрует текст по методу Плейфера. Заранее огромное спасибо!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru