2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Шифратор и дешифратор по Виженеру - проблема
Сообщение03.02.2013, 14:33 
Здравствуйте!
Получил от учителя задание: написать на TurboPascal шифратор и дешифратор по шифру Виженера.
Помогите, пожалуйста, составить эти 2-е программы.
Я нашел 2 варианта шифратора, но они дают разные результаты, что меня настораживает:
1:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
program p1;
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<span style="font-style: italic"> 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.


[i]2:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
program vigener;
uses crt;
 
var a,b,c,d:string;
    i,j,k,t,s:integer; key:array [1..100]of integer;
begin
clrscr;
writeln('Vvedite text ');
readln(a);
b:='AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz';
 
writeln('Vvedite kliucevoe slovo ');
readln(d);
 
for i:=1 to length(d) do begin
for j:=1 to length(b) do begin
if d[i]=b[j] then key[i]:=(j+1) div 2;
end;end;

for i:=1 to length(a) do begin
for j:=1 to length(b) do begin
s:= (i-1) mod length(d) +1;
t:=key[s];
k:=(j+2*t-1) mod length(b)+1;
if a[i]=b[j] then c:=c+b[k];
end;end;
writeln('&#144;Rezultat: ');
writeln(c);
readln;
end.


Прошу Вашей помощи.
Заранее благодарен!

 
 
 
 Re: Шифратор и дешифратор по Виженеру - проблема
Сообщение03.02.2013, 16:06 
Первая программа явно никуда не годна (догадайтесь, почему), даже если вторая неправильно работает.

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

-- Вс фев 03, 2013 19:14:55 --

Нет, вторая тоже не годится.

 
 
 
 Re: Шифратор и дешифратор по Виженеру - проблема
Сообщение07.02.2013, 11:41 
Используется синтаксис Delphi
var SourceText, KeyWord, EncryptText: string;
    i: integer;
begin
Readln(SourceText);
Readln(KeyWord);

for i:=1 to length(SourceText) do
  if ord(SourceText[i])+ord(KeyWord[i])<156
    then EncryptText:=EncryptText+chr(ord(SourceText[i])+ord(KeyWord[i])-65)
    else EncryptText:=EncryptText+chr(ord(SourceText[i])+ord(KeyWord[i])-91);

Writeln(EncryptText);
end.

 
 
 
 Re: Шифратор и дешифратор по Виженеру - проблема
Сообщение07.02.2013, 12:31 

(Оффтоп)

Как я все же люблю код с магическими константами. Кто такой 91? Кто такой 65? А если мне (не) повезло и char у меня — юникодный, и в ключевом слове все буквы лежат выше U+0400? Ладно, тут латинский алфавит, но со своим упорядочением, по-видимому — сдвиг "a" на двоечку дает "b", а не "c".

 
 
 
 Re: Шифратор и дешифратор по Виженеру - проблема
Сообщение07.02.2013, 14:15 
Забыла сказать: шифр и ключ. слово должны быть написаны большими американскими буквами))

(Оффтоп)

Joker_vD, просто было лень загонять числа в константы, а потом объяснять, что они означают :roll:

 
 
 
 Re: Шифратор и дешифратор по Виженеру - проблема
Сообщение07.02.2013, 15:59 
А и не надо загонять числа в константы, а потом что-то объяснять. Использованный вами Ord можно применять и к 'A'.

Tanechka в сообщении #681014 писал(а):
американскими буквами
:shock:

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group