Форум: "Начинающим";
Текущий архив: 2012.02.26;
Скачать: [xml.tar.bz2];
ВнизСохранение и загрузка зашифрованного текста в 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.004 c