const
DEFAULT_M: array [0..lF] of byte =
(l1, l6, lF, l8, l8, lC, l0, lD,l2, l3, l01, ldf, lss, ldd, ld1, ld8); 
procedure inBuf(var Buf: array of Byte);
var
i: Integer;
d, c: byte;
Index: Integer;
begin
d := 0;
c := 0;
for i:= low(Buf) to High(Buf) do
begin
Index:= i mod 16;
d := DEFAULT_M[Index];
d := d+c;
c := byte(Buf[i]);
c := c xor d;
Buf[i] := c;
end;
end; 
因为不会这个语言,所以看这个算法很久没有明白,请大家分析一下。
这个加密的,要怎么解密

解决方案 »

  1.   

    就简简单单一个取模,一个异或,能有啥不懂的
    const // 这个常量数组声明定义都错了,1f显示是16进制,应该是$1f
    DEFAULT_M: array [0..lF] of byte =
    (l1, l6, lF, l8, l8, lC, l0, lD,l2, l3, l01, ldf, lss, ldd, ld1, ld8); // 这些值显然乱写的,打个比方用的吧
    begin
    d := 0;
    c := 0;
    for i:= low(Buf) to High(Buf) do // 循环整个buf
    begin
    Index:= i mod 16; // index = i%16
    d := DEFAULT_M[Index]; 
    d := d+c;
    c := byte(Buf[i]);
    c := c xor d; // c = c^d;
    Buf[i] := c;
    end;
      

  2.   

    上面的数组DEFAULT_M是加密用的,
    数组Buf是被处理的数组。
    上一次被处理的结果c和本次用于加密的字节相加得到本次用于加密的系数,新的系数于本次需要加密字节求模得到本次处理结果。
      

  3.   

    解密反过来
    用上次结果和本次用于加密的字节相加就得到用于异或的系数,然后和本次结果异或就解密了。
    procedure inBuf(var Buf: array of Byte);
    var
    i: Integer;
    d, c: byte;
    Index: Integer;
    begin
    d := 0;
    c := 0;
    for i:= low(Buf) to High(Buf) do
    begin
    Index:= i mod 16;
    d := DEFAULT_M[Index];
    d := d+c;
    c := byte(Buf[i]);
    Buf[i] := c xor d;
    end;
    end; 
    和加密的只有很少的变化。