//作者:姜堰市合作银行-姚佩云 [url]www.jynx.com.cn[/url] [email][email protected][/email]
//首发大富翁论坛([url]www.delphibbs.com[/url])blog,转载请尊重作者成果,保留此信息

闲来无事,每天上联众,联众的密码经过加密后保存在本地注册表里,看看是怎么加密的。下了个ollydbg,一路跟踪,发现算法极其简单,给出Delphi版本的解密算法(加密部分有兴趣的一起来讨论)。算法比较粗糟,谁帮优化一下:)
function Decode(aValue:String):string;
var
 iValue:array [0..63]of Byte;
 i,j,k,iAL,iCL:Byte;
 Pass:array[0..15]of char; //密码最长不超过15位
begin
 //str to int
 i:=0;
 j:=0;
 while (1=1) do
 begin
 //这里需要改进
 j:=Pos(' ',aValue);
 if j<=0 then
 begin
 iValue[i]:=strToint(aValue);
 break;
 end;
 iValue[i]:=StrToInt(Copy(aValue,1,j-1));
 inc(i);
 aValue:=copy(aValue,j+1,length(aValue)-j);
 end;

 //xor
 for i:=63 downto 1 do
 iValue[i-1]:=iValue[i-1] xor iValue[i];

 //
 for i:=15 downto 1 do
 begin
 iAL:=iValue[i];
 iCL:=iAL;
 ASM
 MOV AL,iAL
 SAR AL,4
 AND AL,$F
 MOV iAL,AL
 end; //直接用SHR也可以,不过反汇编是SAR,pascal里没有SAR
 j:=iAL+$30;
 iAL:=iValue[j];
 iCL:=iCL and $f;
 iCL:=iValue[0]+iCL;
 k:=iCL;
 iCL:=iValue[k];
 iValue[j]:=iCL;
 iValue[k]:=iAL;
 end;

 i:=iValue[0];
 j:=1;
 while iValue[i]<>0 do
 begin
 Pass[j-1]:=chr(iValue[i]);
 Inc(i);
 Inc(j);
 end;

 Result:=Pass;
end;