delphi加密转换Java代码

时间:2013-04-08 18:06:23

标签: java delphi encryption

如何将用Delphi编写的特定代码转换为JAVA?

Delphi代码是加密代码。

function Encrypt(const S: String; Key1, Key2, Key3: WORD): String;
var
  i: Byte;
  FirstResult: String;
begin
  SetLength(FirstResult, Length(S));
  for i:=1 to Length(S) do begin
    FirstResult[i]:=Char(Byte(S[i]) xor (Key1 shr 8));
    Key1          :=(Byte(FirstResult[i])+Key1)*Key2+Key3;
  end;
  Result:=ValueToHex(FirstResult);
end;

function ValueToHex(const S: String): String;
var i: Integer;
begin
  SetLength(Result, Length(S)*2); 
  for i:=0 to Length(S)-1 do begin
    Result[(i*2)+1]:=HexaChar[Integer(S[i+1]) shr 4];
    Result[(i*2)+2]:=HexaChar[Integer(S[i+1]) and $0f];
  end;
end;

所以我试着制作源代码。它在这里

int key1=11;        int key2=22;        int key3=33;

String value = "ABCDE";
for(int i=0; i< value.length(); i++){
    byte[] bValue = value.substring(i).getBytes();
    int[] rValue = {0};
    rValue[0] = bValue[0]^(key1>>8);
    key1 = (bValue[0]+key1)*key2+key3;
    System.out.print(ValueToHex(rValue));
}       

但结果不同。

key1 = 11,key2 = 22,key3 = 33;

value : "ABCDE"
delphi encrypt : 4144DB69BF
java encrypt   : 4144DB0901

不匹配

value : "ABC"
delphi encrypt : 4144DB
java encrypt   : 4144DB

是否一致

为什么不匹配长?

1 个答案:

答案 0 :(得分:3)

有两个明显的错误。

首先,key1的更新必须使用rValue而不是bValue

其次,Delphi代码在key1的上下文中对Word执行算术,这是一个2字节的无符号整数。但是Java代码在int的上下文中执行相同的计算,这是一个4字节的有符号整数。

要解决此问题,我相信您只需要使用4字节签名执行算法,然后将key1截断为2字节值。像这样:

key1 = ((rValue[0]+key1)*key2+key3) & 0xffff;

我还认为您可以大大简化Java代码。我对Java几乎一无所知,所以我确信熟练的Java专家可以做得比这更好:

class SO15885898 {

    private static String ValueToHex(int myInt)
    {
        StringBuilder sb = new StringBuilder();
        sb.append(Integer.toHexString(myInt & 0xff));
        if (sb.length() < 2) {
            sb.insert(0, '0'); // pad with leading zero if needed
        }
        return sb.toString();
    }

    public static void main(String[] args)
    {
        int key1=11;        
        int key2=22;        
        int key3=33;

        String value = "ABCDE";
        for(int i=0; i<value.length(); i++){
            byte bValue = value.substring(i).getBytes()[0];
            int rValue = bValue^(key1>>8);
            key1 = ((rValue+key1)*key2+key3) & 0xffff;
            System.out.print(ValueToHex(rValue));
        }
    }
}

输出:

4144db69bf

更一般地说,既然你有两个代码,你应该安排两个代码在组织中尽可能彼此接近。然后打印尽可能多的诊断信息,以确定首先出现差异的计算步骤。