いまソフトを開発しているのですが、そのソフトの設定を保存するときテキストファイルで保存するのは嫌なので、どうにかして、読めないファイルで保存したいのですが、それは無理なのでしょうか?
アプリをつくってるのはあなたですから、いかようにもフォーマットを定義できます。
たとえば、単純にテキストをそのままセーブすると外部からエディタで読まれてし
まいますが、何かと xor をとる単純な暗号化でもかなり読みづらくするのは簡単
です。
例をあげておきます。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private 宣言 }
public
txt: string;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
key: array[0..4] of byte =($EA, $74, $3D, $96, $3F); // 適当
procedure TForm1.FormCreate(Sender: TObject);
begin
txt := 'たとえば、単純にテキストをそのままセーブすると外部からエディタ'+
'で読まれてしまいますが、何かと xor をとる単純な暗号化でもかなり'+
'読みづらくするのは簡単です。'
end;
// そのままテキストで保存する
procedure TForm1.Button1Click(Sender: TObject);
var
ms: TMemoryStream;
begin
ms := TMemoryStream.Create;
try
ms.Write(txt[1], Length(txt));
ms.SaveToFile('c:\test.aaa');
finally
ms.Free;
end;
end;
// 暗号化して書き込む− テキストエディタでは読めない
procedure TForm1.Button2Click(Sender: TObject);
var
ms: TMemoryStream;
p: PByte;
i: integer;
begin
ms := TMemoryStream.Create;
try
ms.Write(txt[1], Length(txt));
p := ms.Memory;
for i := 0 to Length(txt)-1 do
begin
p^ := p^ xor key[i mod 5]; // 暗号化
inc(p);
end;
ms.SaveToFile('c:\test.xxx');
finally
ms.Free;
end;
end;
// 暗号化したファイルを読んで復号して表示
procedure TForm1.Button3Click(Sender: TObject);
var
ms: TMemoryStream;
p: PByte;
i: integer;
s: string;
begin
ms := TMemoryStream.Create;
try
ms.LoadFromFile('c:\test.xxx');
p := ms.Memory;
for i := 0 to Length(txt)-1 do
begin
p^ := p^ xor key[i mod 5]; // 復号化
inc(p);
end;
SetLength(s,ms.Size);
ms.Read(s[1], ms.Size);
Memo1.Text := s;
finally
ms.Free;
end;
end;
end.
すみません、訂正です。
procedure TForm1.Button3Click(Sender: TObject);
の
for i := 0 to Length(txt)-1 do
のところを
for i := 0 to ms.Size-1 do
としてください。
ツイート | ![]() |