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

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

Опубликовано (изменено)

Приветствую. Нужна помощь! :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
Опубликовано
Хорошо, буду знать.

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

  • Согласен 1
Опубликовано
Это значит что после вызова 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);" ;)

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
×
×
  • Создать...