Я оказался в отчаянной ситуации, пытаясь понять алгоритм ниже. Кто-нибудь это признает?
Это происходит из декомпилированной сборки. Я пишу интерфейсное приложение для веб-сайта PHP и должен использовать пароли, сгенерированные этим ужасным фрагментом кода, в качестве учетных данных для входа в систему.
public static void Crypt(string ThisCle, string Buffer, long BufferLength)
{
int index = 1;
do
{
WUC.cry[index] = char.MinValue;
checked { ++index; }
}
while (index <= 32000);
WUC.cle = Conversions.ToCharArrayRankOne(ThisCle);
WUC.si = 0;
WUC.x1a2 = 0;
WUC.i = 0;
WUC.j = 0;
WUC.l = 0;
while ((long) WUC.j <= checked (BufferLength - 1L))
{
byte num1 = checked ((byte) Strings.Asc(Strings.Mid(Buffer, WUC.j + 1, 1)));
WUC.Assemble();
WUC.cfc = WUC.inter >> 8;
WUC.cfd = WUC.inter & (int) byte.MaxValue;
WUC.compte = 0;
do
{
WUC.cle[WUC.compte] = Strings.Chr(Strings.Asc(WUC.cle[WUC.compte]) ^ (int) num1);
checked { ++WUC.compte; }
}
while (WUC.compte <= 15);
byte num2 = checked ((byte) ((int) num1 ^ (WUC.cfc ^ WUC.cfd)));
byte num3 = (byte) ((uint) num2 >> 4);
byte num4 = checked ((byte) ((int) num2 & 15));
char ch;
switch (num3)
{
case (byte) 0:
ch = 'a';
break;
case (byte) 1:
ch = 'b';
break;
case (byte) 2:
ch = 'c';
break;
case (byte) 3:
ch = 'd';
break;
case (byte) 4:
ch = 'e';
break;
case (byte) 5:
ch = 'f';
break;
case (byte) 6:
ch = 'g';
break;
case (byte) 7:
ch = 'h';
break;
case (byte) 8:
ch = 'i';
break;
case (byte) 9:
ch = 'j';
break;
case (byte) 10:
ch = 'k';
break;
case (byte) 11:
ch = 'l';
break;
case (byte) 12:
ch = 'm';
break;
case (byte) 13:
ch = 'n';
break;
case (byte) 14:
ch = 'o';
break;
case (byte) 15:
ch = 'p';
break;
}
WUC.cry[checked (WUC.j * 2)] = ch;
switch (num4)
{
case (byte) 0:
ch = 'a';
break;
case (byte) 1:
ch = 'b';
break;
case (byte) 2:
ch = 'c';
break;
case (byte) 3:
ch = 'd';
break;
case (byte) 4:
ch = 'e';
break;
case (byte) 5:
ch = 'f';
break;
case (byte) 6:
ch = 'g';
break;
case (byte) 7:
ch = 'h';
break;
case (byte) 8:
ch = 'i';
break;
case (byte) 9:
ch = 'j';
break;
case (byte) 10:
ch = 'k';
break;
case (byte) 11:
ch = 'l';
break;
case (byte) 12:
ch = 'm';
break;
case (byte) 13:
ch = 'n';
break;
case (byte) 14:
ch = 'o';
break;
case (byte) 15:
ch = 'p';
break;
}
WUC.cry[checked (WUC.j * 2 + 1)] = ch;
checked { ++WUC.j; }
}
}
Есть метод "Decrpyt", работающий аналогичным образом. Шифры длиной 16 символов.