Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2010, 14:39   #1
Radiy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 10
По умолчанию Шифр Виженера

Хочу сделать программу, шифрующюю текст шифром ВИженера. Не получается, не выдаёт мне результат.
Код:
USES CRT;
var kl,sh,th:string; ch,dh,ah:array[1..255] of integer; l,d,i,i2:integer;
BEGIN
CLRSCR;
i2:=0;
writeln('Введите ключ');
readln(kl);
writeln('Введите шифруемое слово');
readln(sh);
l:=Length(kl);
for i:=0 to 255 do
i2:=i2+1;
if i>l then i:=i-l;
case kl[i] of
'А': ch[i2]:=0;
'Б': ch[i2]:=1;
'В': ch[i2]:=2;
'Г': ch[i2]:=3;
'Д': ch[i2]:=4;
'Е': ch[i2]:=5;
'Ё': ch[i2]:=6;
'Ж': ch[i2]:=7;
'З': ch[i2]:=8;
'И': ch[i2]:=9;
'Й': ch[i2]:=10;
'К': ch[i2]:=11;
'Л': ch[i2]:=12;
'М': ch[i2]:=13;
'Н': ch[i2]:=14;
'О': ch[i2]:=15;
'П': ch[i2]:=16;
'Р': ch[i2]:=17;
'С': ch[i2]:=18;
'Т': ch[i2]:=19;
'У': ch[i2]:=20;
'Ф': ch[i2]:=21;
'Х': ch[i2]:=22;
'Ц': ch[i2]:=23;
'Ч': ch[i2]:=24;
'Ш': ch[i2]:=25;
'Щ': ch[i2]:=26;
'Ъ': ch[i2]:=27;
'Ы': ch[i2]:=28;
'Ь': ch[i2]:=29;
'Э': ch[i2]:=30;
'Ю': ch[i2]:=31;
'Я': ch[i2]:=32;
end;
for i:=0 to 255 do
case sh[i] of
'А': dh[i]:=0;
'Б': dh[i]:=1;
'В': dh[i]:=2;
'Г': dh[i]:=3;
'Д': dh[i]:=4;
'Е': dh[i]:=5;
'Ё': dh[i]:=6;
'Ж': dh[i]:=7;
'З': dh[i]:=8;
'И': dh[i]:=9;
'Й': dh[i]:=10;
'К': dh[i]:=11;
'Л': dh[i]:=12;
'М': dh[i]:=13;
'Н': dh[i]:=14;
'О': dh[i]:=15;
'П': dh[i]:=16;
'Р': dh[i]:=17;
'С': dh[i]:=18;
'Т': dh[i]:=19;
'У': dh[i]:=20;
'Ф': dh[i]:=21;
'Х': dh[i]:=22;
'Ц': dh[i]:=23;
'Ч': dh[i]:=24;
'Ш': dh[i]:=25;
'Щ': dh[i]:=26;
'Ъ': dh[i]:=27;
'Ы': dh[i]:=28;
'Ь': dh[i]:=29;
'Э': dh[i]:=30;
'Ю': dh[i]:=31;
'Я': dh[i]:=32;
end;
ah[i]:=dh[i]+ch[i];
if ah[i]>32 then ah[i]:=ah[i]-33;
case ah[i] of
0: th[i]:='А';
1: th[i]:='Б';
2: th[i]:='В';
3: th[i]:='Г';
4: th[i]:='Д';
5: th[i]:='Е';
6: th[i]:='Ё';
7: th[i]:='Ж';
8: th[i]:='З';
9: th[i]:='И';
10: th[i]:='Й';
11: th[i]:='К';
12: th[i]:='Л';
13: th[i]:='М';
14: th[i]:='Н';
15: th[i]:='О';
16: th[i]:='П';
17: th[i]:='Р';
18: th[i]:='С';
19: th[i]:='Т';
20: th[i]:='У';
21: th[i]:='Ф';
22: th[i]:='Х';
23: th[i]:='Ц';
24: th[i]:='Ч';
25: th[i]:='Ш';
26: th[i]:='Щ';
27: th[i]:='Ъ';
28: th[i]:='Ы';
29: th[i]:='Ь';
30: th[i]:='Э';
31: th[i]:='Ю';
32: th[i]:='Я';
end;
writeln('Зашифрованный текст: ');
writeln(th);
readln;
end.
В чём проблема?
Radiy вне форума Ответить с цитированием
Старый 11.06.2010, 15:00   #2
Radiy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 10
По умолчанию

Тут используется метод сложения.
Radiy вне форума Ответить с цитированием
Старый 11.06.2010, 15:44   #3
A_r_r_a_y
Форумчанин
 
Аватар для A_r_r_a_y
 
Регистрация: 01.03.2008
Сообщений: 165
По умолчанию

begin и end у циклов расставить надо, а то получается, что, например, в первом case, рассматривается только последний символ
A_r_r_a_y вне форума Ответить с цитированием
Старый 11.06.2010, 16:28   #4
Radiy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 10
По умолчанию

Расствил, лучше не стало.
Кстати, первый цикл никогда не закончится, я исправил.
Radiy вне форума Ответить с цитированием
Старый 11.06.2010, 19:46   #5
A_r_r_a_y
Форумчанин
 
Аватар для A_r_r_a_y
 
Регистрация: 01.03.2008
Сообщений: 165
По умолчанию

ну вот, вроде так:
Код:
var
  a,kl,sh:string;
  th: array[1..255] of Char;
  ch,dh,ah:array[1..255] of integer;
  l,d,i,i2:integer;
BEGIN

  i2:=0;
  writeln('Input key:');
  readln(kl);
  writeln('Input word:');
  readln(sh);
  l:=Length(kl);

  for i:=1 to l do
    case kl[i] of
      'a': ch[i]:=0;
      'b': ch[i]:=1;
      'c': ch[i]:=2;
      'd': ch[i]:=3;
      'e': ch[i]:=4;
      'f': ch[i]:=5;
      'g': ch[i]:=6;
      'h': ch[i]:=7;
      'i': ch[i]:=8;
      'j': ch[i]:=9;
      'k': ch[i]:=10;
      'l': ch[i]:=11;
      'm': ch[i]:=12;
      'n': ch[i]:=13;
      'o': ch[i]:=14;
      'p': ch[i]:=15;
      'q': ch[i]:=16;
      'r': ch[i]:=17;
      's': ch[i]:=18;
      't': ch[i]:=19;
      'u': ch[i]:=20;
      'v': ch[i]:=21;
      'w': ch[i]:=22;
      'x': ch[i]:=23;
      'y': ch[i]:=24;
      'z': ch[i]:=25;
    end;
  for i:=1 to Length(sh) do
    begin
      case sh[i] of
        'a': dh[i]:=0;
        'b': dh[i]:=1;
        'c': dh[i]:=2;
        'd': dh[i]:=3;
        'e': dh[i]:=4;
        'f': dh[i]:=5;
        'g': dh[i]:=6;
        'h': dh[i]:=7;
        'i': dh[i]:=8;
        'j': dh[i]:=9;
        'k': dh[i]:=10;
        'l': dh[i]:=11;
        'm': dh[i]:=12;
        'n': dh[i]:=13;
        'o': dh[i]:=14;
        'p': dh[i]:=15;
        'q': dh[i]:=16;
        'r': dh[i]:=17;
        's': dh[i]:=18;
        't': dh[i]:=19;
        'u': dh[i]:=20;
        'v': dh[i]:=21;
        'w': dh[i]:=22;
        'x': dh[i]:=23;
        'y': dh[i]:=24;
        'z': dh[i]:=25;
      end;
    end;
  for i:=1 to Length(sh) do
    begin
      if (i <= l) then
        ah[i] := ch[i] + dh[i]
      else
        if ((i mod l) <> 0) then
          ah[i] := ch[i mod l] + dh[i]
        else
          ah[i] := ch[Length(kl)] + dh[i];
      if (ah[i]>25) then
        ah[i]:=ah[i]-26;
    end;

  for i:=1 to Length(sh) do
    begin
      case ah[i] of
        0: th[i]:='a';
        1: th[i]:='b';
        2: th[i]:='c';
        3: th[i]:='d';
        4: th[i]:='e';
        5: th[i]:='f';
        6: th[i]:='g';
        7: th[i]:='h';
        8: th[i]:='i';
        9: th[i]:='j';
        10: th[i]:='k';
        11: th[i]:='l';
        12: th[i]:='m';
        13: th[i]:='n';
        14: th[i]:='o';
        15: th[i]:='p';
        16: th[i]:='q';
        17: th[i]:='r';
        18: th[i]:='s';
        19: th[i]:='t';
        20: th[i]:='u';
        21: th[i]:='v';
        22: th[i]:='w';
        23: th[i]:='x';
        24: th[i]:='y';
        25: th[i]:='z';
      end;
    end;
writeln('cipher text: ');
writeln(th);
readln;
end.
у меня только с кирилицей не все в порядке, но думаю разберешься как переделать
A_r_r_a_y вне форума Ответить с цитированием
Старый 12.06.2010, 05:17   #6
Radiy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 10
По умолчанию

Спасибо.
Кстати вчера вечером всё таки смог сделать так, чтобы ключ повторялся до нужной длины при помощи цикла с предусловием.
Код:
l:=Length(kl);
l2:=Length(sh);
while l<l2 do
begin
l:=Length(kl);
l2:=Length(sh);
kl:=kl+kl;
end;
Radiy вне форума Ответить с цитированием
Старый 12.06.2010, 07:36   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а я Вам по секрету ещё скажу, что все конструкции с case, где по букве проставляется её код, или по коду буква могут быть заменены на ОДНУ строчку кода. Это возможно, т.к. все буквы у Вас идут подряд. В том же порядке, в каком они хранятся в таблице символов.
достаточно использовать функции ORD(Символ) или CHR(КодБуквы)

приведу пример:
вместо:
Цитата:
Код:
for i:=1 to l do
    case kl[i] of
      'a': ch[i]:=0;
      'b': ch[i]:=1;
      'c': ch[i]:=2;
...
      'y': ch[i]:=24;
      'z': ch[i]:=25;
    end;
можно написать так:
Код:
for i:=1 to Length(kl) do
    ch[i] := ord(kl[i]) - ord('a');
вместо:
Цитата:
Код:
 for i:=1 to Length(sh) do
    begin
      case sh[i] of
        'a': dh[i]:=0;
...
      'z': dh[i]:=25;
      end;
аналогично:
Код:
for i:=1 to Length(sh) do
  dh[i]:=ord(sh[i]) - ord('a');
и вместо обратного преобразования (кода в букву):
Цитата:
Код:
  for i:=1 to Length(sh) do
    begin
      case ah[i] of
        0: th[i]:='a';
...
        25: th[i]:='z';
      end;
    end;
достаточно
Код:
  
for i:=1 to Length(sh) do
     th[i]:= chr ( ah[i] + ord('a') );
p.s. собственно алгоритм кодирования я не смотрел....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.06.2010, 10:05   #8
A_r_r_a_y
Форумчанин
 
Аватар для A_r_r_a_y
 
Регистрация: 01.03.2008
Сообщений: 165
По умолчанию

Serge_Bliznykov, при шифровании не всегда используются стандартные коды символов, хотя именно для вижинера по сложению по большому счету все равно, а вообще, в теории, используется таблица, где индексы символов являются элементами поля Z по модулю n, где n простое число. Вроде так, хотя, возможно, я что-то путаю.
A_r_r_a_y вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Криптоанализ шифра Виженера kalbim Помощь студентам 3 17.05.2011 22:27
расшифровать виженера!!! Anenya.K Помощь студентам 4 06.03.2010 13:09
Шифрование Виженера Cubar Помощь студентам 10 10.06.2008 16:03