Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Сортировка псевдослучайным перемешиванием

Автор: Денис 1988 23.09.2011 0:26

Всем доброго здравия, нужна программка,на Turbo Pascal. Надо реализовать программу шифратор текста и использованием перемешанного алфавита. Грубо говоря есть алфавит,мы выводим его на экран и вводим предложение/слово, далее следует перемешивание алфавита и шифрация нашего предложения/слова в соответствии с перемешанным алфавитом. Далее в той же программе,реализовать программу дешифратор, с использованием перемешанного алфавите в качестве ключа..как бы первая часть программы не вызывает затруднений,но все равно хотелось бы увидеть ваши мысли по этому поводу, так как у каждого разная фантазия-мышление) Вся проблема в реализации дешифровки..Желательно написать программу более примитивным чтоли языком..ибо на таком уровне я смекаю ,что к чему..Желательно к вечеру пятницы,получить уже хоть какой-нибудь материал.

Заранее спасибо.
С уважением,Денис

Автор: Unconnected 23.09.2011 0:42

Как мешать алфавит? И шифрация слова в соответствии с алфавитом - значит, каждой букве слова сопоставляется буква из нового алфавита из той позиции, на которой стояла буква слова в старом-незамешанном ?

Автор: TarasBer 23.09.2011 13:20

Заводим тип-алвафит:


type ab = 'A'..'Z'; // сюда любой диапазон можно задать


название такое от слова "alphabet", сокращено, так как его надо будет часто писать

Заводим два вспомогательных массива для шифровки и дешифровки:


NormToShuffled, ShuffledToNorm: array [ab] of ab;



Составляем перемешанный массив:


for c := Low(ab) to High(ab) do NormToShuffled[c] := c;
for c := High(ab) downto succ(Low(ab)) do begin // цикл вниз от последнего символа (включительно) до первого (невключительно)
d := ab(random(integer©-integer(Low(ab))+1)+Low(ab)); // случайный символ от Low(ab) до c включительно
tmp := NormToShuffled[c]; // меняем местами элементы на c и на d местах
NormToShuffled[c] := NormToShuffled[d];
NormToShuffled[d] := tmp;
end;



Как с его помощью шифровать - понятно?
Для составления аналогичного массив для дешифрации пишем так:


for c := Low(ab) to High(ab) do
ShuffledToNorm[NormToShuffled[c]] := c;



Как это работает - сам разберись.

Автор: Денис 1988 23.09.2011 13:49

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


var
Key,Yek,s: string;
i,j,AlphaLen: integer;
c: char;
begin
Randomize;
Key:= 'abcdefghijklmnopqrstuvwxyz';
AlphaLen:= Length(Key);
for i:=AlphaLen to 2 do begin //вот тут жалуется и не всегда правильно или корректно срабатывает
j:= Random(i)+1;
c:= Key[i];
Key[i]:= Key[j];
Key[j]:= c
end;
WriteLn('Перемешанный алфавит: ',Key);

.

Автор: TarasBer 23.09.2011 13:52

to это перебор вверх. Если начальное значение больше конечного, то цикл for не сработает ни разу.

Автор: Денис 1988 23.09.2011 16:14

то есть имеет смысл сделать downto?

Автор: TarasBer 23.09.2011 16:40

да

Автор: Денис 1988 23.09.2011 23:54

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

Автор: Lapp 25.09.2011 12:41

Цитата(Денис 1988 @ 23.09.2011 10:49) *
спасибо за труд...но..это как бы не по моей основной специальности и я часть кода честно говоря не особо втыкаю...я такого не изучал,не встречался с таким еще...а перемешивание алфавита ну вот если только так :

var
Key,Yek,s: string;
i,j,AlphaLen: integer;
c: char;
begin
Randomize;
Key:= 'abcdefghijklmnopqrstuvwxyz';
AlphaLen:= Length(Key);
for i:=AlphaLen to 2 do begin //вот тут жалуется и не всегда правильно или корректно срабатывает
j:= Random(i)+1;
c:= Key[i];
Key[i]:= Key[j];
Key[j]:= c
end;
WriteLn('Перемешанный алфавит: ',Key);

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

Цитата(Денис 1988 @ 23.09.2011 20:54) *
хорошо,с рандомным перемешиванием алфавита разобрались,а дальше чего куда и как,помогите дописать код..ибо предложенное тут мне не понятно-темный лес, я же говорил не по основной специальности)почти самоучка)
хорошо, самоучка (жму руку, я тоже), я облегчу тебе работу. Там, откуда ты взял тот код, появилась недавно другая версия, которая использует один и тот же ключ для шифрования и расшифровки (то есть не использует переменную Yek). Вот тебе этот код. Постарайся скопировать его без ошибок..
// encrypting with random permutations
var
Key,s: string;
i,j,AlphaLen: integer;
c: char;

procedure InCrypt(var s: string; k: string);
var
i: integer;
begin
for i:=1 to Length(s) do
if s[i] in ['a'..'z'] then s[i]:= k[Ord(s[i])-Ord('a')+1]
end;


procedure DeCrypt(var s: string; k: string);
var
i: integer;
begin
for i:=1 to Length(s) do
if s[i] in ['a'..'z'] then s[i]:= Chr(Pos(s[i],k)+Ord('a')-1)
end;


begin
// create a random encryption key
Key:= 'abcdefghijklmnopqrstuvwxyz';
AlphaLen:= Length(Key);
for i:=AlphaLen downto 2 do begin
j:= Random(i)+1;
c:= Key[i];
Key[i]:= Key[j];
Key[j]:= c
end;
WriteLn('Encrypyion Key: ',Key);

// enter text here
s:= 'now, is the winter of our discontent made glorious summer by this sun of york!';
Writeln('Clear text:');
Writeln(s);

// encrypting
InCrypt(s,Key);
Writeln('Encrypted text:');
Writeln(s);

// decrypting
DeCrypt(s,Key);
Writeln('Decrypted text:');
Writeln(s);

Readln
end.


Автор: Денис 1988 25.09.2011 17:40

ой видимо не тот код выложил...да я там просматривал,но там через процедуры..я оттуда взял перемешивание-да ,не скрою..но меня смутил downto сейчас выложу то что у меня было в коде.Извините ошибься


uses crt ;
var K,s,Alf,Enc,Dec:String;
i,j,l,p:integer;
c:char;
begin clrscr;
for i:=97 to 122 do Alf:=Alf+Chr(i);
writeln('alfavit: ',Alf);
Randomize;
K:=Alf;
p:=Length(K);
for i:=p downto 2 do begin
j:=Random(i)+1;
c:=K[i];
K[i]:=K[j];
K[j]:=c
end;
writeln('Key: ',K);
writeln('Vedite stroku: ');
readln(s)

.


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

Автор: TarasBer 26.09.2011 13:15

> for i:=1 to Length(s) do
> if s[i] in ['a'..'z'] then s[i]:= Chr(Pos(s[i],k)+Ord('a')-1)

> for
> Pos

Передайте на тот другой форум, что они индусы, и чтобы больше так не делали.

Добавлено через 1 мин.
> энк и дек-нужны для шифра/дешифра но как их использовать не понятно..

что тут непонятного - циклом проходишь по строке, меняя S[i] на Key[S[i]], это тяжело что ли?

Автор: Lapp 26.09.2011 15:51

Цитата(TarasBer @ 26.09.2011 10:15) *
> for i:=1 to Length(s) do
> if s[i] in ['a'..'z'] then s[i]:= Chr(Pos(s[i],k)+Ord('a')-1)

> for
> Pos

Передайте на тот другой форум, что они индусы, и чтобы больше так не делали.

Тарас, поясни, плз.. не въезжаю.. что тут не так?

Автор: TarasBer 26.09.2011 15:56

Если Pos уже научился работать за O(1), то ничего, тогда извините.