Нужна помощь в разработке алгоритма - PullRequest
1 голос
/ 03 января 2012

Я застрял реверс-инжиниринг кусок кода Java. Мне было интересно, если кто-нибудь может мне помочь!

String var1 = "hello";
String var2 = "123456";

long var_l = 0L;
byte[] a1 = new byte[50];
byte[] a2 = new byte[50];

// i believe this checks if its between a-Z?
for (int j = 0; j < var1.length(); j++)
{
    a2[j] = (byte) var1.charAt(j);

    if ((a2[j] < 65) || (a2[j] > 122)
    {
        continue;
    } 

    var_l += 145 + a2[j];
}

Следующая часть, которую я действительно не понимаю

var_l *= a1[0]; // a1 is a byte array of var2
var_l = 0xFFFF & var_l * (0xFF & var_l);

if (var_l < 100L)
{
    var_l = 2728L;
}

Может кто-нибудь помочь мне здесь? Я пытаюсь изучить алгоритмы шифрования здесь, но у меня возникают проблемы с логикой.

Вот полный код:

param_licensekey & licensename & lictype - это глобальные переменные. Пожалуйста, прочитайте мой комментарий ниже о причине, почему я реверс-инжиниринг. Спасибо за все сообщения.

public boolean check_license()
  {
    long l = 0L;
    byte[] arrayOfByte2 = new byte['ÿ'];
    byte[] arrayOfByte1 = new byte['ÿ'];
    int i;
    if (this.param_licensename.length() >= 2)
    {
      if (this.param_licensekey.length() >= 2)
      {
        for (int j = 0; j < this.param_licensekey.length(); j++)
          arrayOfByte1[j] = (byte)this.param_licensekey.charAt(j);
        for (j = 0; j < this.param_licensename.length(); j++)
        {
          arrayOfByte2[j] = (byte)this.param_licensename.charAt(j);
          if ((this.param_licensename.charAt(j) < 'A') || (this.param_licensename.charAt(j) > 'Z'))
            continue;
          arrayOfByte2[j] = (byte)(32 + arrayOfByte2[j]);
        }
        for (j = 0; j < this.param_licensename.length(); j++)
        {
          if ((arrayOfByte2[j] < 65) || (arrayOfByte2[j] > 122))
            continue;
          l += 145 + arrayOfByte2[j];
        }
        l *= arrayOfByte1[0];
        l = 0xFFFF & l * (0xFF & l);
        if (l < 100L)
          l = 2728L;
        String str = this.param_licensekey.charAt(0) + l;
        if (!this.param_licensekey.startsWith(str))
        {
          this.lictype = -1;
          i = 0;
        }
        else
        {
          this.lictype = (i[0] - 48);
          i = 1;
        }
      }
      else
      {
        i = 0;
      }
    }
    else
      i = 0;
    return i;
  }

1 Ответ

1 голос
/ 03 января 2012
// var_l = var_l * a1[0]
var_l *= a1[0]; // a1 is a byte array of var2

// The low 16 bits of var_l are multipled by the low 8 bits of var_l (the parenthesis
// are not necessary in this case).
var_l = 0xFFFF & var_l * (0xFF & var_l);

// Self explanatory
if (var_l < 100L) {
 var_l = 2728L;
}
...