将C#Tea解密方法转换为Java

时间:2018-06-27 14:31:17

标签: encryption

正在尝试将C#解密方法转换为Java。它已解密,但格式不正确。

C#方法

mst.edges(data=True)

这是我的Java代码

public static unsafe bool Decrypt(ref byte[] buffer, ref int length, int index, uint[] key, bool bPruneTrailingNulls = false){
      if (length <= index || (length - index) % 8 > 0 || key == null)
        return false;
      fixed (byte* numPtr1 = buffer)
      {
        uint* numPtr2 = (uint*) (numPtr1 + index);
        int num1 = length - index;
        int index1 = 0;
        while (index1 < num1 / 4)
        {
          uint num2 = 32;
          uint num3 = 3337565984;
          uint num4 = 2654435769;
          while (num2-- > 0U)
          {
            IntPtr num5 = (IntPtr) (numPtr2 + (index1 + 1));
            *(int*) num5 = (int) *(uint*) num5 - (((int) numPtr2[index1] << 4 ^ (int) (numPtr2[index1] >> 5)) + (int) numPtr2[index1] ^ (int) num3 + (int) key[(int) (num3 >> 11 & 3U)]);
            num3 -= num4;
            IntPtr num6 = (IntPtr) (numPtr2 + index1);
            *(int*) num6 = (int) *(uint*) num6 - (((int) numPtr2[index1 + 1] << 4 ^ (int) (numPtr2[index1 + 1] >> 5)) + (int) numPtr2[index1 + 1] ^ (int) num3 + (int) key[(int) (num3 & 3U)]);
          }
          index1 += 2;
        }
      }
      if (bPruneTrailingNulls)
        buffer = Prune(buffer);
      Console.WriteLine("Buffer in: " + buffer.Length);
      length = (int) BitConverter.ToUInt16(buffer, index) + 2 + index;
      Console.WriteLine("Buffer out: " + buffer.Length);
      return true;
    }

当我使用

将返回的缓冲区转换为String时
 public static byte[] decrypt(byte[] buffer,int length, int index,long[] key,boolean pruneTrailingNulls) throws Exception {
    if(length<=index || (length - index) % 8 > 0 || key == null)
        return null;

    byte[] numPtr2=buffer;
    int num1=length - index;
    int index1=0;
    while(index1 < num1 / 4){
        long num2=32;
        long num3=3337565984L;
        long num4=2654435769L;
        while(num2-- > 0){
            long num5 = (int) (numPtr2.length + (index1 + 1));
            num5 = (long) (long) num5 - (((long) numPtr2[index1] << 4 ^ (long) (numPtr2[index1] >> 5)) + (long) numPtr2[index1] ^ (long) num3 + (long)key[(int)(num3 >> 11 & 3)]);
            num3 -= num4;

            long num6 = (int) (numPtr2.length + index1);
            num6 = (long) (long) num6 - (((long) numPtr2[index1+1] << 4 ^ (long) (numPtr2[index1+1] >> 5)) + (long) numPtr2[index1+1] ^ (long) num3 + (long)key[(int) (num3 & 3)]);
        }
        index1 +=2;
    }

    if(pruneTrailingNulls){
        buffer=prune(buffer);
    }
    System.out.println("Buffer in: " + buffer.length);
    length=(int)toInt16(buffer,index) +  2 + index;
    System.out.println("Buffer out: " + buffer.length);
    System.out.println("Length is: " + length);
    return buffer;
}

我得到这个输出

String s=new String(buffer)

我认为从C#到Java的数据类型存在问题。任何可以帮助将C#方法转换为Java的人!

0 个答案:

没有答案