refresh cnucok 7bit.forum нacлeдuть
  РегистрацияПользователиАдминистраторы и модераторыПоискЧасто задаваемые вопросы На главную

7bit.forum » Техника » Обмен опытом » кодирование файлов » Привет, незнакомец [войти|регистрация]
Распечатать страницу
Понравилась тема? Поделитесь с друзьями!
Автор
Сообщение « Предыдущая тема | Следующая тема »
keepout
keepout - мужик
Сэр Байт II-степени




Группа: Пользователи

Дата регистрации: 07.01.2004
Сообщения: 56
Кто?: Студент, группа 3101

Репутация пользователя :
+0 -0 = 0
Рейтинг сообщения:
+0 -0 = 0
балл   балл


Question кодирование файлов На верх страницы

{Если кому не впадлу попробуйте разобраться =)

Вобщем эта прога осуществляет кодирование файла простым ключом, который генерирует программа случайным образом и сохраняет его в файле..

Проблемма вот в чем:
1) некоторые файлы почти не кодируются...
2)некоторые кодируются но местами остаются незакодированные места

help, please .)



P.S. для запуска ответить на вопрос
What's your choice?
encrypt для шифрования файла
decrypt для расшифровки
}

program EcD;

const intro = 'What''s your choice?';
OK = 'All is well, that ends well...';
failure = 'Try again...';
WaitMes = 'Press ANY key...';

var proc : string[7];
temp : string;
inFile,outFile : file;
success : boolean;
operation : integer;

procedure GetHandles(var inHandle, outHandle: file;var result:boolean );

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;

procedure decrypt(var file4d,file4out:file;var result:boolean);

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 keepout оффлайн Послать письмо keepout Искать сообщения : keepout Добавить keepout в адресную книгу
Stan F
Stan F - мужик
Его Величество Администратор


Группа: Администраторы

Дата регистрации: 14.11.2003
Сообщения: 5148
Кто?: ФЮРЕР

Репутация пользователя :
+1897 -840 = 1057
Рейтинг сообщения:
+0 -0 = 0
балл   балл


На верх страницы

Нету версии на С/С++ или скрипта на РНР? Я бы пофтыкал с удовольствием Wink

__________________

Последний рассвет
Тонкая нить и
Холодная сталь
Поможет забыть мне
Сотрёт глубину
Исчезнет печаль
Прольётся внутри
Моя мёртвая кровь
Развеет твой крик

08.01.2004 21:32 Stan F оффлайн Сайт Stan F Искать сообщения : Stan F Добавить Stan F в адресную книгу
keepout
keepout - мужик
Сэр Байт II-степени




Группа: Пользователи

Дата регистрации: 07.01.2004
Сообщения: 56
Кто?: Студент, группа 3101

Репутация пользователя :
+0 -0 = 0
Рейтинг сообщения:
+0 -0 = 0
балл   балл

Автор темы Автор темы keepout


Sad На верх страницы

к сожалению нет ... Frown

__________________
В правде нет страха...
Правда и страх несовместимы...
Д. С. Лихачёв

09.01.2004 20:40 keepout оффлайн Послать письмо keepout Искать сообщения : keepout Добавить keepout в адресную книгу
Юрик
Юрик - мужик
Его Величество Администратор




Группа: Администраторы

Дата регистрации: 21.06.2004
Сообщения: 3340
Кто?: Выпускник

Репутация пользователя :
+3212 -428 = 2784
Рейтинг сообщения:
+0 -0 = 0
балл   балл

МОИ ФОТКИ!


На верх страницы

Интересная програмка.. это вообще лаба, или ты просто так балуешься?

На вскидку укажу такой косяк:

в цикле саписи шифрованного файла изначально 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-оператора.. (если это лаба, то глазастый препод тебя пропалит Big Grin )

цитата:
некоторые файлы почти не кодируются

приведи пример ключа, начальной строки, конечной строки .. ну и шага в ключе.. (хотя бы для одного случая)...

p.s. а вообще, шивровать хорошо XOR-ом, если интересует, могу рассказать..

p.p.s. кстати говоря, переменные обнулять неплохо в начале, хотя бы key обнуляй... (рекомендуют)

__________________
Xριστος ανεστη εκ νεκρων
Θανατω θανατον πατησας.
Και τοις εν τοις μνημασι
Ζωην χαρισαμενος.

10.01.2004 00:56 Юрик оффлайн Искать сообщения : Юрик Добавить Юрик в адресную книгу
keepout
keepout - мужик
Сэр Байт II-степени




Группа: Пользователи

Дата регистрации: 07.01.2004
Сообщения: 56
Кто?: Студент, группа 3101

Репутация пользователя :
+0 -0 = 0
Рейтинг сообщения:
+0 -0 = 0
балл   балл

Автор темы Автор темы keepout


На верх страницы

ПРИВЕТ ПОЛУНОЧНИКАМ!!!!

fastkill:
это вообще лаба, или ты просто так балуешься?
Re: Баловство Smile

да, действительно глупая ошибка( правда , к сожалению, не единственная). Спасибо, все работает! И даже немного шифрует=).

З.Ы. Насчет замечаний по стилю
1. принято (*есть, сэр, испарвлюсь Big Grin *)
2. сначала я тоже так думал..
НО ПОТОМ, компилятор ругнулся:

Error 39: Ordinal variable expected
(Ожидается использование оператора порядкового типа)

Мне было лень исправить нормально ....

З.З.Ы. долго думал над аватаром...
Ну как нравится???haha

__________________
В правде нет страха...
Правда и страх несовместимы...
Д. С. Лихачёв

10.01.2004 04:28 keepout оффлайн Послать письмо keepout Искать сообщения : keepout Добавить keepout в адресную книгу
Юрик
Юрик - мужик
Его Величество Администратор




Группа: Администраторы

Дата регистрации: 21.06.2004
Сообщения: 3340
Кто?: Выпускник

Репутация пользователя :
+3212 -428 = 2784
Рейтинг сообщения:
+0 -0 = 0
балл   балл

МОИ ФОТКИ!


На верх страницы

я бы сделал как-то так Smile :
[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
..советую принять этот метод на вооружение Smile

p.s. если прога не работает, приведи пример входных и выходных данных.. посмотрим..

__________________
Xριστος ανεστη εκ νεκρων
Θανατω θανατον πατησας.
Και τοις εν τοις μνημασι
Ζωην χαρισαμενος.

10.01.2004 15:43 Юрик оффлайн Искать сообщения : Юрик Добавить Юрик в адресную книгу
Lucky
Lucky - мужик
Барон Килобайт I-степени




Группа: Пользователи Плюс

Дата регистрации: 09.12.2003
Сообщения: 329
Кто?: Студент, группа 4103

Репутация пользователя :
+9 -5 = 4
Рейтинг сообщения:
+0 -0 = 0
балл   балл


На верх страницы

Что-то стало лениво читать полностью.
Но успел возникнуть вопрос:
что есть в этом:
reset(Filename, 1);
rewrite(Filename, 1);
единичка.
Хелп лично для меня внятного ответа не дал.

__________________
I'll try to be better

12.01.2004 03:09 Lucky оффлайн Послать письмо Lucky Искать сообщения : Lucky Добавить Lucky в адресную книгу
keepout
keepout - мужик
Сэр Байт II-степени




Группа: Пользователи

Дата регистрации: 07.01.2004
Сообщения: 56
Кто?: Студент, группа 3101

Репутация пользователя :
+0 -0 = 0
Рейтинг сообщения:
+0 -0 = 0
балл   балл

Автор темы Автор темы keepout


На верх страницы

вообще чило после хэндла показывает на размер одной единицы обмена данными с файлом( читай размер буфера ..) в байтах

__________________
В правде нет страха...
Правда и страх несовместимы...
Д. С. Лихачёв

12.01.2004 21:10 keepout оффлайн Послать письмо keepout Искать сообщения : keepout Добавить keepout в адресную книгу
Понравилась тема? Поделитесь с друзьями!
Чтобы отвечать на сообщения и создавать новые темы, необходимо зарегистрироваться. Присоединяйся к нам! :-)
Перейти:

Все вопросы, связанные с деятельностью сайта и форума решаются с руководителем проекта.

powered by [censored] forum
7bit.team © 2001-2016