Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.26;
Скачать: CL | DM;

Вниз

Сохранение и загрузка зашифрованного текста в Delphi 2009   Найти похожие ветки 

 
Vladimir ©   (2011-11-12 12:32) [0]

В delphi 7 сохранение и загрузка зашифрованного текста работала нормально в Delphi 2009 происходит что то странное. Накидал на скорую руку программу для теста сохранения/загрузки зашифрованного текста и вот что вышло:

Сохраняем текст:

procedure TForm1.Button9Click(Sender: TObject);
var List: TStringList;
begin
List := TStringList.Create;
List.Text := Memo1.Text;
List := datacodes.Code(List, "`1", false);
Memo1.Text := List.Text;
SaveBookToFile(List, "test.txt");
List := datacodes.Code(List, "`1", true);
Memo1.Lines.Add(List.Text);
end;

Загрузка:

procedure TForm1.Button10Click(Sender: TObject);
var List1: TStringList;
begin
List1 := TStringList.Create;
LoadBookFromFile(List1, "test.txt");
ShowMessage(List1.Text);
List1 := datacodes.Code(List1, "`1", true);
Memo2.Text := List1.Text;
end;

Код модуля datacodes.pas - писал когда то для одной из своих программ сейчас поправил некоторые процедуры и функции для тестирования сохранения/загрузки зашифрованного текста:

{
Модуль: datacodes.pas
Создан: 20 июля 2010 года
Автор: Белоусов Владимир
Описание: в этом модуле описаны основные типа, требующиеся для работы программы, а также
содержаться основные процедуры и функции для работы с ними.
}

unit datacodes;

interface

uses //испоользуемые модули
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, OleCtrls, StdCtrls, clipbrd, ExtCtrls, registry, ActiveX;

type //запись с информацией о книге
 TBookData = record
   FileVersion: integer;           // версия файла
   SerialNumber: string[21];       // серийный номер
   BuildForUser: string[75];       // данные владельца
   UserPassword: string[20];       // пароль владельца
   BookName: string[50];           // название книги
   SizeOfTextData: integer;        // размер текста
   TextInformation: array of string[255];   // собственно сам текст
 end;

type //запись для сохранения уже существующих сопоставлений
 TRegFileExt = record
   FExt: string[255];
   OpenProgram: string[255];
   DefaultIcon: string[255];
   DefaultIcon_Discr: string[255];
   FExtDiscription: string[255];
   Progid: string[255];
   Application: string[255];
   APid: boolean;
   Aapp: boolean;
   FExtName: string[255];
 end;

//шифрует или расшифровывает книгу
function Code(Stext: TStringList; password: string; decode: boolean): TStringList;
//сохраняет книгу
procedure SaveBookToFile(BookData: TStringList; FileName: string);
//преобразует текст в данные о книге
function TStringListToBookData(List: TStringList; Fversion: integer): TBookData;
//загрузка книги из файла
procedure LoadBookFromFile(out BookData: TStringList; FileName: string);
//преобразует данные о книге в текст
function TBookDataToStringList(BookData: TBookData): TStringList;
//функция возвращает код соответствующий расширению файла
function FileExtToByte(Fext: string): byte;
//процедура регистрации файла в Windows
procedure RegisterFileType(prefix:string; exepfad:string; extdiscr: string; Icon: string; APid,
Aapp: boolean; Pid, App, FEN: string);
//функция сохранения существующего сопостовления с расширением
function SaveRegisterFileType(prefix:string): TRegFileExt;
//процедура сохранения настроек
procedure SaveSettings(RFE: array of TRegFileExt);
//процедура загрузки настроек
procedure LoadSettings;
//функция возвращает текущее значение ключей реестра
function GetRegisterFileType(prefix:string): TRegFileExt;
//функция возвращает название расширения(например *txt - Текстовый документ)
function GetFExtName(ext: string): string;
//процедура загрузки видео файла(подготовка к воспроизведению)
procedure PreLoadVideoFile(FileName: string; Display: TWinControl);
//процедура выгрузки работы с видео
procedure MediaFree;

var //глобальные переменные
 RegFileExts: array of TRegFileExt; //массив с расширениями файлов

const //константы
 code_password: string = "`1"; //092748356~@()!#*&$^%q][pe<bgh>?bTYOa/-*+";

implementation

//шифрует или расшифровывает книгу
function Code(Stext: TStringList; password: string; decode: boolean): TStringList;
var //переменные
i, i1, PasswordLength: integer;
sign: shortint; text: string;
begin
//длина пароля
PasswordLength := length(password);
//если нет пароля, то выходим
if PasswordLength = 0 then Exit;
//выбираем что делать зашифровывать или расшифровывать
if decode then sign := -1
         else sign := 1;
//прогоняем все строки
for i1 := 0 to Stext.Count-1 do
begin
 //записываем в строку строку из списка строк
 text := Stext.Strings[i1];
 //проходим все символы в строке
 for i := 1 to Length(text) do
  begin
   //кодируем или раскодируем их
   text[i] := chr(ord(text[i]) + sign * ord(password[i mod PasswordLength + 1]));
  end;
 //копируем измененную строку обратно в список строк
 Stext.Strings[i1] := text;
end;
//возвращаем список строк
Result := Stext;
end;

procedure SaveBookToFile(BookData: TStringList; FileName: string);
var i, FileHandle: integer;
s: Unicodestring;
begin
//проверяем существует ли такой файл, если нет, то
if not FileExists(FileName) then
begin
 //создаем файл
 FileHandle := FileCreate(FileName);
 //закрываем файл
 FileClose(FileHandle);
end else
//если же существует, то
begin

   //удаляем файл
   DeleteFile(FileName);
   //создаем файл
   FileHandle := FileCreate(FileName);
   //закрываем файл
   FileClose(FileHandle);

end;
//открываем файл
FileHandle := FileOpen(FileName, fmOpenWrite);

 //пишем сам текст

   //в файл
   s := BookData.Text;
   FileWrite(FileHandle, s, SizeOf(s));

 //закрываем файл
 FileClose(FileHandle);

end;

//загрузка книги из файла
procedure LoadBookFromFile(out BookData: TStringList; FileName: string);
var i, i1, FileHandle: integer;
s: Unicodestring;
begin
//проверяем существует ли такой файл, если нет, то
if not FileExists(FileName) then
begin
 //сообщаем пользователю
 ShowMessage("Файл не существует!");
 //выходим
 exit;
end;
//открываем файл
FileHandle := FileOpen(FileName, fmOpenRead);

   s := "";

   //в файл
   FileRead(FileHandle, s, SizeOf(s));
   BookData.Text := s;

 //закрываем файл
 FileClose(FileHandle);

end;

И вот что происходит. Если при сохранении убрать строку

List := datacodes.Code(List, "`1", true);

после SaveBookToFile(List, "test.txt"); то при загрузке из файла загрузится зашифрованный текст, а если оставить, то загрузится расшифрованный текст. В чем тут дело? Подскажите пожалуйста!


 
Vladimir ©   (2011-11-12 12:36) [1]

P.S. Хотя значение переменной s в момент записи в файл это зашифрованный текст.


 
KilkennyCat ©   (2011-11-12 13:03) [2]


> И вот что происходит. Если при сохранении убрать строку
>
> List := datacodes.Code(List, "`1", true);

то декодирование не произойдет

> после SaveBookToFile(List, "test.txt");

загруженного файла

>  а если оставить, то загрузится расшифрованный текст.

разумеется.

> Хотя значение переменной s в момент записи в файл это зашифрованный
> текст.

а это тут совершенно ни при чем.


 
KilkennyCat ©   (2011-11-12 13:07) [3]


> var List1: TStringList;
> begin
> List1 := TStringList.Create;
> LoadBookFromFile(List1, "test.txt");
> ShowMessage(List1.Text);
> List1 := datacodes.Code(List1, "`1", true);
> Memo2.Text := List1.Text;
> end;


 
Vladimir ©   (2011-11-12 13:21) [4]


> KilkennyCat

Я не понял... я сохранил в файл зашифрованный текст. И загружаю его:


> > var List1: TStringList;
> > begin
> > List1 := TStringList.Create;
> > LoadBookFromFile(List1, "test.txt");
> > ShowMessage(List1.Text);
> > List1 := datacodes.Code(List1, "`1", true);
> > Memo2.Text := List1.Text;
> > end;


Почему уже в ShowMessage(List1.Text) находится расшифрованный текст? Я же его ещё не расшифровывал.


 
Dennis I. Komarov ©   (2011-11-12 13:41) [5]

Код не мучил, но

> В delphi 7 сохранение и загрузка зашифрованного текста работала
> нормально в Delphi 2009 происходит что то странное.

сто пудов дело в юникововых строках...


 
KilkennyCat ©   (2011-11-12 13:59) [6]


> Почему уже в ShowMessage(List1.Text) находится расшифрованный
> текст?

почему это вообще работает...
смотри намек в [3]. где уничтожение стринглиста?
может, еще где-то что-то не уничтожается, не очищается и т.д.


 
Anatoly Podgoretsky ©   (2011-11-12 14:19) [7]

> Dennis I. Komarov  (12.11.2011 13:41:05)  [5]

Дело в дикой мешание, ShortString и UnicodeString


 
Vladimir ©   (2011-11-12 16:14) [8]


> Дело в дикой мешание, ShortString и UnicodeString
>

мешал это я уже чтобы проверить все что только возможно! То есть пробовал различные варианты.


> сто пудов дело в юникововых строках...

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


> смотри намек в [3]. где уничтожение стринглиста?

А что даст уничтожение стринглиста? Я попробовал и добавил его уничтожение. Но это ничего не дает.


 
Dennis I. Komarov ©   (2011-11-12 16:50) [9]


> мешал это я уже чтобы проверить все что только возможно!
>  То есть пробовал различные варианты.

Надо не мешать, а использовать нужные

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

Не пори чушь...

> А что даст уничтожение стринглиста? Я попробовал и добавил
> его уничтожение. Но это ничего не дает.

А из дома мусор выносишь?


 
Vladimir ©   (2011-11-13 14:16) [10]


> Надо не мешать, а использовать нужные

Остановился на Unicodestring с ним все работает

> Не пори чушь...

С типом string действительно что то не так работает

> А из дома мусор выносишь?

Да знаю я что нужно все уничтожать просто в этом случае уничтожение роли не играло.


 
KilkennyCat ©   (2011-11-13 14:24) [11]


> С типом string действительно что то не так работает

если мне не изменяет память, то
type
 string = UnicodeString;


> Да знаю я что нужно все уничтожать просто в этом случае
> уничтожение роли не играло.

ну-ну...


 
Vladimir ©   (2011-11-13 21:47) [12]


> если мне не изменяет память, то
> type
>  string = UnicodeString;

В том и дело что в Delphi 2009 нет....

> ну-ну...

Да да я не прав, признаю)


 
KilkennyCat ©   (2011-11-13 22:49) [13]


>  в Delphi 2009 нет....

если не лицензия, то ставь XE



Страницы: 1 вся ветка

Текущий архив: 2012.02.26;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.01 c
2-1321451267
Scott Storch
2011-11-16 17:47
2012.02.26
Библиотека типов (COM)


15-1320807493
Kerk
2011-11-09 06:58
2012.02.26
Большие сложные GUI


2-1320762578
я
2011-11-08 17:29
2012.02.26
Вывод сообщения на экран


15-1320351221
Leon-Z
2011-11-03 23:13
2012.02.26
Куда катится программирование ?


15-1320525002
Юрий
2011-11-05 23:30
2012.02.26
С днем рождения ! 6 ноября 2011 воскресенье