Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.06.2010, 01:34
kupall kupall вне форума
Прохожий
 
Регистрация: 02.06.2010
Сообщения: 6
Репутация: 10
По умолчанию шифрование текста

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

Код:
var
  Form1: TForm1;
  slovo,kluch,shifr,rasslovo:string;
  sl,kl,sh,rassl:char;
  i,k:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
shifr:='';
slovo:=edit1.Text;
kluch:=edit2.Text;
for i:=1 to length(slovo) do
begin
sl:=slovo[i];
kl:=kluch[i];
sh:=chr(100+(ord(sl)-97+ord(kl)-97)mod(26));
shifr:=shifr+sh;
end;
edit3.Text:=shifr;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
rasslovo:='';
shifr:=edit3.text;
kluch:=edit2.Text;
for k:=1 to length(shifr) do
begin
sh:=shifr[k];
kl:=kluch[k];
rassl:=chr(94+(ord(sh)-97+ord(kl)-97)mod(26));
rasslovo:=rasslovo+rassl;
end;
edit4.Text:=rasslovo;
end;
Ответить с цитированием
  #2  
Старый 02.06.2010, 04:58
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
По умолчанию =)

Дельфяка рядом нет, так что на глаз меня смущают разницы в строках

Код:
sh:=chr(100+(ord(sl)-97+ord(kl)-97)mod(26));
...
rassl:=chr(94+(ord(sh)-97+ord(kl)-97)mod(26));

Это раз. Во-вторых в цезаре при расшифровке вычитание, у тебя опять сложение. В-третьих написал бы строку разрешённых символов и работал бы с ней, как с алфавитом (чем не кольцо?), меньше бы проблем имел
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.

Последний раз редактировалось Ferra, 02.06.2010 в 05:03.
Ответить с цитированием
  #3  
Старый 02.06.2010, 11:23
kupall kupall вне форума
Прохожий
 
Регистрация: 02.06.2010
Сообщения: 6
Репутация: 10
По умолчанию

то есть задать строка символов вот так задать
const
a:string=('abcdefghijklmnopqrstuvwxyz')

или
const Buk:array[0..25] of char=('a','b','c','d','e','f','g','h','i','j','k', 'l','m','n','o','p','q','r','s','t','u','v','w','x ','y','z')
var b:array[0..25] of char;

а где там нужно поменять знаки? а мне казалось что все логично вроде)
sh:=chr(100+(ord(sl)-97+ord(kl)-97)mod(26));
...
rassl:=chr(94+(ord(sh)-97+ord(kl)-97)mod(26));

а так в целом нормально, чтоб зашифровать с ключом(кодовое слово) и со сдвигом на какое-то число?
Ответить с цитированием
  #4  
Старый 02.06.2010, 14:51
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
По умолчанию

Меня смущает то, что ты складываешь i-й символ ключа с i-м текста в обоих случаях. Во-вторых в Шифре Цезаря идёт сдвиг каждого символа на определённое фиксированное число. Так что поясни что ты хочешь сделать.
http://ru.wikipedia.org/wiki/Шифр_Цезаря

Сча набросал, вроде работает, лови:
Код:
//Найти позицию символа в алфавите
function PosInVoc(Symbol : Char; Vocabulary : String) : Word;
var
 i : Word;
begin
Result := 0;
 for i := 1 to Length(Vocabulary) do
  if Vocabulary[i] = Symbol then
    begin
    Result := i;
    break;
    end;
end;

//Шифрование Цзарем
function Caesar(Text : String; Seed : Byte; Vocabulary : String; Encrypt : Boolean = True) : String;
var
 i : LongWord;
 n, pos : Word;
begin
Result := '';
n := Length(Vocabulary);
Seed := Seed mod n;
 if Length(Text) <> 0 then
  for i := 1 to Length(Text) do
    begin
    pos := PosInVoc(Text[i], Vocabulary);
     if Encrypt then Result := Result + Vocabulary[(pos + Seed) mod n]
      else Result := Result + Vocabulary[(pos - Seed + n) mod n]
    end;
end;

//Использование
procedure TForm1.Button1Click(Sender: TObject);
Begin
//текст - "hello", шифруется в эдит1, дешифрация в эдит2
Edit1.Text := Caesar('hello', 3, 'qwertyuiopasdfghjklzxcvbnm', true);
Edit2.Text := Caesar(Edit1.Text, 3, 'qwertyuiopasdfghjklzxcvbnm', false);
end;
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #5  
Старый 02.06.2010, 15:41
kupall kupall вне форума
Прохожий
 
Регистрация: 02.06.2010
Сообщения: 6
Репутация: 10
По умолчанию

да , в вики он дан как просто шифр со сдвигом , но надо еще ключ замостить , к примеру , "yes" и тогда получиться такое соответствие

a b c d e f g h i j k l m n o p q r s t u v w x y z
w x z y e s a b с d f g h i j k l m n o p q r t u v

в твоей проге мы в коде указываем текст котрый потом зашифруеться , но нужно его вводить вручную, я как бы указал это , изменив код , но в итоге происходит только сдвиг букв
Edit1.Text := Caesar(edit4.text, 3, 'abcdefghijklmnopqrstuvwxyz', true);
Edit3.Text := Caesar(Edit1.Text, 3, 'abcdefghijklmnopqrstuvwxyz', false);
Ответить с цитированием
  #6  
Старый 02.06.2010, 16:06
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
По умолчанию

http://ru.wikipedia.org/wiki/Полиалфавитный_шифр
http://articles.org.ru/cn/showdetail.php?cid=8341

Вообще если сдвигать по ключу, то это Не Цезарь, а шифр Вижинера.
Вот код:

Код:
function PosInVoc(Symbol : Char; Vocabulary : String) : Word;
var
 i : Word;
begin
Result := 0;
 for i := 1 to Length(Vocabulary) do
  if Vocabulary[i] = Symbol then
    begin
    Result := i;
    break;
    end;
end;

function Viginer(Text : String; Key : String; Vocabulary : String; Encrypt : Boolean = True) : String;
var
 i, k : LongWord;
 n, pos, posk : Word;
begin
Result := '';
n := Length(Vocabulary);
k := 1;
 if Length(Text) <> 0 then
  for i := 1 to Length(Text) do
    begin
    pos := PosInVoc(Text[i], Vocabulary);
    posk := PosInVoc(Key[k], Vocabulary);
     if pos = 0 then break;
     if Encrypt then Result := Result + Vocabulary[(pos + posk) mod n]
      else Result := Result + Vocabulary[(pos - posk + n) mod n];
     if k > Length(Key) then k := 1
      else inc(k);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
Begin
Edit1.Text := Viginer(EditText.Text, EditKey.Text, 'abcdefghigklmnopqrstuvwxyz', true);
Edit2.Text := Viginer(Edit1.Text, EditKey.Text , 'abcdefghigklmnopqrstuvwxyz', false);
end;
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #7  
Старый 02.06.2010, 16:36
kupall kupall вне форума
Прохожий
 
Регистрация: 02.06.2010
Сообщения: 6
Репутация: 10
По умолчанию

а сейчас не хочет запускаться , ошибка - EditText.text не понимает , наверно опечатка , но когда исправляю вот так ,
Edit1.Text := Viginer(Edit3.Text, EditKey.Text , 'abcdefghigklmnopqrstuvwxyz', true);
Edit2.Text := Viginer(Edit1.Text, EditKey.Text , 'abcdefghigklmnopqrstuvwxyz', false);

то начинает не понимать что такое EditKey
и увидел ошибку после then (comparing signed and unsigned types - widened both operands)
if k > Length(Key) then k := 1
else inc(k);
Ответить с цитированием
  #8  
Старый 02.06.2010, 16:50
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
По умолчанию

Лови, так будет проще, чем объяснять основы. Delphi 7.
Вложения
Тип файла: rar Viginer.rar (3.3 Кбайт, 92 просмотров)
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #9  
Старый 02.06.2010, 17:31
kupall kupall вне форума
Прохожий
 
Регистрация: 02.06.2010
Сообщения: 6
Репутация: 10
По умолчанию

разберусь , благодарю за помощь)
Ответить с цитированием
  #10  
Старый 02.06.2010, 17:37
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
По умолчанию

Эта проверка на то, есть ли текущий символ текста в алфавите:
Код:
if pos = 0 then break;
Можешь добавить проверку и на символы ключа.. Или вообще убрать, по сути если символа нет в алфавите - то ничего он не изменит.
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #11  
Старый 02.06.2010, 17:56
kupall kupall вне форума
Прохожий
 
Регистрация: 02.06.2010
Сообщения: 6
Репутация: 10
По умолчанию

а function Viginer делфи знает как стандартную или мы просто так ее обозвали? извиняюсь за глупый вопрос, но чтоб уж точно понять)
Ответить с цитированием
  #12  
Старый 02.06.2010, 19:30
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
По умолчанию

Мы дали ей такое название, её можно было назвать как угодно и потом вызывать по этому имени.

http://informatics.lgg.ru/pascal9.html
Почитай - там доступно рассказано, по сути в Дельфи то же самое.
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:19.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025