Перейти к содержанию

Нужна помощь


Рекомендуемые сообщения

Приветствую. Нужна помощь! :blink:

Зашифровал важный для меня файл.

Алгоритм шифровки:

procedure TForm1.Button4Click(Sender: TObject);
var fname:String;f:file; t,ps,pp:integer;
fl:integer;
begin
if (Length(Edit5.Text)=0) or (Length(Edit6.Text)=0)
then Begin
MessageDlg('Не введены нужные данные.',
mtWarning, [mbOK], 0); exit end;
For pp:=1 to length(Edit6.Text) do Begin
ps:=ps+ ord(Edit6.Text[pp]); end;
t:=ps+length(Edit6.Text);
fname:=Edit5.Text; AssignFile(f,fname);
Reset(f,1);
while eof(f)=false do Begin
BlockRead(f,fl,1); fl:=fl+1;
BlockWrite(f,fl,1);
end; closeFile(f);
MessageDlg('Процесс успешно завершен.',
mtInformation, [mbOK], 0);
end;

 

На кривой код не обращайте внимания, нужна только расшифровка.

Ребята, помогите, расшифруйте обратно ;) , файл прикрепляю.

Заодно можете(если не трудно) прекрипить алгоритм расшифровки.

 

Unit1.rar

 

Подсказка, вдруг поможет помочь мне:

текст: 12345 шифруется тем же алгоритмом как 113355

 

Добавлено

BlockRead(f,fl,1); -Считать один байт в fl, в позицию x.

fl:=fl+1; - прибавляем к fl - 1

BlockWrite(f,fl,1); - Записать полученное fl в файл, но в позицию x+1.

Вот и ошибка.

Алгоритм необратим?

Изменено пользователем Alex34001
Ссылка на сообщение
Поделиться на другие сайты

Alex34001 Я малость не понял, это к чему вообще и как используется? Как я понял, к остальному коду это отношения не имеет:

For pp:=1 to length(Edit6.Text) do Begin

ps:=ps+ ord(Edit6.Text[pp]); end;

t:=ps+length(Edit6.Text);

Далее

BlockRead(f,fl,1); -Считать один байт в fl, в позицию x.

fl:=fl+1; - прибавляем к fl - 1

BlockWrite(f,fl,1); - Записать полученное fl в файл, но в позицию x+1.

Вот и ошибка.

Да. Ошибка. В подопытном файле каждый чётный байт заменяется предыдущим нечётным.

 

Алгоритм необратим?
Да. Необратим. Это не шифрование, это потеря информации (ибо шифрование - это обратимое преобразование с целью сокрытия смысла информации)

 

Маленький совет по ходу:

ps:=ps+ ord(Edit6.Text[pp]);
Такие конструкции (переменная:=переменная+что-то) должны предваряться обнулением переменной, т.к. не гарантируется, что в первый раз использованный Integer будет равен нулю или string будет пустым.

 

P.S. глянул приложенный файл - это .dfm - описание формы Delphi. Восстановить его имхо почти невозможно. А Delphi делает резервные копии и модулей, и форм! Если в настройках резервные копии не отключали и вручную не удаляли, поищите в том же каталоге, где Вы запортили Unit1.dfm, файл Unit1.~dfm. Если есть такой - просто переименуйте, в нём будет всё, кроме последнего изменения.

 

Успехов в программировании, не расстраивайтесь, ошибок не делает тот, кто ничего не делает :blink:

Изменено пользователем C. Tantin
Ссылка на сообщение
Поделиться на другие сайты

C. Tantin, Спасибо за ответ.

Я малость не понял, это к чему вообще и как используется? Как я понял, к остальному коду это отношения не имеет:

Да не имеет. Но это только тут.

Да. Ошибка. В подопытном файле каждый чётный байт заменяется предыдущим нечётным.

Это значит что после вызова BlockRead(f,fl,1) нужно от Filepos(f) вычесть 1 ? и кстати как перейти на эту позицию в файле?

Да. Необратим. Это не шифрование, это потеря информации (ибо шифрование - это обратимое преобразование с целью сокрытия смысла информации)

Знаю, просто только основываюсь в программировании, делаю ошибки....

Такие конструкции (переменная:=переменная+что-то) должны предваряться обнулением переменной, т.к. не гарантируется, что в первый раз использованный Integer будет равен нулю или string будет пустым.

Хорошо, буду знать.

Если есть такой - просто переименуйте, в нём будет всё, кроме последнего изменения.

К сожалению нет, форму рисую заново.

 

Ошибки свои понял. Огромное спасибо!

Изменено пользователем Alex34001
Ссылка на сообщение
Поделиться на другие сайты
Хорошо, буду знать.

Буратино дали два яблока. Потом еще два. Затем три забрали. Сколько яблок осталось у Буратино? Одно? Неверно - мы же не знаем, сколько яблок у него было до этого. Вывод - обнуляйте переменные.

Ссылка на сообщение
Поделиться на другие сайты
Это значит что после вызова BlockRead(f,fl,1) нужно от Filepos(f) вычесть 1 ? и кстати как перейти на эту позицию в файле?
В Вашем случае нужно пользоваться процедурой Seek для перемещения по файлу.

 

Пара советов: если экспериментируете с шифрованием, записывайте шифрованное в отдельный файл (например, читаете из myfile.txt, а записываете в myfile.txt.crypted), и почитайте про класс TFileStream.

Ссылка на сообщение
Поделиться на другие сайты

Вот код дешифровщика:

while eof(f)=false do Begin
 BlockRead(f,ii,10);
 for t1:=1 to 10 do begin
 ii[t1]:=ii[t1]-t;
  end;
 Seek(f,Filepos(f)-10);
 BlockWrite(f,ii,10);
 (*Application.ProcessMessages;*)
 end;
 closeFile(f);

Вопрос: Почему последние байты не расшифровываются, и как это исправить?

Изменено пользователем Alex34001
Ссылка на сообщение
Поделиться на другие сайты
Вопрос: Почему последние байты не расшифровываются, и как это исправить?
Код уже получше!

 

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

 

2) вот это

BlockRead(f,ii,10);

for t1:=1 to 10 do begin

ii[t1]:=ii[t1]-t;

end;

Seek(f,Filepos(f)-10);

BlockWrite(f,ii,10);

практически эквивалентно этому
BlockRead(f,ii,1);

ii[1]:=ii[1]-t;

Seek(f,Filepos(f)-1);

BlockWrite(f,ii,1);

при условии, что файл открывался как Reset(f, 1). И ошибки не будет :blink:

А если всё-таки хочется читать файл не по 1 байту, а блоками, то буфер в 10 байт - мало, надо хоть килобайт 8... (если интересует скорость - можно поэкспериментировать с размерами буферов)

 

3) Ошибка из-за того, что у Вас цикл с предпроверкой условия (while...do), а нужен с постпроверкой (repeat...until), плюс файл редко бывает кратен 10 байтам, из-за этого "остаток" (SizeOf(f) mod 10) не обрабатывается приведённым кодом.

 

4) Если нужно обрабатывать считанный остаток (меньший чем буфер), количество считанных байт возвращается через var-параметр AmtTransferred процедуры BlockRead.

Изменено пользователем C. Tantin
Ссылка на сообщение
Поделиться на другие сайты

А теперь нормально? У меня теперь расшифровывает все! :blink:

Repeat
  BlockRead(f,ii,64,x);
  for t1:=1 to x do begin
  ii[t1]:=ii[t1]-t;
end;
  Seek(f,Filepos(f)-x);
  BlockWrite(f,ii,x);
  (*Application.ProcessMessages;*)
Until eof(f)=true;
closeFile(f);

x,t1-integer, ii - array of integer,f-file.

Изменено пользователем Alex34001
Ссылка на сообщение
Поделиться на другие сайты
Буратино дали два яблока. Потом еще два. Затем три забрали. Сколько яблок осталось у Буратино? Одно? Неверно - мы же не знаем, сколько яблок у него было до этого. Вывод - обнуляйте переменные.
:)! Пример - супер! +1!

 

А теперь нормально? У меня теперь расшифровывает все!
Хо-ро-шо! С технической точки зрения - всё ок! Алгоритм шифрования, конечно, не самый крутой, но просто прочитать помешает...

 

Кстати, "Until eof(f)=true;" эквивалентно "Until eof(f);" ;)

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...