Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 9
1

Шифр Виженера (работает только с латиницей)

05.03.2019, 10:06. Показов 3199. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Срочно нужна помощь, не могу понять где ошибка! Шифрует только английский текс на русском выдает ошибку проверяла код вроде верный

Delphi
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
var
  Form1: TForm1;
  i, z, n, l, p : integer;
  s, k, e :string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
 begin
s:=Edit1.Text;  //--исходный текст
k:=Edit2.Text;    //--ключ
Edit3.Text:='';
 
for i:=1 to length(s) do
  begin
  z:=ord(s[i]);      //--перевод в ASCII код
  l:=length(k);
  p:=i;
   //--Циклическое считывание ключа
  if p>l then
    begin
     p:=(p)mod(l);
     if p=0 then p:=l
     else p:=p;
     end
    else p:=p;
 
  n:=ord(k[p]);
 
  //--Кириллица заглавные
  if ((z>=192) and (z<=223)) and ((n>=192) and (n<=255)) then
  begin
  z:=(z-191);
    if n>=224 then n:=n-223
    else n:=n-191;
  z:=((z+n)mod(32))+191-1;
  if z<192 then z:=z+32
  else z:=z;
  Edit3.Text:= Edit3.Text+chr(z);
  end
  //--Кириллица строчнык
  else if ((z>=224) and (z<=255)) and ((n>=192) and (n<=255)) then
  begin
  z:=(z-223);
  if n>=224 then n:=n-223
  else n:=n-191;
  z:=223-1+(z+n)mod(32);
  if z<224 then z:=z+32
  else z:=z;
  Edit3.Text:= Edit3.Text+chr(z);
  end
  //--Латиница заглавные
  else if ((z>=65) and (z<=90)) and (((n>=65) and (n<=90)) or ((n>=97) and (n<=122))) then
  begin
  z:=(z-64);
  if n>=97 then n:=n-96
  else n:=n-64;
  z:=64-1+(z+n)mod(26);
  if z<65 then z:=z+26
  else z:=z;
  Edit3.Text:= Edit3.Text+chr(z);
  end
  //--Латиница сточные
  else if ((z>=97) and (z<=122)) and (((n>=65 )and (n<=90)) or ((n>=97) and (n<=122))) then
  begin
  z:=(z-96);
  if n>=97 then n:=n-96
  else n:=n-64;
  z:=96-1+(z+n)mod(26);
  if z<97 then z:=z+26
  else z:=z;
  Edit3.Text:= Edit3.Text+chr(z);
  end
 
  //--Если шифруемое сообщение не входит в алфавит (.,! ? и т.д.)
  else if (z<65) or ((z>90) and (z<97)) or ((z>122) and (z<192)) and (((n>64) and (n<91)) or ((n>96) and (n<123)) or (n>191)) then
  Edit3.Text:= Edit3.Text+chr(z)
 
  //--Если в ключ входят символы не из алфавита (.,! ? и т.д.)
  else if (n<65) or ((n>90) and (n<97)) or ((n>122) and (n<192)) then
  begin
  ShowMessage('Введен некорректный ключ. Ключ не должен содержать символы');
  Edit3.Text:='';
  break;
  end
 
  //---Использование разных алфавитов
  else
  begin
  ShowMessage('Ключ и текст должны содержать символы из одного алфавита');
  Edit3.Text:='';
  break;
  end;
end;
  end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit3.Text:='';
s:=Edit1.Text;
k:=Edit2.Text;
for i:=1 to length(s) do
  begin
  z:=ord(s[i]);
  l:=length(k);
  p:=i;
   //--Циклическое считывание ключа
  if p>l then
    begin
     p:=(p)mod(l);
     if p=0 then p:=l
     else p:=p;
     end
    else p:=p;
  n:=ord(k[p]);
  //--Кириллица заглавные
  if ((z>=192) and (z<=223)) and ((n>=192) and (n<=255)) then
  begin
  z:=(z-191);
    if n>=224 then n:=n-223
    else n:=n-191;
  z:=((z-n)mod(32))+191+1;
  if z<192 then z:=z+32
  else z:=z;
  Edit3.Text:= Edit3.Text+chr(z);
  end
  //--Кириллица строчнык
  else if ((z>=224) and (z<=255)) and ((n>=192) and (n<=255)) then
  begin
  z:=(z-223);
  if n>=224 then n:=n-223
  else n:=n-191;
  z:=223+1+(z-n)mod(32);
  if z<224 then z:=z+32
  else z:=z;
  Edit3.Text:= Edit3.Text+chr(z);
  end
  //--Латиница заглавные
  else if ((z>=65) and (z<=90)) and (((n>=65) and (n<=90)) or ((n>=97) and (n<=122))) then
  begin
  z:=(z-64);
  if n>=97 then n:=n-96
  else n:=n-64;
  z:=64+1+(z-n)mod(26);
  if z<65 then z:=z+26
  else z:=z;
  Edit3.Text:= Edit3.Text+chr(z);
  end
  //--Латиница сточные
  else if ((z>=97) and (z<=122)) and (((n>=65 )and (n<=90)) or ((n>=97) and (n<=122))) then
  begin
  z:=(z-96);
  if n>=97 then n:=n-96
  else n:=n-64;
  z:=96+1+(z-n)mod(26);
  if z<97 then z:=z+26
  else z:=z;
  Edit3.Text:= Edit3.Text+chr(z);
  end
  //--Если шифруемое сообщение не входит в алфавит (.,! ? и т.д.)
  else if (z<65) or ((z>90) and (z<97)) or ((z>122) and (z<192)) and (((n>64) and (n<91)) or ((n>96) and (n<123)) or (n>191)) then
  Edit3.Text:= Edit3.Text+chr(z)
  //--Если в ключ входят символы не из алфавита (.,! ? и т.д.)
  else if (n<65) or ((n>90) and (n<97)) or ((n>122) and (n<192)) then
  begin
  ShowMessage('Введен некорректный ключ. Ключ не должен содержать символы');
  Edit3.Text:='';
  break;
  end
  //---Использование разных алфавитов
  else
  begin
  ShowMessage('Ключ и текст должны содержать символы из одного алфавита');
  Edit3.Text:='';
  break;
  end;
end;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
 
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2019, 10:06
Ответы с готовыми решениями:

Шифр Виженера
Приветствую всех! Вопрос таков: есть шифр, но нет ключа про ключ известно только что он состоит...

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

Шифр Виженера
Уважаемые Дамы и Господа! Есть такая вот задача: Разработать систему шифрования информации,...

Шифр Виженера: проверить, что входящий текст состоит только из букв
При запуске кода нужно проверить количество входящих значений и то, что входящее значение состоит...

9
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
05.03.2019, 10:59 2
Версию Делфи укажите.
0
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 9
05.03.2019, 11:39  [ТС] 3
RAD Studio Delphi 10 Seattle
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
05.03.2019, 11:45 4
Это юникодная версия и программа работать с ANSI(не ASCII) не будет, как правильно я не знаю, у меня Делфи 7.
0
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 9
05.03.2019, 16:58  [ТС] 5
спасибо
0
5706 / 2297 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
05.03.2019, 22:09 6
самое простое и первое что в голову приходит, переделать везде тип стринг на ансистринг, должно помочь
0
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 9
06.03.2019, 21:11  [ТС] 7
Дело в том что я и AnsiString и ShortString использовала
оно та шифрует и дешифрует тоолько не на русском!
Миниатюры
Шифр Виженера (работает только с латиницей)  
0
Модератор
9629 / 6233 / 2426
Регистрация: 21.01.2014
Сообщений: 26,591
Записей в блоге: 3
07.03.2019, 03:09 8
Цитата Сообщение от АнастасияШарова Посмотреть сообщение
оно та шифрует и дешифрует тоолько не на русском!
Вам же уже сказали - почему так... Коды русских символов в ANSI и UNICODE не совпадают! Тот код, чт раньше был русской буквой - теперь какая-нибудь кракозябра...
А вообще - чего мудрить-то с этими кодами символов? Тут алгоритм прост, как 3 копейки:
1. Задать строку, содержащую все нужные символы: русские и латинские буквы, цифры, знаки препинания и т.д.
2. Создать на основании этой строки матрицу (квадрат Вижинера)
3. Расширить ключ на длину текста.
3. В цикле производить поиск в матрице и вывод результата, пока не зашифруем/расшифруем весь текст.
0
Модератор
9629 / 6233 / 2426
Регистрация: 21.01.2014
Сообщений: 26,591
Записей в блоге: 3
07.03.2019, 11:13 9
Лучший ответ Сообщение было отмечено АнастасияШарова как решение

Решение

Примерно так:
Миниатюры
Шифр Виженера (работает только с латиницей)  
Вложения
Тип файла: rar Шифр Виженера.rar (4.4 Кб, 85 просмотров)
1
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 9
07.03.2019, 18:14  [ТС] 10
Спасибо большое!)))))
0
07.03.2019, 18:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2019, 18:14
Помогаю со студенческими работами здесь

Шифр Виженера: переписать код так, чтобы программа не только зашифровала, но и расшифровала текст
Текст он зашифрует но не расшифрует. А как сделать чтобы он зашифровал и расшифровал текст??? ...

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

Шифр Цезаря и шифр Виженера
1. Используя шифр Цезаря расшифруйте слово ЛГПЗРГ. Шифр Цезаря для русского алфавита со сдвигом на...

Шифр Виженера
Салют(; Написала прогу с реализацией одного метода, описанного на википедии, по формуле все вроде...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru