{*******************************************************}
{ }
{ Oracle Password Hash }
{ }
{ 版权所有 (C) 2009 Mail:978399@qq.com Open[xgc] }
{ }
{*******************************************************}
unit OracleHASH;
interface
uses
Windows,SysUtils;
type
DES_cblock = array[0..7] of Byte;
des_ks_struct = packed record
ks: DES_cblock;
weak_key: Integer;
end;
des_key_schedule = array[1..16] of des_ks_struct;
procedure DES_cbc_encrypt(Source,Dest: pointer; Len: integer; Key, IV: Pointer; Enc:integer); cdecl; external
'libeay32.dll'
;
procedure DES_set_odd_parity(Key: des_cblock); cdecl; external
'libeay32.dll'
;
function
DES_set_key_checked(key: des_cblock; schedule: des_key_schedule): Integer;cdecl; external
'libeay32.dll'
;
function
Encrypt(name:widestring):string;
implementation
function
Encrypt(name:widestring):string;
var
iv,key: DES_cblock ;
key_schedule : des_key_schedule;
num,len,i:word;
a: array [1..500]of byte;
b: array [1..500] of byte;
begin
KEY[0] := $01;
KEY[1] :=$23;
KEY[2] :=$45;
KEY[3] :=$67;
KEY[4] :=$89;
KEY[5] :=$AB;
KEY[6] :=$CD;
KEY[7] :=$EF;
len := length(name) *2;
if
len mod 8 <>0
then
num := len + 8 - len mod 8
else
num := len ;
zeromemory(@a,500);
move(name[1],a[2],len);
zeromemory(@b,500);
ZeroMemory(@iv, SizeOf(iv));
DES_set_odd_parity(KEY);
DES_set_key_checked(key,key_schedule);
DES_cbc_encrypt(@a,@b,len,@key_schedule[1],@iv,1);
move(b[num-7],key[0],8);
DES_set_odd_parity(key);
DES_set_key_checked(key,key_schedule);
DES_cbc_encrypt(@a,@b,len,@key_schedule[1],@iv,1);
move(b[num-7],key[0],8);
for
i:=0 to 7
do
Result := Result + inttohex(key[i],2);
end;
end.