Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.5 MB
Время: 0.003 c
15-1320870602
Юрий
2011-11-10 00:30
2012.02.26
С днем рождения ! 10 ноября 2011 четверг


3-1272096564
Ulugbek
2010-04-24 12:09
2012.02.26
Возможно ли восстановить записи после Delete? После Delete и Comm


2-1321130980
Евгений07
2011-11-13 00:49
2012.02.26
INDY сбивают ориентацию ADO


6-1252422429
WinCap
2009-09-08 19:07
2012.02.26
Сетевой принтер


2-1321475790
DnoProgrammer
2011-11-17 00:36
2012.02.26
свой Opendialog





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский