Apr 15, 2009

毕业设计(新增加密解密工具)




1:配置文件里新增了加密的相关配置信息。主要就是两个,一个是加密的关键字符串key,另外一个是一个0~1之间的小数(最好只到小数点后两位)。它们共同构成了加密的算法。算法是我从网上搜刮来的,我改了一下。原先我将算法直接用来加密memo里的所有内容,结果发现会发生一些小概率的加密未完成便中止的现象。后来我把它改成逐行读取逐行加密就没有问题了。这个BUG真的很奇怪,我已经发给老大了,希望他有时间帮我看一下。我数学不行啊。哎~~~~~



2:该图是输入明文后的效果。这个加密工具可以独立使用也可以嵌入到任何一个工具里。只要包含了加密工具的单元,调用它的一个hasIniOriginalText或者hasIniDecodedText将其设置为true,就可以讲你要加密的内容从你的工具里导入到加密工具的明文或密文输入栏了。


3:上图为加密后的脚本内容,看不懂吧,呵呵。这个密文可以放到明文显示栏里再加密,每次加密可以更换不同的key和percent,只要记住顺序,一次次的用正确的key和percent解密就行了,很方便很强大吧。。。真是要感谢贴了这个加密算法的蝈蝈。之前上网搜了,论坛问了,有人让我用MD5加密,这个加密虽然破解还是有一定难度,可是解密也很麻烦的。当然,我对MD5甚至对密码学根本是门外汉,上述完全是凭直觉哈。

下边贴出我稍微改动后的加密算法代码:

var
frmCryptograph: TfrmCryptograph;

key: string;
percent1: Double;

implementation

{$R *.dfm}

function TfrmCryptograph.DeCode(aCryptograph, aKey: string): string;
var
i,keylen,codelen:integer;
begin
keylen :=Length(akey);
codelen:=Length(aCryptograph);
SetLength(Result, Length(aCryptograph));
for i:=1 to codelen do
begin
Result[i]:=Chr(Ord(aCryptograph[i])-Ord(aKey[(i mod KeyLen)+1]));
end;
end;


function TfrmCryptograph.EnCode(aCryptograph, aKey: string): string;
var
i,keylen,codelen:integer;
begin
keylen:=Length(akey);
codelen:=Length(aCryptograph);
SetLength(Result, Length(aCryptograph));
for i:=1 to codelen do
begin
Result[i]:=Chr(Ord(aCryptograph[i])+Ord(aKey[(i mod KeyLen)+1]));
end;
end;

function TfrmCryptograph.GetKey(aKey: string; aPercent: Double): string;
var
i:integer;
begin
SetLength(Result,Length(aKey));
for i:=1 to Length(aKey) do
begin
Result[i]:=Chr(Round(Ord(aKey[i])*aPercent));
end;
end;

procedure TfrmCryptograph.btnEncodeClick(Sender: TObject);
var
i: Integer;
str: string;
begin
mmoOutput.Clear;
pgcCryptograph.ActivePageIndex := 1;
for i := 0 to mmoInput.Lines.Count do
begin
str := EnCode(mmoInput.Lines.Strings[i],GetKey(Key,Percent1));
mmoOutput.Lines.Append(str);
end;
end;

procedure TfrmCryptograph.btnDecodeClick(Sender: TObject);
var
i: Integer;
str: string;
begin
mmoInput.Clear;
pgcCryptograph.ActivePageIndex := 0;
for i := 0 to mmoOutput.Lines.Count do
begin
str := DeCode(mmoOutput.Lines.Strings[i],GetKey(Key,Percent1)) ;
mmoInput.Lines.Append(str)
end;
end;

procedure TfrmCryptograph.FormCreate(Sender: TObject);
begin
initEnDeCodeForm(Sender);
pgcCryptograph.ActivePageIndex := 0;
end;

procedure TfrmCryptograph.initEnDeCodeForm(Sender: TObject);
var
iniFileName: string;
begin
{如果没有初始化的明文输入,则清空}
if not withIniOriginalText then
mmoInput.Clear;
if not withIniDecodedText then
mmoOutput.Clear;
iniFileName := 'config\config.ini';
with TInifile.Create(iniFileName) do
begin
percent1 := ReadFloat('CRYPTOGRAPHY','PERCENT',0);
key := ReadString('CRYPTOGRAPHY','KEY','');
Free;
end;
end;

procedure TfrmCryptograph.FormShow(Sender: TObject);
begin
initEnDeCodeForm(Sender);
end;

procedure TfrmCryptograph.btnImportEncodeClick(Sender: TObject);
begin
dlgOpenCryptograph.Execute;
mmoInput.Clear;
try
mmoInput.Lines.LoadFromFile(dlgOpenCryptograph.FileName);
except
Exit;
// MessageBox(Handle, '读取文件出错,请重试', '提示', MB_OK);
end;
end;

procedure TfrmCryptograph.btnExportEncodeClick(Sender: TObject);
begin
dlgSaveCryptograph.Execute;
try
mmoInput.Lines.SaveToFile(dlgSaveCryptograph.FileName + '.sql');
except
Exit;
// MessageBox(Handle, '保存文件出错,请重试', '提示', MB_OK);
end;
end;

procedure TfrmCryptograph.btnImportDecodeClick(Sender: TObject);
begin
dlgOpenCryptograph.Execute;
mmoInput.Clear;
try
mmoInput.Lines.LoadFromFile(dlgOpenCryptograph.FileName);
except
Exit;
// MessageBox(Handle, '读取文件出错,请重试', '提示', MB_OK);
end;
end;

procedure TfrmCryptograph.btnExportDecodeClick(Sender: TObject);
begin
dlgSaveCryptograph.Execute;
try
mmoOutput.Lines.SaveToFile(dlgSaveCryptograph.FileName + '.sql');
except
Exit;
// MessageBox(Handle, '保存文件出错,请重试', '提示', MB_OK);
end;
end;

procedure TfrmCryptograph.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
mmoInput.Clear;
mmoOutput.Clear;
withIniOriginalText := False;
withIniDecodedText := False;
end;

总结:这个小工具花了我一天多的时间。其中大部分用来找加密未完成却中断的原因了,结果还是没有找到,可见要成为IT中的牛人,数学是多么重要。虽然实际开发中未必用得了算法,未必要那么考虑效率,可是,对于一个程序员来说,追求完美是一种天性,应该坚持下去。

No comments:

Powered By Blogger