Всем доброго здравия, нужна программка,на Turbo Pascal. Надо реализовать программу шифратор текста и использованием перемешанного алфавита. Грубо говоря есть алфавит,мы выводим его на экран и вводим предложение/слово, далее следует перемешивание алфавита и шифрация нашего предложения/слова в соответствии с перемешанным алфавитом. Далее в той же программе,реализовать программу дешифратор, с использованием перемешанного алфавите в качестве ключа..как бы первая часть программы не вызывает затруднений,но все равно хотелось бы увидеть ваши мысли по этому поводу, так как у каждого разная фантазия-мышление) Вся проблема в реализации дешифровки..Желательно написать программу более примитивным чтоли языком..ибо на таком уровне я смекаю ,что к чему..Желательно к вечеру пятницы,получить уже хоть какой-нибудь материал.
Заранее спасибо.
С уважением,Денис
Как мешать алфавит? И шифрация слова в соответствии с алфавитом - значит, каждой букве слова сопоставляется буква из нового алфавита из той позиции, на которой стояла буква слова в старом-незамешанном ?
Заводим тип-алвафит:
type ab = 'A'..'Z'; // сюда любой диапазон можно задать
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;
спасибо за труд...но..это как бы не по моей основной специальности и я часть кода честно говоря не особо втыкаю...я такого не изучал,не встречался с таким еще...а перемешивание алфавита ну вот если только так :
.
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);
to это перебор вверх. Если начальное значение больше конечного, то цикл for не сработает ни разу.
то есть имеет смысл сделать downto?
да
хорошо,с рандомным перемешиванием алфавита разобрались,а дальше чего куда и как,помогите дописать код..ибо предложенное тут мне не понятно-темный лес, я же говорил не по основной специальности)почти самоучка)
.
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);
// 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.
ой видимо не тот код выложил...да я там просматривал,но там через процедуры..я оттуда взял перемешивание-да ,не скрою..но меня смутил 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)
> 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]], это тяжело что ли?
Если Pos уже научился работать за O(1), то ничего, тогда извините.