const inHMes = 'Please, enter name of a source file';
outHMes = 'Please, enter name of an output file';
IErrMes = 'He-he... Input is incorrect...';
var inFName,outFName:string;
begin
result:=false;
repeat
writeln(inHMes);
readln(inFName);
{$I-}
assign(inHandle,inFName);
reset(inHandle,1);
{$I+}
if IOResult <> 0 then writeln(IErrMes);
until IOResult = 0;
writeln(outHMes);
readln(outFName);
Assign(outHandle,outFName);
rewrite(outHandle,1);
result:=true;
end;
procedure encrypt(var file4e,file4out:file;var Result:boolean);
const keyName :string = 'YourKEY';
keyMes1 :string = 'Your KEY IS:';
keyMes2 :string = 'It''s aviable in the file. This file was put in the current directory';
lengthMes :string = 'Enter preferable length of THE KEY(in Bytes)';
step = 5;
var keyChr : byte;
key : string;
keyFile : file of byte;
n,i : integer;
temp : byte;
begin
result:=false;
randomize;
repeat
writeln(lengthMes);
readln(n);
until n>0;
assign(keyFile,keyName);
rewrite(keyFile);
for i:=1 to n do
begin
keychr:=byte(Random(100)+Random(100)+random(56));
write(keyFile,keychr);
end;
close(keyFile);
assign(keyFile,keyName);
reset(keyFile);
while not eof(keyFile) do
begin
Read(keyFile,temp);
key:=key+chr(temp);
end;
close(keyFile);
writeln(keyMes1);
writeln;
writeln(key);
writeln;
writeln(keyMes2);
i:=0;
while not eof(file4e) do
begin
Blockread(file4e,temp,1);
temp:=temp+byte(key[i]);
BlockWrite(file4out,temp,1);
inc(i,step);
if i>n then i:=i-n;
end;
close(file4out);
close(file4e);
result:=true;
end;
const step = 5;
mes1 = 'Enter name of the KEY File';
Err = 'Error';
var key : string;
keyFile : file of byte;
n,i : integer;
temp : byte;
keyFName : string;
begin
result:=false;
repeat
writeln(mes1);
readln(keyFName);
{$I-}
assign(keyFile,keyFName);
reset(keyFile);
if IOResult<>0 then writeln(Err);
{$I+}
until IOResult=0;
key:='';
i:=0;
while not eof(keyFile) do
begin
Read(keyFile,temp);
key:=key+chr(byte(temp));
inc(i);
end;
n:=i;
i:=0;
while not eof(file4d) do
begin
Blockread(file4d,temp,1);
temp:=temp-byte(key[i]);
BlockWrite(file4out,temp,1);
inc(i,step);
if i>n then i:=i-n;
end;
close(file4d);
close(file4out);
result:=true;
end;
begin
operation:=-1;
success:=false;
writeln(intro);
readln(temp);
proc:=temp;
if proc = 'decrypt' then operation:=0
else if proc = 'encrypt' then operation:=1;
if operation in [0..1] then
case operation of
0 : begin
GetHandles(inFile,outFile,success);
if success then decrypt(inFile,outFile,success);
end;
1 : begin
GetHandles(inFile,outFile,success);
if success then encrypt(inFile,outFile,success);
end
else halt;
end;
if success then writeln(OK) else writeln(failure);
readln;
end.
__________________ В правде нет страха...
Правда и страх несовместимы...
Д. С. Лихачёв
08.01.2004 14:41
Stan F
Его Величество Администратор
Группа: Администраторы
Дата регистрации: 14.11.2003
Сообщения: 5148
Кто?: ФЮРЕР
Интересная програмка.. это вообще лаба, или ты просто так балуешься?
На вскидку укажу такой косяк:
в цикле саписи шифрованного файла изначально i:=0
... и идет обращение к элементу key[i], где key - строковая переменная..
известно, что в Паскале, в отличие от Си, нулевой элемент строки используется для хранения длины массива, т.е. тебе необходимо делать счет от i:=1
рекомендации по стилю:
1.
[code]
inc(i,step);
if i>n then i:=i-n;
[/code]
ты уж либо пиши i:=i+step (вместо inc(i,step)), либо dec(i,n) (вместо i:=i-n)
2.
[code]
if proc = 'decrypt' then operation:=0
else if proc = 'encrypt' then operation:=1;
if operation in [0..1] then
case operation of
0 : begin
....
[/code]
а что, сразу в case 'decrypt' и 'encrypt' не написать?? ведь пропадает смысл использования case-оператора.. (если это лаба, то глазастый препод тебя пропалит )
цитата:
некоторые файлы почти не кодируются
приведи пример ключа, начальной строки, конечной строки .. ну и шага в ключе.. (хотя бы для одного случая)...
p.s. а вообще, шивровать хорошо XOR-ом, если интересует, могу рассказать..
p.p.s. кстати говоря, переменные обнулять неплохо в начале, хотя бы key обнуляй... (рекомендуют)
__________________ Xριστος ανεστη εκ νεκρων
Θανατω θανατον πατησας.
Και τοις εν τοις μνημασι
Ζωην χαρισαμενος.
10.01.2004 00:56
keepout
Сэр Байт II-степени
Группа: Пользователи
Дата регистрации: 07.01.2004
Сообщения: 56
Кто?: Студент, группа 3101
я бы сделал как-то так :
[code]
writeln('1 - шифруем, 2 - дешифруем');
temp:=''; {переменная целого типа}
while (temp<>1 and temp<>0) do
readln(temp);
{и делаем case..}
[/code]
а опрос хорошо по readkey проводить.. а потом проводить case по ascii-коду.. (я , как правило, так делаю..)
раз ты прогу для себя делаешь, расскажу тебе, как XOR'ом шифруют.. это надежнее и чем-то лучше.. везде почти применяют..
1. Генереи ключ , пускай несколько байт (как у тебя)
2. Берем файло, но вместо операций сложения проводим побитовый XOR шивруемого байта с ключом байта..
пример:
1001 0111 ; это байт текста
1010 1100 ; это байт ключа
0011 1011 ; это результат их поксоривания
1010 1100 ; это опять байт ключа (тот же самый)
1001 0111 ; это мы поксорили результат поксоривания и байт ключа
.. фишка в том, что, если 2 раза поксорить на одну и ту же последовательность байт, результат останется прежним (первая и последняя строки совпадают).. поэтому, строка №3 - шифрованная, а №5 - дешифрованная..
для справки:
a b xor(a,b)
0 0 0
0 1 1
1 0 1
1 1 0
..советую принять этот метод на вооружение
p.s. если прога не работает, приведи пример входных и выходных данных.. посмотрим..
__________________ Xριστος ανεστη εκ νεκρων
Θανατω θανατον πατησας.
Και τοις εν τοις μνημασι
Ζωην χαρισαμενος.
10.01.2004 15:43
Lucky
Барон Килобайт I-степени
Группа: Пользователи Плюс
Дата регистрации: 09.12.2003
Сообщения: 329
Кто?: Студент, группа 4103
Что-то стало лениво читать полностью.
Но успел возникнуть вопрос:
что есть в этом:
reset(Filename, 1);
rewrite(Filename, 1);
единичка.
Хелп лично для меня внятного ответа не дал.
__________________ I'll try to be better
12.01.2004 03:09
keepout
Сэр Байт II-степени
Группа: Пользователи
Дата регистрации: 07.01.2004
Сообщения: 56
Кто?: Студент, группа 3101