Здравствуйте.
помогите, мозг сломался, на такой, с первого взгляда, школьной задачке (завтра нужно сдать, а еще куча работы):
обычный перестановочный шифр по ключу, где строка вписывается в таблицу, кол-во столбцов = длине пароля, и потом переставляется в соотв. с сортировкой по алфавиту, потом считывается по вертикали.
данные ф-ции вроде шифруют и дешифруют, но куда-то выпадает 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 минут
исходник взят отсюда: [
Перестановочный шифр с ключевым словом ]