简单而且高效--利用XOR加密文件
利用XOR加密,由于手段非常简单,没有很大的价值。但是,如果我们将密码的长度加长,其结果便有很大的不同。一般的密码长度,都要求在8个字节以上,也相当于64位。加上文字和符号混杂使用,破解的难度就更大。这样长的密码,加上好的加密方式,便可以得到保密度很高的加密文件。但是由于计算机的速度非常快,采用强力破解的方式 仍有可能破解。
正是由于这种原因,最好的加密软件TrueCrypt,也建议利用增加密码文件来增强文件的抗破解能力。
怎样才能实现更长的密码呢?最简单的方法便是利用一个长文件对另和个文件进行加密,由于文件的长度可以做到非常大,因此破解的难度也是很大的。
例如,如果我们用一个8K的文件对另一文件进行XOR加密,其强力破解基本上是不可能的了。这样长密码,即使用最快的计算机来破解,也能花上万年的时间。
下面 是利用一个文件来加密另一个文件的程序,因为要求加密文件长度不小于8K,文件加密的效果还是非常满意的。
这个程序是在Delphi7.0下面调试完成的,如果版本不同,会有一些差异。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, jpeg;
type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Memo1: TMemo;
Image1: TImage;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
FromF, ToF, MmF: file;
NumRead, NumWritten: Integer;
Buf: array[1..8192] of Byte;
MBuf: array[1..8192] of Byte;
i: Integer;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then begin
AssignFile(MmF, OpenDialog1.FileName);
Reset(MmF, 1); { Record size = 1 }
BlockRead(MmF, MBuf, SizeOf(MBuf), NumRead);
end;
if NumRead<SizeOf(MBuf) then begin
showmessage('密码文件长度太小!');
exit;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if OpenDialog1.Execute then begin
AssignFile(FromF, OpenDialog1.FileName);
Reset(FromF, 1); { Record size = 1 }
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if SaveDialog1.Execute then { Display Save dialog box}
begin
AssignFile(ToF, SaveDialog1.FileName); { Open output file }
Rewrite(ToF, 1); { Record No. = 1 }
Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))
+ ' bytes...');
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form2.show();
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
if NumRead<>0 then begin
i := 0;
repeat
i := i+1;
Buf[i]:=Buf[i] xor MBuf[i];
until i=NumRead;
end;
BlockWrite(ToF, Buf, NumRead, NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
CloseFile(ToF);
form2.Close();
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
close();
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Memo1.Lines.LoadFromFile('material.txt');
end;
end.
[此贴子已经被作者于2015-12-31 20:38编辑过]