Форум программистов, компьютерный форум, киберфорум
Криптография
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
53 / 53 / 5
Регистрация: 06.04.2013
Сообщений: 178
1

Перестановочный шифр по ключу

16.10.2014, 23:56. Показов 761. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
помогите, мозг сломался, на такой, с первого взгляда, школьной задачке (завтра нужно сдать, а еще куча работы):
обычный перестановочный шифр по ключу, где строка вписывается в таблицу, кол-во столбцов = длине пароля, и потом переставляется в соотв. с сортировкой по алфавиту, потом считывается по вертикали.

данные ф-ции вроде шифруют и дешифруют, но куда-то выпадает 1 символ в обоих случаях, или шифрует нормально а расшифровывает с выпавшим символом. как то так...


просмотрел, ничего ни тут, ни в нете не нашел.
нужна ф-ция расшифрования, шифрует нормально. что не так? (этот код переделан с этого сайта с кода C++, возм. где-то проблемы с 0 или 1 указателем на массив)



Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
function code(txt :string; key :string):string;
var
  i, j, k, ind, col, row :Integer;
  arrtext :array[1..128,1..100] of char;
  text :string;
 
begin
    col:= Length(key);
    text:=txt;
    if (Length(text) mod col) <> 0 then row:=(Length(text) div col)+1
      else row:=Length(text) div col;
 
    for i:=1 to row do begin
      for j:=1 to col do begin
        arrtext[i,j]:= #0;
      end;
    end;
 
    for i:=1 to row do
      for j:=1 to col do
        arrtext[i,j]:= text[((i-1)*col)+j];
 
// for debug
{        for i:=1 to row do begin
      writeln;
      for j:=1 to col do begin
        write(arrtext[i,j],' ');
      end;
    end;
}
    text:='';
    //text[0]:=chr(Length(txt));
    SetLength(text, Length(txt));
    ind:= 1;
    //code
    for i:=1 to 255 do begin
       for j:=1 to col do begin
         if Ord(key[j])=i then begin
           for k:=1 to row do begin
// *************
               text[ind]:=arrtext[k, j];
               ind:=ind+1;
 
           end;
         end;
       end;
    end;
 
    code:=text;
end;
 
 
 
function decode(txt :string; key :string):string;
var
  i, j, k, ind, col, row :Integer;
  arrtext :array[1..128,1..100] of char;
  text :string;
 
begin
    col:= Length(key);
    text:=txt;
    if (Length(text) mod col) <> 0 then row:=(Length(text) div col)+1
      else row:=Length(text) div col;
 
    for i:=1 to row do begin
      for j:=1 to col do begin
        arrtext[i,j]:= #0;
      end;
    end;
 
    for i:=1 to row do
      for j:=1 to col do
        arrtext[i,j]:= text[((j-1)*row)+i];
 
// for debug
{   for i:=1 to row do begin
      writeln;
      for j:=1 to col do begin
        write(arrtext[i,j],' ');
      end;
    end;}
 
    ind:= 1;
    text:='';
    //text[0]:=chr(Length(txt));
    SetLength(text, Length(txt));
    //decode
    for i:=1 to row do begin
       for k:=1 to 256 do begin
         for j:=1 to col do begin
           if Ord(key[j])=k then begin
// **********
             text[ind]:=arrtext[i, j];
             ind:=ind+1;
             Break;                   
         
           end;
         end;
       end;
    end;
 
    decode:=text;
end;

пробовал где звездочки (// ********) ставить проверку (в code(), decode() соотв):

Pascal
1
2
3
4
if arrtext[k, j] <> #0 then begin
               text[ind]:=arrtext[k, j];
               ind:=ind+1;
end;

Pascal
1
2
3
4
5
if arrtext[i, j] <> #0 then begin 
             text[ind]:=arrtext[i, j];
             ind:=ind+1;
             Break;
end;
тогда шифрует нормально, но вот расшифровывает вообще какой то маразм.
=========================


еще придумал такой метод шифровки, вроде правильно работает, но расшифровку не могу придумать (psw-ключ, src исходное сообщение, s - результат шифрования):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
p_len:=length(psw);
 
{ загружаем в массив код каждой буквы пароля, (по которому будем сортировать
потом) и порядковый номер в строке (первая буква, вторая буква и т д) }
for i:=1 to p_len do with psw_arr[i] do begin
val:=Ord(psw[i]);
ind:=i;
end;
 
Writeln('Password array:');
for i:=1 to p_len do with psw_arr[i] do begin
write('"'+chr(val)+'"');
writeln(ind);
end;
 
{сортируем по алфавиту (коду символа) }
for i:=1 to p_len-1 do
for j:=i+1 to p_len do
if psw_arr[j].val < psw_arr[i].val then begin
_w:=psw_arr[j];
psw_arr[j]:=psw_arr[i];
psw_arr[i]:=_w;
end;
 
Writeln('Password array:');
for i:=1 to p_len do with psw_arr[i] do begin
write('"'+chr(val)+'"');
writeln(ind);
end;
 
{*** шифруем }
s:='';
for i:=1 to p_len do begin
_ofs:=psw_arr[i].ind;
j:=_ofs;
repeat
s:=s+src[j];
j:=j+p_len;
until j > Length(src); { пока не повыбираем буквы из исходного текста}
end;
=======================

нужно понять где ошибка, желательно в первых 2 ф-циях, или дописать декодер для последнего алгоритма.

Спасибо!

Добавлено через 38 минут
исходник взят отсюда: [ Перестановочный шифр с ключевым словом ]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2014, 23:56
Ответы с готовыми решениями:

Перестановочный шифр
Подскажите пожалуйста, как перебрать порядок цифр ключа(4ххх5 (известны 2 цифры ключа, остается...

перестановочный шифр
Доброе время суток! Помогите написать программу на Delphi используя шифр перестановки, например...

Перестановочный шифр
Добрый вечер! Реализовал шифрование с помощью перестановочного шифра, а вот с дешифровкой...

Перестановочный шифр.
На основе этого мне нужно написать рабочий код на С++. Материал прочитан на несколько раз и уже...

0
16.10.2014, 23:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2014, 23:56
Помогаю со студенческими работами здесь

Перестановочный шифр
Перестановочных шифров много. Это один из наиболее простых. Суть алгоритма в том, что сначала...

Столбцевой перестановочный шифр
Здравствуйте, помогите, пожалуйста. Нужно реализовать простой столбцевой перестановочный шифр. ...

Перестановочный шифр, исправить код
Задание : В перестановочных шифрах меняется порядок следования символов. В простом перестановочном...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru