联众密码的逆向算法公布
作者:
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;   
