Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 19.02.2017
Сообщений: 12
1

Шифрование данных методом Виженера, не распознаются пробелы

12.04.2017, 11:45. Просмотров 3106. Ответов 14
Метки нет (Все метки)


Всем привет ребята, в общем, делал я шифрование методом Виженера, если брать одно слово, то шифрует нормально, если брал несколько, то тоже вроде как нормально, но не распознает пробелы, то есть вместо них ставит буквы. В общем, я прикреплю исходник на программу, помогите исправить ошибки, новичок в этом деле вообще. Буду рад любой помощи!
0
Вложения
Тип файла: rar +Рабочий Виженер через Memo.rar (1.08 Мб, 79 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2017, 11:45
Ответы с готовыми решениями:

Шифрование методом Виженера
Добрый день, у меня есть код шиврования методом Виженера, мне нужно дописать дешифрование, прошу...

Шифрование методом Виженера
Ребята есть код, помогите разобраться с неправильным выводом зашифрованного текста, вместо русских...

Шифрование Методом Виженера На C++
Здравствуйте. Мне нужна программа на тему Шифрование методом виженера. Я пытался найти в интернете...

Шифрование методом Виженера
Пожалуйста может у кого то есть исходник шифрования методом Виженера В КОНСОЛИ срочно надо до...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
14
0 / 0 / 0
Регистрация: 19.02.2017
Сообщений: 12
19.04.2017, 16:38  [ТС] 2
Хоть кто нить идею подкиньте, не могу никак доделать.
0
261 / 208 / 87
Регистрация: 27.09.2010
Сообщений: 1,193
19.04.2017, 23:59 3
_Mister_Joker_,
но и в примере тоже пишется "Ведите шифруемый текст (без пробелов)"
или увеличить таблицу добавив туда еще и пробел.
или при нажатии на кнопку зашифровать автоматически удалить все пробелы из текста.
и текст будет "слитымводнустроку"
1
0 / 0 / 0
Регистрация: 19.02.2017
Сообщений: 12
20.04.2017, 10:32  [ТС] 4
Привет, в таблицу никак нельзя добавлять пробел, это не по правилу метода шифрования и как оно вообще будет вытягивать оттуда этот пробел во первых, во вторых я новичок и на словах сам понимаю как сделать, но реализовать кодом не могу, в третьих без пробелов метод не является работающим корректно!
0
261 / 208 / 87
Регистрация: 27.09.2010
Сообщений: 1,193
20.04.2017, 19:00 5
Лучший ответ Сообщение было отмечено _Mister_Joker_ как решение

Решение

_Mister_Joker_,
весь твой код полон ошибок!

Добавлено через 1 час 25 минут
_Mister_Joker_,
идея для пробелов можно решить так.
весь текст для шифрования перевести в
C++
1
  Memo1->Text.LowerCase()
затем
C++
1
  Memo1->Text = StringReplace(Memo1->Text," ","Я",TReplaceFlags() << rfIgnoreCase << rfReplaceAll );
и теперь в метод шифрования надо сделать немного перемены.
начальный адрес с 223 поменять на 222
C++
1
2
3
4
for(i=1; i<=33; i++)  // записывает
  {
  b[i-1][0]=(i-1)+222;  //  алфавит в цифрах в массив
  }
вот теперь зашифрован текст вместе с пробелами.
и поменять сравнение
на
C++
1
if(o==c)  // сравнение лозунга с алфавитом
теперь буквы будут отличаться маленькие или заглавные.
т.к. у тебя заглавная буква (Я).
2
261 / 208 / 87
Регистрация: 27.09.2010
Сообщений: 1,193
20.04.2017, 22:46 6
Лучший ответ Сообщение было отмечено _Mister_Joker_ как решение

Решение

мой код с пробелами работает.
1
Миниатюры
Шифрование данных методом Виженера, не распознаются пробелы  
0 / 0 / 0
Регистрация: 19.02.2017
Сообщений: 12
21.04.2017, 09:33  [ТС] 7
Здравствуйте, я поменял кое что, но не до конца, и теперь ошибки бьет билдер много, можете Вы скинуть свою версию программы мне в письмо личное или на почту p.mihailovich.joker@yandex.by, хочу посмотреть как Вы это реализовали, буду очень благодарен!
0
261 / 208 / 87
Регистрация: 27.09.2010
Сообщений: 1,193
21.04.2017, 11:25 8
я сделал код только для "русского" языка точно так же по аналогии и делается и "английский" разберешься!
чтоб добавить в шифр (пробел) нужно увеличить обхват символов на +1 в данном случае если поменять 223 на 222 то начало символов изменится с "а" на "Я" . точно нам и нужна буква отличающиеся от всех остальных.
теперь ее можно заменить на (пробел).
в событии выбора радиокнопки изменить немного код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 if ((RadioGroup1->ItemIndex) == 0)// выбор русского языка
   {
    StringGrid1->RowCount=33;
    StringGrid1->ColCount=33;
     for(i=1; i<=33; i++)
     for(j=1; j<=33; j++)
        {b[i-1][j-1]=j+(i-1)+222;
         if (b[i-1][j-1]>255)  b[i-1][j-1]=(b[i-1][j-1]%255)+222; // циклический сдвиг
         //занесение в таблицу массива
         if(char(b[i-1][j-1])=='Я')StringGrid1->Cells[j-1][i-1]=" ";
         else
         StringGrid1->Cells[j-1][i-1]=char(b[i-1][j-1]) ;
        }
    }
ну и теперь кнопка "закодировать"
здесь только для одной строки. для нескольких добавишь цикл как в твоем коде. только не используй на каждой строке скобки! они в принципе не мешают но читабельность кода становиться трудной и можно случайно поставить скобку не туда и тогда ...... дни и ночи в поисках ошибки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    void __fastcall TForm1::Button1Click(TObject *Sender)
{
String keys = LabeledEdit1->Text;      // Ключ:
String tekst = Memo1->Lines->Strings[0];// Исходный текст:
String k=key_ex(tekst,keys);              //шифруемому
LabeledEdit1->Text=k;
String koder;
for (int i = 1; i <= tekst.Length(); i++)
{
try {
  koder +=StringGrid1->Cells[StringGrid1->Rows[0]->IndexOf(tekst.SubString(i,1))][StringGrid1->Cols[0]->IndexOf(k.SubString(i,1))];
    }
  catch(...){       Application->MessageBox
        (    
            String("Шифрование текста остановлено!\nБыл введен недопустимый символ "+(tekst.SubString(i,1))).c_str(),
            "ШИФРОВАНИЕ ТЕКСТА",
            MB_OK
        );
            }
}
Memo2->Text=koder;
}
здесь я использовал трай и кетч для случайно введенных символов не входящие с таблицу.
ну и теперь декодер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::Button2Click(TObject *Sender)
{
String keys = LabeledEdit1->Text;      // Ключ:
String tekst = Memo2->Lines->Strings[0];// Исходный текст:
String k=key_ex(tekst,keys);              //шифруемому
LabeledEdit1->Text=k;
String dekoder;
for (int i = 1; i <= tekst.Length(); i++)
{
  dekoder +=StringGrid1->Cells[StringGrid1->Rows[StringGrid1->Cols[0]->IndexOf(k.SubString(i,1))]->IndexOf(tekst.SubString(i,1))][0];
}
Memo1->Text=dekoder;
}
вот теперь все работает в две стороны
0
Миниатюры
Шифрование данных методом Виженера, не распознаются пробелы  
0 / 0 / 0
Регистрация: 19.02.2017
Сообщений: 12
21.04.2017, 12:13  [ТС] 9
А что за ошибку начало выдавать?
0
Миниатюры
Шифрование данных методом Виженера, не распознаются пробелы  
261 / 208 / 87
Регистрация: 27.09.2010
Сообщений: 1,193
21.04.2017, 12:51 10
код правильно скопировал?
или ' ' .
или скриншот дай с кодом или выложи код.

Добавлено через 5 минут
у меня работает
0
261 / 208 / 87
Регистрация: 27.09.2010
Сообщений: 1,193
21.04.2017, 13:01 11
копируй внимательно код!
у меня все работает!
0
Миниатюры
Шифрование данных методом Виженера, не распознаются пробелы  
0 / 0 / 0
Регистрация: 19.02.2017
Сообщений: 12
25.04.2017, 17:07  [ТС] 12
Здравствуйте, извиняюсь что не отвечал долго, компьютер ремонтировал, в общем вот код, но почему то на скобку ругается
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Выбор языка 
void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
{
int i,j,a[26][26],b[33][33];
if ((RadioGroup1->ItemIndex) == 0)// выбор русского языка
* *{
* * StringGrid1->RowCount=33;
* * StringGrid1->ColCount=33;
* * *for(i=1; i<=33; i++)
* * *for(j=1; j<=33; j++)
* * * * {b[i-1][j-1]=j+(i-1)+222;
* * * * *if (b[i-1][j-1]>255) *b[i-1][j-1]=(b[i-1][j-1]%255)+222; // циклический сдвиг
* * * * *//занесение в таблицу массива
* * * * *if(char(b[i-1][j-1])=='Я')StringGrid1->Cells[j-1][i-1]=" ";
* * * * *else
* * * * *StringGrid1->Cells[j-1][i-1]=char(b[i-1][j-1]) ;
* * * * }
* * }
 
 
}
Далее зашифровка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String keys = LabeledEdit1->Text; * * *// Ключ:
String tekst = Memo1->Lines->Strings[0];// Исходный текст:
String k=key_ex(tekst,keys); * * * * * * *//шифруемому
LabeledEdit1->Text=k;
String koder;
for (int i = 1; i <= tekst.Length(); i++)
{
try {
* koder +=StringGrid1->Cells[StringGrid1->Rows[0]->IndexOf(tekst.SubString(i,1))][StringGrid1->Cols[0]->IndexOf(k.SubString(i,1))];
* * }
* catch(...){ * * * Application->MessageBox
* * * * ( * *
* * * * * * String("Шифрование текста остановлено!\nБыл введен недопустимый символ "+(tekst.SubString(i,1))).c_str(),
* * * * * * "ШИФРОВАНИЕ ТЕКСТА",
* * * * * * MB_OK
* * * * );
* * * * * * }
}
Memo2->Text=koder;
}
И расшифровка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Button2Click(TObject *Sender)
{
String keys = LabeledEdit1->Text; * * *// Ключ:
String tekst = Memo2->Lines->Strings[0];// Исходный текст:
String k=key_ex(tekst,keys); * * * * * * *//шифруемому
LabeledEdit1->Text=k;
String dekoder;
for (int i = 1; i <= tekst.Length(); i++)
{
* dekoder +=StringGrid1->Cells[StringGrid1->Rows[StringGrid1->Cols[0]->IndexOf(k.SubString(i,1))]->IndexOf(tekst.SubString(i,1))][0];
}
Memo1->Text=dekoder;
 
}
Но ругается как на скрине то на скобку, то на StringGrid1 , далее на цикл если посмотреть ошибки.

Добавлено через 4 часа 7 минут
Всё сделал, заработало, ура, спасибо большое)))
0
0 / 0 / 0
Регистрация: 19.02.2017
Сообщений: 12
07.06.2017, 17:02  [ТС] 13
Здравствуйте, я продолжил заниматься этим методом, вопрос такой, что в циклах изменять нужно, чтобы шифровало больше текста, а не 4 слова и обрезает?
0
261 / 208 / 87
Регистрация: 27.09.2010
Сообщений: 1,193
08.06.2017, 07:52 14
_Mister_Joker_, вся проблема в
C++
1
String tekst = Memo1->Lines->Strings[0];// Исходный текст:
здесь читается только первая строка.
или надо сделать цикл по строкам в МЕМО или весь текст
C++
1
tekst = StringReplace(Memo1->Text, "\r\n", " ", TReplaceFlags() << rfReplaceAll);
0
261 / 208 / 87
Регистрация: 27.09.2010
Сообщений: 1,193
09.06.2017, 19:51 15
для кодера
C++
1
2
//String tekst = Memo1->Lines->Strings[0];// Исходный текст:
String tekst = StringReplace(Memo1->Text, "\r\n", " ", TReplaceFlags() << rfReplaceAll);
и соответно для декодера
C++
1
2
//String tekst = Memo2->Lines->Strings[0];// Исходный текст:
String tekst = StringReplace(Memo2->Text, "\r\n", " ", TReplaceFlags() << rfReplaceAll);
Добавлено через 1 минуту
и теперь весь текст можно закодировать и сесс..но декодировать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2017, 19:51

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Шифрование методом Виженера
Помогите переделать прогу нужно чуть переделать прогу нужно короче чтобы небыло буквы ‘Й’ а после...

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

Шифрование методом Виженера
Здравствуйте! Помогите доработать прогу на си. Она должна шифровать (хотя бы!!!) и дешифровать...

Шифрование заданной строки методом Виженера
пожалуйста помогите написать программу, на вход подаётся строка, которую необходимо зашифровать с...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.