2011-08-28 57 views
0

我发现自己处于绝望的境地,试图理解下面的算法。有人认出它吗?有没有人认识到这种密码算法?

它来自反编译程序集。我写一个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个字。

+0

您可以在您的数据库的用户记录中添加一个标志,在您迁移到PHP网站后需要他们重置密码吗?或者添加一个Password2文件,该文件是新网站将使用的新计算(Blowfish)哈希值(将该标志作为备份),但会在当前网站迭代中生成? –

+0

@JarredFarrish其实我不行。它只是一个PHP前端,这些应用程序并排运行。我认为我可以解密所有的密码,并为每个用户记录生成并保存第二个哈希值,但我无法修改原始应用程序,并且每天都必须重新生成密码,以便在有人更改其密码时覆盖该情况。 – David

+0

但是,无论如何感谢这个想法! – David

回答

5

这看起来可能是原始(德尔福)来源:

http://files.codes-sources.com/fichier_fullscreen.aspx?id=45245&f=pc1.pas&lang=en

这是一个PC1密码,看here在其他语言中的某些实现。

+0

哇,谢谢!它显然是该代码的C#端口。我将检查PC1密码并让你知道。 – David

+0

@David我不这么认为,我认为它是相同的代码,有一些Delphi版本可以生成.NET代码,当然这些代码可以反编译回C#。我给你的链接包含一个准备使用PHP版本以及btw ... – fvu

+0

你是对的。我注意到一些小的差异,这些差异只是小的重构。 (如果类似“重构”的东西可能发生在1200 LOC静态类中)。我尝试了PHP版本,它的效果很好。非常感谢! – David

相关问题