Всем доброго здравия, нужна программка,на Turbo Pascal. Надо реализовать программу шифратор текста и использованием перемешанного алфавита. Грубо говоря есть алфавит,мы выводим его на экран и вводим предложение/слово, далее следует перемешивание алфавита и шифрация нашего предложения/слова в соответствии с перемешанным алфавитом. Далее в той же программе,реализовать программу дешифратор, с использованием перемешанного алфавите в качестве ключа..как бы первая часть программы не вызывает затруднений,но все равно хотелось бы увидеть ваши мысли по этому поводу, так как у каждого разная фантазия-мышление) Вся проблема в реализации дешифровки..Желательно написать программу более примитивным чтоли языком..ибо на таком уровне я смекаю ,что к чему..Желательно к вечеру пятницы,получить уже хоть какой-нибудь материал.
Заранее спасибо. С уважением,Денис
Unconnected
23.09.2011 0:42
Как мешать алфавит? И шифрация слова в соответствии с алфавитом - значит, каждой букве слова сопоставляется буква из нового алфавита из той позиции, на которой стояла буква слова в старом-незамешанном ?
TarasBer
23.09.2011 13:20
Заводим тип-алвафит:
type ab = 'A'..'Z'; // сюда любой диапазон можно задать
название такое от слова "alphabet", сокращено, так как его надо будет часто писать
Заводим два вспомогательных массива для шифровки и дешифровки:
Как с его помощью шифровать - понятно? Для составления аналогичного массив для дешифрации пишем так:
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);
ой видимо не тот код выложил...да я там просматривал,но там через процедуры..я оттуда взял перемешивание-да ,не скрою..но меня смутил 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), то ничего, тогда извините.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.