星期三, 1月 21, 2009

使用blowfish加解密


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
g_LibHandle : THandle ; // dynamic load library
BlowfishEncodeString : function(lpszString: PChar; lpszKey: PChar;lpszBuffer: PChar; dwBufferSize: DWORD): DWORD; stdcall ;
BlowfishDecodeString : function(lpszEncodedString: PChar; lpszKey: PChar;lpszBuffer: PChar; dwBufferSize: DWORD): DWORD; stdcall ;
CalcCrc32 : function(pBuffer: Pointer; dwBufferSize: DWORD): DWORD; stdcall ;
//加解密
function EncrypBlowfishPassword(sPassword : String): String; //傳入欲加密字串,傳回加密後的字串 {Blowfish}
function DecrypBlowfishPassword(sEncrypedPWD : String): String; //傳入加密過的密碼,傳回解密後的明文密碼 {Blowfish}
const
_BLOWFISH_KEY = 'FORT_BLOWFISH_KEY'; //使用BlowFish 加密的Key

implementation

{$R *.dfm}
//----------------------------------------------------------------------------//
// LoadAllLibrary 載入所需Dll //
// 傳回值 : TRUE 載入成功 //
// False 載入失敗 //
//----------------------------------------------------------------------------//
function LoadAllLibrary():boolean ;
var
sPathName :string ;
begin
Result := true ;
sPathName := 'C:\facrypto.dll' ;
g_LibHandle := LoadLibrary(PAnsiChar(sPathName)) ;
if( g_LibHandle = 0 ) then
begin
showmessage('載入 DLL 發生錯誤');
Result := false ;
Exit ;
end ;

//加密
@BlowfishEncodeString := GetprocAddress( g_LibHandle, 'BlowfishEncodeString') ;

//解密
@BlowfishDecodeString := GetprocAddress( g_LibHandle, 'BlowfishDecodeString') ;

//CRC32
@CalcCrc32 := GetprocAddress( g_LibHandle, 'CalcCrc32') ;

//若三者有一出錯,即傳回False
if( (@BlowfishEncodeString=NIL) OR (@BlowfishDecodeString=NIL) OR (@CalcCrc32=NIL) ) then
begin
showmessage('載入 DLL 發生錯誤');
Result := false ;
Exit ;
end ;
end ;

procedure FreeAllLibrary() ;
begin
FreeLibrary(g_LibHandle) ;
end ;

//----------------------------------------------------------------------------//
// EncrypBlowfishPassword 加密欲加密的密碼 //
// 參數 : 明文字串 //
// 傳回值 : 加密後的字串 //
//----------------------------------------------------------------------------//
function EncrypBlowfishPassword(sPassword : String): String;
var
cEncrypt : array[0..255] of Char;

begin

try
{ encrypt } // 欲加密字串, 加密參數 ,加密後的秘文,buffer長度
BlowfishEncodeString( PChar(sPassword), PChar(_BLOWFISH_KEY),cEncrypt, 256) ;

//轉回字串後傳回
Result := string(cEncrypt);
except
//InfoMsgBox('Encryp Error!!');
Exit;
end;

end;

//----------------------------------------------------------------------------//
// DecrypBlowfishPassword 解開被加密後的密文 //
// 參數 : 密文字串 //
// 傳回值 : 解密後的明文字串 //
//----------------------------------------------------------------------------//
function DecrypBlowfishPassword(sEncrypedPWD : String): String;
var
cDecrypt : array[0..255] of Char;

begin

try
//解密
BlowfishDecodeString(PChar(sEncrypedPWD),PChar(_BLOWFISH_KEY), cDecrypt,255) ;

//轉回字串後 傳回
Result := string(cDecrypt);
except
//InfoMsgBox('Decry Error!!');
exit;
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not LoadAllLibrary() then
begin
showmessage('Error occurred while loading library') ;
exit;
end ;
caption := EncrypBlowfishPassword('kobe');
FreeAllLibrary() ; // free all library
end;

end.