Всем доброго здравия, нужна программка,на 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)) dobegin// цикл вниз от последнего символа (включительно) до первого (невключительно)
d := ab(random(integer(c)-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 to2dobegin//вот тут жалуется и не всегда правильно или корректно срабатывает
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 to2dobegin//вот тут жалуется и не всегда правильно или корректно срабатывает
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;
beginfor i:=1to Length(s) doif 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;
beginfor i:=1to Length(s) doif 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 downto2dobegin
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:=97to122do Alf:=Alf+Chr(i);
writeln('alfavit: ',Alf);
Randomize;
K:=Alf;
p:=Length(K);
for i:=p downto2dobegin
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), то ничего, тогда извините.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.