Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка псевдослучайным перемешиванием
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Денис 1988
Всем доброго здравия, нужна программка,на Turbo Pascal. Надо реализовать программу шифратор текста и использованием перемешанного алфавита. Грубо говоря есть алфавит,мы выводим его на экран и вводим предложение/слово, далее следует перемешивание алфавита и шифрация нашего предложения/слова в соответствии с перемешанным алфавитом. Далее в той же программе,реализовать программу дешифратор, с использованием перемешанного алфавите в качестве ключа..как бы первая часть программы не вызывает затруднений,но все равно хотелось бы увидеть ваши мысли по этому поводу, так как у каждого разная фантазия-мышление) Вся проблема в реализации дешифровки..Желательно написать программу более примитивным чтоли языком..ибо на таком уровне я смекаю ,что к чему..Желательно к вечеру пятницы,получить уже хоть какой-нибудь материал.

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


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

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
to это перебор вверх. Если начальное значение больше конечного, то цикл for не сработает ни разу.
Денис 1988
то есть имеет смысл сделать downto?
TarasBer
да
Денис 1988
хорошо,с рандомным перемешиванием алфавита разобрались,а дальше чего куда и как,помогите дописать код..ибо предложенное тут мне не понятно-темный лес, я же говорил не по основной специальности)почти самоучка)
Lapp
Цитата(Денис 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
ой видимо не тот код выложил...да я там просматривал,но там через процедуры..я оттуда взял перемешивание-да ,не скрою..но меня смутил 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
> 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
Цитата(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
Если Pos уже научился работать за O(1), то ничего, тогда извините.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.