Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шифрование методом цезаря 
:(
    Опции темы
kupall
Дата 2.6.2010, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



зашифровать текст методом цезаря. алфавит-английские строчные буквы, сдвиг +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;



M
THandle
Модератор: используйте подсветку кода!

PM MAIL   Вверх
Keeper89
Дата 2.6.2010, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58





--------------------
PM MAIL WWW   Вверх
kupall
Дата 2.6.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) kupall - 2.6.2010, 10:15
PM MAIL   Вверх
PsiMagistr
Дата 2.6.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Друг, опиши во всех подробностях словами, чего хочешь от шифра?

Допустим у нас есть буква "а" исходного текста.

Сдвиг + 3 это:

3 = третья буква алфавита. То есть "В"

Операция шифрования (1 (первая буква алфавита) + 3 третья буква алфавита = 4)

Следовательно шифротекст для буквы а это четвертая буква то есть  "г".

В свое время писал шифровальщики. На VB. Все работало. Может, если объяснишь и на паскале сдюжу.

Пожалуйста, объясняй в примерах. 

Это сообщение отредактировал(а) PsiMagistr - 2.6.2010, 15:46


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
kupall
Дата 2.6.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



дело в том , что сам по себе есть сдвиг +3 и плюс нам надо замостить кодовое слово , к примеру, 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
PM MAIL   Вверх
PsiMagistr
Дата 2.6.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



НЕ совсем понял. Первая Срока алфавит. А вторая?
Сча кину тебе в личку скайп свяжись я там.

Добавлено через 6 минут и 48 секунд
ВСе кажется понял примерно, что ты хочешь. Поместить кодовое слово вовнутрь кодовой строки? psimagistr мой скайп.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
kupall
Дата 2.6.2010, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



да , первая строка алфавит . а под каждым символом стоит  закодированный символ , и как видишь , ключ расположен со сдвигом +3 , эти буквы y e s потом не повторяються , то есть закрепляються за d e f . Это получаеться как бы шифр виженера и цезаря вместе
пока скайп найду и установлю
PM MAIL   Вверх
PsiMagistr
Дата 2.6.2010, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Погоди минутку пишу кое что...


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 2.6.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Смотри,

Вот тебе предварительная функция, возвращающая алфавитную строчку, в зависимости от кодового слова и сдвига.

Подключи модуль: StrUtils (расширенные строковые функции)

Добавь на форму два компонента класса TEdit (Имя задай T и T2) и кнопку

В первый Edit будешь писать длину сдвига
Во второй кодовое слово на английском. Ключ.

Теперь функция:

Код

implementation

{$R *.dfm}

Function Preobrazovanie (numberkluch:integer; kluch:string) :string;
var alfavit:string; Var temp:integer;
begin
alfavit:= 'abcdefghijklmnopqrstuvwxyz';
Result := RightStr(alfavit, numberkluch);
Result:=Result+kluch;
temp:= Length(alfavit) - StrToInt(Form1.T.Text);
Result:=REsult + LeftStr(alfavit,temp);
ShowMessage(Result);
end;


В обработчике кнопки запиши:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
Preobrazovanie(StrToInt(T.Text), T2.Text);
end;


Теперь если введешь код yes а сдвиг 3 получишь:

 x y z y e s a b с d e f g h i j k l m n o p q r t u v w  - строку шифроалфавита. Потом можно и шифровать.








 

Это сообщение отредактировал(а) PsiMagistr - 2.6.2010, 18:26


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
kupall
Дата 2.6.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



получилось , выдал сообщение как бы новый шифроалфавит , но в нем 29 букв и буквы y e s повторяються , получается две буквы кодируются одинаково 
э но так нельзя .  и получается что мы  зашифровываем только то что напишем в коде проге , а не в потом в ручную.  
PM MAIL   Вверх
PsiMagistr
Дата 2.6.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Так. Все теперь понял. Тебе надо убрать повторяющиеся значения? Так?


Это сообщение отредактировал(а) PsiMagistr - 2.6.2010, 18:50


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
kupall
Дата 2.6.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



да , именно)
PM MAIL   Вверх
PsiMagistr
Дата 2.6.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Сможешь завтра вернуться? Я попробую переписать кое что.

Кинь скайп, так быстрее будет.

Это сообщение отредактировал(а) PsiMagistr - 2.6.2010, 19:08


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
kupall
Дата 2.6.2010, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



а что если выводить ответ не сообщением , а в новый edit  и новый алфавит вводит не в коде, а тоже в новый Edit.  я так попробовал , но он пишет , что не понимает что такое Edit3 . это наверно новый модуль так действует?
PM MAIL   Вверх
PsiMagistr
Дата 2.6.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Сообщение здесь только для примера.

Это сообщение отредактировал(а) PsiMagistr - 2.6.2010, 19:10


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
kupall
Дата 2.6.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



да , думаю завтра смогу и скайп установлю наконец-то)
PM MAIL   Вверх
PsiMagistr
Дата 2.6.2010, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Давай до завтра. А я пока подумаю, что можно сделать.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
kupall
Дата 2.6.2010, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



до завтра)
PM MAIL   Вверх
PsiMagistr
Дата 3.6.2010, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



kupall,  Кое что я вам придумал. Запишите:

Код

Function DelSim(kluch:string):string; //Эта функция будет сначала удалять из алфавита все символы ключа.
var alfavit: string; i : integer; simvol:string; S:integer;
begin
alfavit:= 'abcdefghijklmnopqrstuvwxyz';
For  i:= 1 To Length(kluch) do

begin
simvol:= kluch[i];
while Pos(simvol, alfavit) <> 0 do

begin
S:= Pos(simvol, alfavit);
Delete(alfavit, s,1);
end;
end;
Result:=alfavit;
end; 





Код

Function Preobrazovanie (numberkluch:integer; kluch:string) :string; // А это преобразововать алфавит без символов ключа в шифроалфавит.
var alfavit:string; Var temp:integer;
begin
alfavit := DelSim(Form1.T2.Text);
Result := RightStr(alfavit, numberkluch);
Result:=Result+kluch;
temp:= Length(alfavit) - StrToInt(Form1.T.Text);
Result:=REsult + LeftStr(alfavit,temp);
ShowMessage(Result);
end;




Киньте на форму кнопку. И два текстовых поля. T и T2. Т будет хранить смещение. Т2 сам ключ.

Запишите в обработчике:

procedure TForm1.Button1Click(Sender: TObject);
begin
Preobrazovanie(StrToInt(T.Text), T2.Text);
end;


И вы увидите шифроалфавит.

Обращайтесь.




Это сообщение отредактировал(а) PsiMagistr - 3.6.2010, 13:49


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
kupall
Дата 3.6.2010, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



круто) спасибо большое))
PM MAIL   Вверх
PsiMagistr
Дата 3.6.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



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

Добавлено @ 14:45
Код

Function DelSim(kluch:string):string;
var alfavit: string; i : integer; simvol:string; S:integer;
begin
alfavit:= 'abcdefghijklmnopqrstuvwxz';
For  i:= 1 To Length(kluch) do
begin
simvol:= kluch[i];
//while Pos(simvol, alfavit) <> 0 do

//begin
S:= Pos(simvol, alfavit);
Delete(alfavit, s,1);
//end;

end;
Result:=alfavit;
end;


Вот я убрал внутренний цикл.

Это сообщение отредактировал(а) PsiMagistr - 3.6.2010, 14:45


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 6.6.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Алекс-Юстасу или программа "Юный Штирлиц" (для шифровальщиков). 

Шифратор Вижинера (тот же шифратор Цезаря но с переменной позицией ключа).
 
Что-то подобное я писал на ВБ, а теперь решился повторить на Дельфи

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

Объясняю принцип действия "прибора":

1) Представим себе русский алфавит, замкнутый как бы в кольцо. То есть за буквой "я" идет "а".

2) Нам нужно зашифровать открытый текст: "гора" по ключевому слову: "дева"

3) Мы берем первый символ открытого текста: "г". Буква "г" занимает 4 позицию в алфавите.

4) Теперь берем первый символ ключа букву "д". Буква "д" занимает 5 позициую в алфавите.

5)  Плюсуем позиции открытого текста и ключа. 4+5 := 9; Девятую позицию в русском алфавите занимает буква "3".

6)  Значит "З" - первая буква шифровки.


Выйти за пределы алфавита нельзя - он замкнут в кольцо. Точно так же нельзя выйти за пределы слова ключа (за последней буквой ключа идет первая и т.д.).

Создайте проект и совершите необходимые приготовления:


1) Добавьте на форму два одинаковых поля класса TMemo с именами (Name) - txtOriginal и txtCode. В первом поле храним оригинальный текст, во втором получаем шифровку.

Текстовое поле класса TEdit с именем (Name) -  T.  Здесь держим ключ.

Добавьте также две кнопки. Не меняйте имен. Первая будет шифровать, вторая расшифровывать. Задайте соответствующие Caption  Расположите компоненты аккуратно, по своему вкусу.

Внимание код:

Код

//Перейдите в раздел глобальных переменных, запишите после слова var

Form1: TForm1; //Эту строку добавила среда Дельфи.

 SimText: string[1]; //Эта переменная хранит символ открытого текста

  SimCode:string[1]; //А эта переменная - символ ключа.

  i2:integer; //Счетчик позиции ключа

  Summa:Integer; // Сумма позиций символа ключа и и символа открытого текста

  const alfavit:string = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'; //Алфавитная константа. При желании можно добавить сюда заглавные //буквы и цифры

//Перейдите в обработчик щелка кнопки Button1 и запишите:

procedure TForm1.Button1Click(Sender: TObject);

var i:integer; //Локальная переменная счетчик цикла

begin //
if (T.Text <>'') and (TxtOriginal.Text <> '') then //Если поле открытого текста и ключевое поле не является пустым то:

begin //

txtCode.Clear; //очистим поле шифротекста

i2:= 0; //Обнулим счетчик ключа

For i:= 1 to Length(txtOriginal.Lines.Text) do // Мы входим в цикл от 1 до количества символов в оригинал-тексте. 

begin //В цикле выполняется:

SimText:= txtOriginal.Text[i]; 

If Pos(SimText,alfavit)<> 0 then
begin

Summa:=Pos(SimText,alfavit);
i2:= i2+1;
if i2> Length(T.Text) then i2:=1;
SimCode:= T.Text[i2];
Summa:= Summa+ Pos(SimCode, alfavit);
if Summa > Length(alfavit) then Summa:= Summa-Length(alfavit);
txtCode.Text:=txtCode.Text + Copy(alfavit,summa,1);
end

else
txtCode.Text:=txtCode.Text + SiMText;
end;
end

else
ShowMessage('Проверьте правильность ввода ключа и текста!');
end;

//Обработчик второй кнопки ("Дешифрование")

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
if (T.Text <>'') and (TxtOriginal.Text <> '') then

begin

txtCode.Clear;
i2:= 0;
For i:= 1 to Length(txtOriginal.Lines.Text) do
begin
SimText:= txtOriginal.Text[i];

If Pos(SimText,alfavit)<> 0 then
begin

Summa:=Pos(SimText,alfavit);
i2:= i2+1;
if i2 > Length(T.Text) then i2:=1;
SimCode := T.Text[i2];
Summa := Summa - Pos(SimCode, alfavit);
if Summa < 1 then Summa:= Length(alfavit)+Summa;

txtCode.Text := txtCode.Text + Copy(alfavit,summa,1);
end

else
txtCode.Text := txtCode.Text + SiMText;
end;
end

else
ShowMessage('Проверьте правильность ввода ключа и текста!');
end;

 


 smile  Я нарочно прервал линию комментариев. Попробуйте для начала сами разобраться, что именно происходит в коде.

Разработано и тестировано мною в среде Дельфи 6.

P.S. Для начинающих прогммеров: не вздумайте шифровать "Войну и мир," "Три мушкетера" и все другие большие по объему тексты. Зависание в цикле гарантирую.








Это сообщение отредактировал(а) PsiMagistr - 6.6.2010, 16:55


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Shreder
Дата 14.5.2012, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 14.5.2012

Репутация: нет
Всего: нет



Помогите пожалуйста. Препод в универе задал разработать Delphi-проект шифрования данных методом Цезаря. Алфавит - ЛАТИНСКИЕ СТРОЧНЫЕ БУКВЫ, ключ "yes", сдвиг +5. Предусмотреть автоматическую передачу фокуса и очистку редакционных полей после выполнения программы. И вообще не понятно как делать... если сможете помогите чем сможете ) будет достаточно всего лишь кода программы(желательно с комментариями) . форму в Delphi оформить смогу. 

Это сообщение отредактировал(а) Shreder - 14.5.2012, 17:11
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1141 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.