Форум «Всё о Паскале» _ Задачи _ Кодирование и декодлирование текстовой информации методом Гронсфельда
Автор: MultiBlock 4.10.2006 20:12
Народ, помогите, пожалуйста, с программой! Нужно соединить 2 части (шифратор и дешифратор) + нужно чтобы текст забивался через программу, либо читался из файла, а результат записывался тоже в файл, но в другой. И цифровой ключ должен вводиться тоже через программу! Помогите! P.S. Спасибо всем кто откликнется!
Код
{ Шифровальщик Программа читает файл s и записывает результат в s1 }
function getnum(c: char): integer; var n: integer; begin case c of '0': n := 0; '1': n := 1; '2': n := 2; '3': n := 3; '4': n := 4; '5': n := 5; '6': n := 6; '7': n := 7; '8': n := 8; '9': n := 9; else n := -1; end; getnum := n; end;
const N1 = 10; { максимальное количество строк в файле } N2 = 2; { количество алфавитов } var f,f1: text; s,n,s1: string; i,j,k,l,m: integer; c: integer; { счётчик пизиции в строке кода } w : array [1..N1] of string; { строки } w1 : array [1..N1] of string; { строки } abc : array [1..N2] of string; { алфавиты } begin abc[1] := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; abc[2] := 'abcdefghijklmnopqrstuvwxyz'; writeln(''); writeln(' *** Шифровка методом Гронсфельда ***'); { write('Имя файла: '); readln(s); write('Цифровой ключ (4 или меньше цифры ): '); readln(n); } s := 'C:\Work4\1.dat'; s1 := 'C:\Work4\2.dat'; n := '2718'; assign(f,s); assign(f1,s1); reset(f); rewrite(f1); i := 1; { читаем файл } while not EOF(f) and (i<=N1) do begin readln(f,w[i]); w1[i]:=w[i]; inc(i); end; { кодируем } { 1-й цикл - по строкам из файла } { 2-й цикл - по элементам в строке из файла } { 3-й цикл - по алфавитам } { 4-й цикл - по элементам алфавита } c := 1; for i := 1 to N1 do if ord(w[i][0])<>0 then for j := 1 to (ord(w[i][0])+1) do for k := 1 to N2 do for l := 1 to (ord(abc[k][0])+1) do begin if abc[k][l]=w[i][j] then begin m := l+getnum(n[c]); inc(c); if c>ord(n[0]) then c := 1; if m>ord(abc[k][0]) then m := m-ord(abc[k][0]); w1[i][j] := abc[k][m]; end; end; writeln(''); for i:=1 to N1 do begin writeln(w[i]); writeln(w1[i]); end; for i := 1 to N1 do begin for j := 1 to ord(w1[i][0]) do write(f1,w1[i][j]); writeln(f1,''); end; writeln('Нажмите Enter'); read(s); end.
Код
{ Дешифратор Программа читает файл s и записывает результат в s1 }
function getnum(c: char): integer; var n: integer; begin case c of '0': n := 0; '1': n := 1; '2': n := 2; '3': n := 3; '4': n := 4; '5': n := 5; '6': n := 6; '7': n := 7; '8': n := 8; '9': n := 9; else n := -1; end; getnum := n; end;
const N1 = 10; { максимальное количество строк в файле } N2 = 2; { количество алфавитов } var f,f1: text; s,n,s1: string; i,j,k,l,m: integer; c: integer; { счётчик пизиции в строке кода } w : array [1..N1] of string; { строки } w1 : array [1..N1] of string; { строки } abc : array [1..N2] of string; { алфавиты } begin abc[1] := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; abc[2] := 'abcdefghijklmnopqrstuvwxyz'; writeln(''); writeln(' *** Шифровка методом Гронсфельда ***'); { write('Имя файла: '); readln(s); write('Цифровой ключ (4 или меньше цифры ): '); readln(n); } s := 'C:\Work4\2.dat'; s1 := 'C:\Work4\3.dat'; n := '2718'; assign(f,s); assign(f1,s1); reset(f); rewrite(f1); i := 1; { читаем файл } while not EOF(f) and (i<=N1) do begin readln(f,w[i]); w1[i]:=w[i]; inc(i); end; { кодируем } { 1-й цикл - по строкам из файла } { 2-й цикл - по элементам в строке из файла } { 3-й цикл - по алфавитам } { 4-й цикл - по элементам алфавита } c := 1; for i := 1 to N1 do if ord(w[i][0])<>0 then for j := 1 to (ord(w[i][0])+1) do for k := 1 to N2 do for l := 1 to (ord(abc[k][0])+1) do begin if abc[k][l]=w[i][j] then begin m := l-getnum(n[c]); inc(c); if c>ord(n[0]) then c := 1; if m<1 then m := m+ord(abc[k][0]); w1[i][j] := abc[k][m]; end; end; writeln(''); for i:=1 to N1 do begin writeln(w[i]); writeln(w1[i]); end; for i := 1 to N1 do begin for j := 1 to ord(w[i][0]) do write(f1,w1[i][j]); writeln(f1,''); end; writeln('Нажмите Enter'); read(s); end.
Автор: volvo 4.10.2006 20:26
Здесь есть реализация процедур шифровки/дешифровки методом Гронсфельда
Добавь только чтение из файла/запись в файл, и все...
Автор: MultiBlock 4.10.2006 20:39
Я видел... дело в том что я только начал осваивать паскаль... до этого год учил Си... нужна так сказать поддержка и помощь... конечно это будет нагло с моей стороны, но хочется попросить нельзяли добавить это самое чтение и запись из/в файл. Буду очень признателен...
Автор: volvo 4.10.2006 21:00
Файл GRONSFLD.PAS
function GronsfeldEncipher(toCode, K: string): string; var i, T, _T: integer; begin for i := 1 to length(toCode) do begin _T := ord(toCode[ i ]);
T := (Ord(toCode[ i ])
+ (Ord(K[(pred(i) mod length(K)) + 1]) - Ord('0'))
);
if T >= 256 then dec(T, 256); toCode[ i ] := Chr(T); end; GronsfeldEncipher := toCode; end;
function GronsfeldDecipher(toDecode, K: string): string; var i, T: integer; begin for i := 1 to length(toDecode) do begin T := (Ord(toDecode[i])
- (Ord(K[(pred(i) mod length(K)) + 1]) - Ord('0'))
); if T < 0 then Inc(T, 256); toDecode[ i ] := Chr(T); end; GronsfeldDecipher := toDecode; end;
readln(f_in, s); if paramstr(1) = '/e' then s := GronsfeldEncipher(s, '2178') else s := GronsfeldDecipher(s, '2178');
writeln(f_out, s); end;
close(f_out); close(f_in); end.
Запускать с 3-мя параметрами. Первый: /e или /d (соответственно для кодирования и ДЕкодирования) Второй: имя входного файла (ИЗ которого будет читаться информация для операции, заданной первым ключом) Третий: имя выходного файла (в него запишется информация, за- или рас-кодированная, в зависимости от первого ключа)...
Пример использования:
Цитата(console)
...>GRONSFLD /e 700.txt 700.out
шифрует текст, содержащийся в файле 700.txt, и записывает результат в файл 700.out (Внимание!! Если файл 700.out уже существует - он будет перезаписан!!!)
Цитата(console)
...>GRONSFLD /d 700.out 700.txt
дешифрует текст, содержащийся в файле 700.out, и записывает результат в файл 700.txt (аналогично, если файл 700.txt уже существует - он тоже будет перезаписан!!!)
Пример файла, на котором тестировалась программа: 700.txt ( 664 байт )
Кол-во скачиваний: 577
Автор: MultiBlock 6.10.2006 18:46
Не работает код просто вылетает сразу после запуска и все. Обидно блин...
Автор: volvo 6.10.2006 18:49
MultiBlock, я бы попросил добавлять в следующий раз "У МЕНЯ не работает", договорились? Если я его выложил, значит все сработало. Могу прикрепить EXE, если нужно. Версия компилятора какая? (ЭТО, кстати, нужно указывать СРАЗУ!)
Также ЖЕЛАТЕЛЬНО привести командную строку, которой запускалась программа, иначе рассматриваться всерьез такие заявления не могут...
Автор: MultiBlock 6.10.2006 19:15
Может я что-то не правильно делаю, поэтому и не работает, но если можно, то от EXE я не откажусь.
Автор: MultiBlock 17.10.2006 1:57
Опять обращаюсь к Вам за помощью. Вот объединил две программы, но теперь ругается на конец программы (...end; read(s); end. ): error 85 ";" expected. Понятно что пропустил знак точка с запятой, но вопрос: какая в конце программы точка с запятой??? Там должен быть and. а он говорит надо ; Ни чего не могу понять... Вот код программы:
Код
program Coding_and_decoding_of_the_text_information_by_method_Gronsfelds; uses crt,dos;
const N1 = 5; { The maximum quantity of lines in a file } N2 = 3; { Quantity of alphabets } var f,f1: text; s,ne,s1: string; i,j,k,l,m: integer; ce: integer; { The counter of a position in a line of a code } w : array [1..N1] of string; { Lines } w1 : array [1..N1] of string; { Lines } abc : array [1..N2] of string; { Alphabets } sign : string;
label menugame,coding,decoding,help;
{Main part}
begin clrscr;
{Menu programm}
menugame: while 1>0 do begin title; gotoxy(30,18); textcolor(1); write('Press C for coding'); gotoxy(30,20); textcolor(1); write('Press D for decoding'); gotoxy(30,22); textcolor(1); write('Press H for help'); gotoxy(30,24); textcolor(1); write('Press E for exit'); case readkey of #99 : goto coding; #100 : goto decoding; #104 : goto help; #101 : exit; end; end;
{Coding}
coding: begin case c of '0': n := 0; '1': n := 1; '2': n := 2; '3': n := 3; '4': n := 4; '5': n := 5; '6': n := 6; '7': n := 7; '8': n := 8; '9': n := 9; else n := -1; end; getnum := n; end;
begin abc[1] := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; abc[2] := 'abcdefghijklmnopqrstuvwxyz'; abc[3] := '0123456789'; writeln(' *** An encryption method Gronsfeld ***'); write('Enter a full way to a file from which it is readable: '); readln(s); write('Enter a full way to a file in which we write: '); readln(s1); write('Enter a digital key (4 figures or less): '); readln(n); assign(f,s); assign(f1,s1); reset(f); rewrite(f1); i := 1;
{ Reads a file }
while not EOF(f) and (i<=N1) do begin readln(f,w[i]); w1[i]:=w[i]; inc(i); end;
{ We code } { 1-st cycle - in the lines from a file } { 2-nd cycle - on elements in line from a file } { 3-rd cycle - under alphabets } { 4-th cycle - on elements of the alphabet }
ce := 1; for i := 1 to N1 do if ord(w[i][0])<>0 then for j := 1 to (ord(w[i][0])+1) do for k := 1 to N2 do for l := 1 to (ord(abc[k][0])+1) do begin if abc[k][l]=w[i][j] then begin m := l+getnum(ne[ce]); inc(ce); if ce>ord(ne[0]) then ce := 1; if m>ord(abc[k][0]) then m := m-ord(abc[k][0]); w1[i][j] := abc[k][m]; end; end; for i:=1 to N1 do begin writeln(w[i]); writeln(w1[i]); end; for i := 1 to N1 do begin for j := 1 to ord(w1[i][0]) do write(f1,w1[i][j]); writeln(f1,s1,''); end; begin title; gotoxy(30,18); textcolor(1); write('Press C for coding'); gotoxy(30,20); textcolor(1); write('Press D for decoding'); gotoxy(30,22); textcolor(1); write('Press H for help'); gotoxy(30,24); textcolor(1); write('Press E for exit'); case readkey of #99 : goto coding; #100 : goto decoding; #104 : goto help; #101 : exit; end; end; read(s); end;
{Decoding}
decoding: begin case c of '0': n := 0; '1': n := 1; '2': n := 2; '3': n := 3; '4': n := 4; '5': n := 5; '6': n := 6; '7': n := 7; '8': n := 8; '9': n := 9; else n := -1; end; getnum := n; end;
begin abc[1] := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; abc[2] := 'abcdefghijklmnopqrstuvwxyz'; abc[3] := '0123456789'; writeln(' *** An encryption method Gronsfeld ***'); write('Enter a full way to a file from which it is readable: '); readln(s); write('Enter a full way to a file in which we write: '); readln(s1); write('Enter a digital key (4 figures or less): '); readln(n); assign(f,s); assign(f1,s1); reset(f); rewrite(f1); i := 1;
{ Reads a file }
while not EOF(f) and (i<=N1) do begin readln(f,w[i]); w1[i]:=w[i]; inc(i); end;
{ We code } { 1-st cycle - in the lines from a file } { 2-nd cycle - on elements in line from a file } { 3-rd cycle - under alphabets } { 4-th cycle - on elements of the alphabet }
ce := 1; for i := 1 to N1 do if ord(w[i][0])<>0 then for j := 1 to (ord(w[i][0])+1) do for k := 1 to N2 do for l := 1 to (ord(abc[k][0])+1) do begin if abc[k][l]=w[i][j] then begin m := l-getnum(ne[ce]); inc(ce); if ce>ord(ne[0]) then ce := 1; if m<1 then m := m+ord(abc[k][0]); w1[i][j] := abc[k][m]; end; end; for i:=1 to N1 do begin writeln(w[i]); writeln(w1[i]); end; for i := 1 to N1 do begin for j := 1 to ord(w[i][0]) do write(f1,w1[i][j]); writeln(f1,s1,''); end; begin gotoxy(30,18); textcolor(1); write('Press C for coding'); gotoxy(30,20); textcolor(1); write('Press D for decoding'); gotoxy(30,22); textcolor(1); write('Press H for help'); gotoxy(30,24); textcolor(1); write('Press E for exit'); case readkey of #99 : goto coding; #100 : goto decoding; #104 : goto help; #101 : exit; end; end; read(s); end;
{Help}
help: begin write('This is help'); end; begin gotoxy(30,18); textcolor(1); write('Press C for coding'); gotoxy(30,20); textcolor(1); write('Press D for decoding'); gotoxy(30,22); textcolor(1); write('Press H for help'); gotoxy(30,24); textcolor(1); write('Press E for exit'); case readkey of #99 : goto coding; #100 : goto decoding; #104 : goto help; #101 : exit; end; end.
Автор: volvo 17.10.2006 5:36
У тебя скорее всего не хватает End-ов в программе, поэтому компилятор и просит добавить еще... Если было открыто 10 Begin-ов (ну, или Case-ов), то закрыть ты должен все 10, а у тебя этого не наблюдается...
А разбираться в программе, где длина идентификатора зашкаливает за 32, и даже за 64 символа (а больше 32 - уже потенциално опасно), в которой используются метки, и дешевые трюки (типа вычисления длины строки по Ord(s[0]) вместо Length(s)) что делает эту программу несовместимой с большинством компиляторов, и в которой НЕ заканчивая функцию автор ДУМАЕТ что он делает процедуру того же уровня, а на самом деле получает ВЛОЖЕННУЮ, которая не имеет ТЕЛА - извини, я не буду...
Автор: lygger 25.04.2007 20:11
volvo выложи пожалуйста ЕХЕ своей программы. буду очень признателен.
Автор: volvo 25.04.2007 21:39
Вот EXE: gronsfld.rar ( 3.67 килобайт )
Кол-во скачиваний: 438
Как пользоваться - см. пост №4 ...
Автор: lygger 2.05.2007 21:41
спасибо огромное!
Автор: Mihanik 12.05.2007 0:25
Цитата(volvo @ 25.04.2007 18:39)
Как пользоваться - см. пост №4 ...
ув. Volvo! мог бы ты выложить на форум (или в личку) алгоритм работы твоей программы по методу Гронсфельда. Не все ясно! =)
Автор: Mihanik 13.05.2007 18:00
Неужели так трудно нарисовать алгоритм?
Автор: volvo 13.05.2007 18:06
Под алгоритмом имеется в виду ЧТО? Блок-схема? Неужели так трудно воспользоваться специально предназначенными для этого программами? Найти ее можно в разделе "Ссылки"...
Автор: Mihanik 13.05.2007 18:35
Цитата(volvo @ 13.05.2007 15:06)
Под алгоритмом имеется в виду ЧТО? Блок-схема? Неужели так трудно воспользоваться специально предназначенными для этого программами? Найти ее можно в разделе "Ссылки"...
ну да блок схема. Испльзовал BS первую половину программы рисует норм, потом спустя час выдает "out of memory" что странно т.к. компьютер достаточно новый, да и виртуалной памяти много!