2011-08-28 1 views
0

Je me suis retrouvé dans une situation désespérée en essayant de comprendre l'algorithme ci-dessous. Est-ce que quelqu'un le reconnaît?Est-ce que quelqu'un reconnaît cet algorithme de chiffrement?

Il provient d'un assemblage décompilé. Je suis en train d'écrire une application frontal site PHP et besoin d'utiliser des mots de passe générés par ce terrible morceau de code que les informations d'identification pour vous connecter.

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; } 
    } 
} 

Il y a une méthode « Decrpyt » travaillant d'une manière similaire. Les chiffres sont de 16 caractères.

+0

Pourriez-vous ajouter un indicateur dans leur enregistrement utilisateur dans votre base de données qui leur a demandé de réinitialiser leur mot de passe une fois que vous migrez vers le site PHP? Ou ajoutez un fichier Password2 qui était le hash nouvellement calculé (Blowfish) que votre nouveau site utilisera (avec le drapeau en tant que sauvegarde), mais qui est généré sur l'itération actuelle du site? –

+0

@JarredFarrish En fait, je ne peux pas. C'est seulement une interface PHP, les applications fonctionnent côte à côte. Je pensais pouvoir décrypter tous les mots de passe et générer et enregistrer un deuxième hachage pour chaque enregistrement d'utilisateur, mais je ne peux pas modifier l'application d'origine et je devrais régénérer les mots de passe tous les jours pour changer de mot de passe. – David

+0

Mais merci pour l'idée quand même! – David

Répondre

5

Cela ressemble à cela pourrait être la source d'origine (Delphi):

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

Il est un chiffre PC1, regardez here pour certaines implémentations dans d'autres langues.

+0

Wow, merci! Il semble clairement être un port C# de ce code. Je vais vérifier le chiffre PC1 et vous le faire savoir. – David

+0

@David Je ne pense pas, je pense que c'est le même code, il existe des versions de Delphi qui génèrent du code .net, qui bien sûr peut être décompilé en C#. Le lien que je vous ai donné contient une version php prête à l'emploi ainsi ... btw ... – fvu

+0

Vous avez raison. J'ai remarqué quelques différences mineures qui se sont révélées être seulement de petits refactorings. (Si quelque chose comme "refactoring" peut se produire dans une classe statique 1200 LOC.) J'ai essayé la version PHP et ça marche très bien. Merci beaucoup! – David

Questions connexes