Крипто-форум crprogram.16mb.com

Програмування на Object Pascal, Lazarus, криптографія, криптоаналіз, шифри, вихідні коди, вирішення задач, приклади програм

Часовий пояс: UTC десь + 2 години




Розпочати нову тему Відповісти  [ 14 повідомлень ] 
Автор Повідомлення
 Заголовок повідомлення: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 362
Перестановочний шифр — метод шифрування інформації, що полягає у перестановці знаків(букв. бітів) відкритого тексту згідно таблиці перестановки, яка у даному випадку є ключем.

найдавніші задокуметновані згадки цього шифра відносять до часів Давньої Греції, наприклад Скітала.


Востаннє редагувалось Raul в 08 лют 2013, 11:53, всього редагувалось 1 раз.

Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 502
Наприклад, текст «літо», зашифрований ключем «3241», буде виглядати так: «оілт».
л і т о
3 2 4 1
\ ! \ /
/ ! \ \
1 2 3 4
о і л т


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 502
Для інтерфейсу навчальних шифрів.

Процедура шифрування:
Код:
procedure CipherZ;
var
i,n,zd,nn:integer;
skey:string;
begin

if Lkey=0 then Lkey:=1;

zd:=-Lkey;
ntxt:=(ntxt div Lkey)*Lkey-1;
i:=-1;
repeat
i:=i+1;
if (i mod Lkey)=0 then zd:=zd+Lkey;
nn:=zd+key[(i mod Lkey)];
Ctxt[nn+1]:=Ptxt[i+1];
until i>ntxt;


for i:=1 to ntxt do
begin
skey:= ' / '+inttostr(Key[ (i-1) mod Lkey]);
form1.memo3.Lines.add(inttostr(i)+') '+inttostr(Ptxt[i])+'['+Caracter(Ptxt[i])+']'+skey+' => '+inttostr(Ctxt[i])+'['+Caracter(Ctxt[i])+']');
end;

end;


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 502
Ключ задаємо процедурою:
Код:
procedure TForm1.Edit1Change(Sender: TObject);
var
s:string;
i,j:integer;
tmp:byte;
d:array[0..50]of byte;
begin
for i:=0 to 50 do
d[i]:=i;

s:=edit1.text;
Lkey:=length(s);
for i:=1 to Lkey do
Key[i-1]:=CifraDeLetra(s[i]);

for j:=1 to Lkey do
for i:=0 to (Lkey-2) do
begin
if Key[i]>Key[i+1] then
begin
tmp:=Key[i];
Key[i]:=Key[i+1];
Key[i+1]:=tmp;
tmp:=d[i];
d[i]:=d[i+1];
d[i+1]:=tmp;
end;
end;

form1.memo3.Lines.clear;
for i:=0 to Lkey-1 do
begin
Key[i]:=d[i];
form1.memo3.Lines.add(inttostr(i)+' - '+inttostr(Key[i]));
end;

end;


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 502
Отже в результаті отримуємо вигляд програми:
Зображення


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 502
Схема підстановочного шифру:
(для прикладу довжина ключа = 4)

Зображення


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 3
ДУЖЕ необхідна програма, котра описана вище! Потрібен весь програмний код, а не тільки ті процедури. Дуже прошу. Скиньте програму, таку як на скріні, що Ви виклали для прикладу.
Дуже необхідна Ваша допомога!!!


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 502
2 кнопки, 3 memo, 1 edit.

Код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Ctxt,Ptxt:array[0..1000] of byte;
  key:array[0..50]of byte;
  ntxt,Lkey:integer;

implementation

{$R *.dfm}

function CifraDeLetra(x:string):byte;  // Літеру в її номер в алфавіті
var
z:byte;
begin
//Український алфавіт
//Пробіл
z:=ord(x[1]);
case z of
224..227: CifraDeLetra:=z-224; //а..г
180: CifraDeLetra:=4; //ґ
228..229: CifraDeLetra:=z-223; //д..е
186: CifraDeLetra:=7; //є
230..232: CifraDeLetra:=z-222; //ж..и
179: CifraDeLetra:=11; //і
191: CifraDeLetra:=12; //ї
233..249: CifraDeLetra:=z-220; //й..щ
252: CifraDeLetra:=30; //ь
254..255: CifraDeLetra:=z-223; //ю..я
else
CifraDeLetra:=33;
end;

end;

function Caracter(x:byte):string; //по номеру в алфавіті друкуємо літеру
begin
//Український алфавіт
//Пробіл
case x of
0..3: Caracter:=char(x+224); //а..г
4: Caracter:='ґ'; //ґ
5..6: Caracter:=char(x+223); //д..е
7: Caracter:='є'; //є
8..10: Caracter:=char(x+222); //ж..и
11: Caracter:='і'; //і
12: Caracter:='ї'; //ї
13..29: Caracter:=char(x+220); //й..щ
30: Caracter:='ь'; //ь
31..32: Caracter:=char(x+223); //ю..я
33: Caracter:=' '; //пробіл
end;

end;

procedure CipherZ;
var
i,zd,nn:integer;
skey:string;
begin

if Lkey=0 then Lkey:=1;

zd:=-Lkey;
ntxt:=(ntxt div Lkey)*Lkey-1;
i:=-1;
repeat
i:=i+1;
if (i mod Lkey)=0 then zd:=zd+Lkey;
nn:=zd+key[(i mod Lkey)];
Ctxt[nn+1]:=Ptxt[i+1];

until i>ntxt;


for i:=1 to ntxt do
begin
skey:= ' / '+inttostr(Key[ (i-1) mod Lkey]);
form1.memo3.Lines.add(inttostr(i)+') '+inttostr(Ptxt[i])+'['+Caracter(Ptxt[i])+']'+skey+' => '+inttostr(Ctxt[i])+'['+Caracter(Ctxt[i])+']');
end;

end;

procedure CipherR;
var
zd,nn,i:integer;

begin

if Lkey=0 then Lkey:=1;

zd:=-Lkey;
ntxt:=(ntxt div Lkey)*Lkey-1;
i:=-1;
repeat
i:=i+1;
if (i mod Lkey)=0 then zd:=zd+Lkey;
nn:=zd+key[(i mod Lkey)];
Ptxt[i+1]:=Ctxt[nn+1];

until i>ntxt;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
s,rez:string;
begin
s:=memo1.text;
ntxt:=length(s);
for i:=1 to ntxt do
Ptxt[i]:=CifraDeLetra(s[i]);

CipherZ;

rez:='';
for i:=1 to ntxt do
rez:=rez+Caracter(Ctxt[i]);

memo2.Text:=rez;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
s,rez:string;
begin
s:=memo1.text;
ntxt:=length(s);
for i:=1 to ntxt do
Ctxt[i]:=CifraDeLetra(s[i]);

CipherR;

rez:='';
for i:=1 to ntxt do
rez:=rez+Caracter(Ptxt[i]);

memo2.Text:=rez;

end;


procedure TForm1.Edit1Change(Sender: TObject);
var
s:string;
i,j:integer;
tmp:byte;
d:array[0..50]of byte;
begin
for i:=0 to 50 do
d[i]:=i;

s:=edit1.text;
Lkey:=length(s);
for i:=1 to Lkey do
Key[i-1]:=CifraDeLetra(s[i]);

for j:=1 to Lkey do
for i:=0 to (Lkey-2) do
begin
if Key[i]>Key[i+1] then
begin
tmp:=Key[i];
Key[i]:=Key[i+1];
Key[i+1]:=tmp;
tmp:=d[i];
d[i]:=d[i+1];
d[i+1]:=tmp;
end;
end;

form1.memo3.Lines.clear;
for i:=0 to Lkey-1 do
begin
Key[i]:=d[i];
form1.memo3.Lines.add(inttostr(i)+' - '+inttostr(Key[i]));
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Lkey:=4;
Key[0]:=0;
Key[1]:=1;
Key[2]:=3;
Key[3]:=2;

end;

end.


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 502
Програмну реалізацію "шифр перестановки" скачати (завантажити) можна тут:

Приєднання файлів:
ШП.exe.rar [166.51 KiB]
Скачали: 83

MD5 (ШП.exe.rar) = "0212D985B23875605BCBCCA2F9C5172E"
SHA-1 (ШП.exe.rar) = "4504A87F823F172C8538D3AB72874156B179B7B8"


інструкція:
1. Клацаємо на файлі та зберігаємо.
(2. Перевіряємо архів на віруси. - За бажанням.)
3. Розпаковуємо вміст архіву.
4. Клацаємо на програмі.
5. Вводимо ключ та відкритий текст.
6. Отримуємо шифр текст.


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 3
Я Вам дуже вдячний!!!


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 502
Відкриваєте Делфі, додаєте пусту форму, закидаєте на неї
Tariq писал(а):
2 кнопки, 3 memo, 1 edit.


Тоді просто копіюєте код і все.

Справа 3-х хвилин.


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 3
До Вас є ще одне питання...
Як шифрується, це зрозуміло, але як те повідомлення (зашифроване) розшифрувати??
Я наприклад шифрую текст, потім копіюю його, закриваю програму, відкриваю знову, вставляю зашифрований текст, ввожу ключ (такий самий як при шифруванні) натискаю кнопку "Розшифрувати", а в Memo2 виводиться не вірний текст!


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 502
Виправив код вище, має працювати.


Повернутися наверх
  
 
 Заголовок повідомлення: Re: Проста перестановка
СообщениеДодано: 09 гру 2014, 20:48 
Не в мережі

Повідомлень: 282
Приклад шифру перестановки, який використовували агенти абверу на східному фронті яких закидали за лінію фронту у 1942-44 роках:

Припустімо необхідно передати повідомлення:
"необхідна допомога."

На початку тексту ставився - номер телеграми, потім число місяця.
Пробіл, "ь", кома не шифрувались, "."="x".
Також крапками виділялись назви міст, номери, імена і т.д.

Припустімо номер телеграми 1, число 26.

Тоді
odin x dwa x shist x neobhidna dopomoga x

Далі використовувалась ключова фраза, наприклад
“budet choroschij natscin” ("будет хороший почин")

далі вибиралось випадкове число, наприклад 4.

Ключова фраза записувалась з літери №4, а під нею вписувався порядковий номер літери алфавіту

Після чого записують текст, з додаванням у випадковому порядку літер "s a w"

Наприклад
Код:
e_   t_   c_   h_   o_   r_   o_   s_   c_   h_   i_   j_   n_   a_   t_   s_   c_   h_   i_   n_   b_   u_   d_
07   21   03   08   16   18   17   19   04   09   11   13   14   01   22   20   05   10   12   15   02   23   06
o_   d_   i_   n_   x_   d_   w_   a_   x_   w_   s_   h_   i_   s_   t_   x_   n_   e_   o_   b_   h_   i_   d_
n_   a_   d_   o_   p_   o_   m_   o_   g_   a_   x_   s_   a_   w_   

Після чого літери виписуються згідно нумерації, для непарних номерів - зверху вниз, парних номерів - знизу вверх.

Код:
s   w   h   i   d   g   x   n   d   o   n   o   n   w   a   e   s   x   o   h   s
a   i   b   p   x   w   m   o   d   a   o   x   d   a   t   i   


після чого після другої на кожної четвертої літери ставиться випадкова літера, в результаті:

Цитата:
4-46
s w a h i d g m x n d o r n o n w s a e s x t
o h s a v i b p x r w m o d k a o x d s a t i


(на початок телеграми вписувався вибраний номер та кількість букв телеграми.)

Цитата:
4-46 swahidgmxndornonwsaesxtohsavibpxrwmodkaoxdsati



Незважаючи на всі ті додаткові дії з додаванням випадкових букв, вибору випадкового числа, по суті це звичайнісінький шифр перестановки.
За сучасних умов такий шифр ламався би за пару хвилин, і та група абверу не встигла би нічого зробити.


Повернутися наверх
  
 
Показати повідомлення за:  Сортувати по:  
Розпочати нову тему Відповісти  [ 14 повідомлень ] 

Часовий пояс: UTC десь + 2 години



cron
Роwеrеd bу рhрВB® аnd Hostinger web hosting