|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
программа в которой нужно реализовать режим шифровки расшифровки
Помогите пожалуйста немного переделать, программа работает, но нужно сделать так, что бы:
1) режим шифровки и расшифровки был независим от друга 2)при вводе строки кол-во символов должно быть кратно ключу , иначе нужно повторить ввод __________________________________________________ _______ вот сама задача: Написать программу в которой нужно реализовать режим шифровки расшифровки, и возможность дополнительного контроля ввода Входными данными программы должны быть: - для режима шифрования: строка текста и ключ, указывающий раз- мер блока и порядок перестановки в пределах этого блока; -для режима расшифровки: закрытый текст и ключ, указывающий размер блока и порядок перестановки в пределах этого блока. Выходными данными являются: -для режима шифрования: закрытый текст; -для режима расшифровки: открытый текст. Используемые переменные: – s, r – строки открытого и закрытого текста соответственно; – len – длина текстовой строки; – a – массив, содержащий числа, определяющие порядок перестановки; – i, j, v – счетчики циклов и вспомогательная переменная целого типа; – key – размер блока. Пример : Открытый текст: "ШИФРОВАНИЕ_ПЕРЕСТАНОВКОЙ". Ключ (правило перестановки): группы из 8 букв с порядковыми номерами 1, 2, ..., 8 переставить в порядок 3-8-1-5-2-7-6-4. Шифртекст: "ФНШОИАВР_СИЕЕЕРПННТВАОКО". Код:
program Project1; {$APPTYPE CONSOLE} uses windows, SysUtils; const n=30; var a,b:array[1..n] of integer; s,s1,s2,r,ch:string; i, j, p, key,k:integer; m:set of byte; c:char; begin SetConsoleCP(1251); SetConsoleOutputCP(1251); r:=''; repeat writeln('Выберите действие'); writeln('1-зашифровать текст'); writeln('2-расшифровать текст'); writeln('другое - выход'); readln(c); case c of '1':begin writeln('Введите текст для шифрования: '); readln(s); repeat write('Введите количество цифр в ключе от 2 до ',n,' key= '); readln(ch); val(ch,key,k); until (k=0)and(key in [1..n]); //если число и в интервале 1..n while length(s) mod key<>0 do s:=s+' '; writeln('Введите ключ из неповторяющихся чисел от 1 до ',key,' : '); m:=[]; for i:=1 to key do begin repeat write('a[',i,']='); readln(ch); val(ch,p,k); until(k=0)and(p in [1..key])and not(p in m); a[i]:=p; m:=m+[p]; end; i:=1; while i<=length(s)-key+1 do begin s1:=copy(s,i,key); s2:=''; for j:=1 to key do s2:=s2+s1[a[j]]; r:=r+s2; i:=i+key; end; for i:=length(r) downto 1 do if r[i]=' ' then delete(r,i,1); writeln('Зашифрованный текст: '); writeln(r); write('Нажмите Enter'); readln; end; '2':begin if r='' then writeln('Зашифрованный текст еще не создан, вернитесь к пункту 1') else begin //создадим ключ для дешифровки for i:=1 to key do begin for j:=1 to key do if a[j]=i then b[i]:=j end; s:=r; while length(s) mod key<>0 do s:=s+' '; r:=''; i:=1; while i<=length(s)-key+1 do begin s1:=copy(s,i,key); s2:=''; for j:=1 to key do s2:=s2+s1[b[j]]; r:=r+s2; i:=i+key; end; for i:=length(r) downto 1 do if r[i]=' ' then delete(r,i,1); writeln('Расшифрованный текст'); writeln(r); end; write('Нажмите Enter'); readln; end; else begin writeln('Программа завершена'); exit; end; end; until not(c in ['1','2']); End. |