Alex34001 1 Опубликовано 13 ноября, 2008 Share Опубликовано 13 ноября, 2008 (изменено) Приветствую. Нужна помощь! :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. Вот и ошибка. Алгоритм необратим? Изменено 13 ноября, 2008 пользователем Alex34001 Цитата Ссылка на сообщение Поделиться на другие сайты
C. Tantin 340 Опубликовано 13 ноября, 2008 Share Опубликовано 13 ноября, 2008 (изменено) Alex34001 Я малость не понял, это к чему вообще и как используется? Как я понял, к остальному коду это отношения не имеет: For pp:=1 to length(Edit6.Text) do Beginps:=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: Изменено 13 ноября, 2008 пользователем C. Tantin Цитата Ссылка на сообщение Поделиться на другие сайты
Alex34001 1 Опубликовано 14 ноября, 2008 Автор Share Опубликовано 14 ноября, 2008 (изменено) C. Tantin, Спасибо за ответ. Я малость не понял, это к чему вообще и как используется? Как я понял, к остальному коду это отношения не имеет: Да не имеет. Но это только тут. Да. Ошибка. В подопытном файле каждый чётный байт заменяется предыдущим нечётным. Это значит что после вызова BlockRead(f,fl,1) нужно от Filepos(f) вычесть 1 ? и кстати как перейти на эту позицию в файле? Да. Необратим. Это не шифрование, это потеря информации (ибо шифрование - это обратимое преобразование с целью сокрытия смысла информации) Знаю, просто только основываюсь в программировании, делаю ошибки.... Такие конструкции (переменная:=переменная+что-то) должны предваряться обнулением переменной, т.к. не гарантируется, что в первый раз использованный Integer будет равен нулю или string будет пустым. Хорошо, буду знать. Если есть такой - просто переименуйте, в нём будет всё, кроме последнего изменения. К сожалению нет, форму рисую заново. Ошибки свои понял. Огромное спасибо! Изменено 14 ноября, 2008 пользователем Alex34001 Цитата Ссылка на сообщение Поделиться на другие сайты
Umnik 1 280 Опубликовано 14 ноября, 2008 Share Опубликовано 14 ноября, 2008 Хорошо, буду знать. Буратино дали два яблока. Потом еще два. Затем три забрали. Сколько яблок осталось у Буратино? Одно? Неверно - мы же не знаем, сколько яблок у него было до этого. Вывод - обнуляйте переменные. 1 Цитата Ссылка на сообщение Поделиться на другие сайты
C. Tantin 340 Опубликовано 14 ноября, 2008 Share Опубликовано 14 ноября, 2008 Это значит что после вызова BlockRead(f,fl,1) нужно от Filepos(f) вычесть 1 ? и кстати как перейти на эту позицию в файле?В Вашем случае нужно пользоваться процедурой Seek для перемещения по файлу. Пара советов: если экспериментируете с шифрованием, записывайте шифрованное в отдельный файл (например, читаете из myfile.txt, а записываете в myfile.txt.crypted), и почитайте про класс TFileStream. Цитата Ссылка на сообщение Поделиться на другие сайты
Alex34001 1 Опубликовано 14 ноября, 2008 Автор Share Опубликовано 14 ноября, 2008 (изменено) Вот код дешифровщика: 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); Вопрос: Почему последние байты не расшифровываются, и как это исправить? Изменено 14 ноября, 2008 пользователем Alex34001 Цитата Ссылка на сообщение Поделиться на другие сайты
C. Tantin 340 Опубликовано 14 ноября, 2008 Share Опубликовано 14 ноября, 2008 (изменено) Вопрос: Почему последние байты не расшифровываются, и как это исправить?Код уже получше! 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. Изменено 14 ноября, 2008 пользователем C. Tantin Цитата Ссылка на сообщение Поделиться на другие сайты
Alex34001 1 Опубликовано 15 ноября, 2008 Автор Share Опубликовано 15 ноября, 2008 (изменено) А теперь нормально? У меня теперь расшифровывает все! :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. Изменено 15 ноября, 2008 пользователем Alex34001 Цитата Ссылка на сообщение Поделиться на другие сайты
C. Tantin 340 Опубликовано 15 ноября, 2008 Share Опубликовано 15 ноября, 2008 Буратино дали два яблока. Потом еще два. Затем три забрали. Сколько яблок осталось у Буратино? Одно? Неверно - мы же не знаем, сколько яблок у него было до этого. Вывод - обнуляйте переменные. ! Пример - супер! +1! А теперь нормально? У меня теперь расшифровывает все!Хо-ро-шо! С технической точки зрения - всё ок! Алгоритм шифрования, конечно, не самый крутой, но просто прочитать помешает... Кстати, "Until eof(f)=true;" эквивалентно "Until eof(f);" Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.