2012-09-16 2 views
0

Je tente actuellement de porter le mot de passe de brouillage algorithme de NX de QT-C++ à C#.algorithme de brouillage dans le client NX en C#

Source: http://www.nomachine.com/ar/view.php?ar_id=AR01C00125

Mon code actuel:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace mynamespace 
{ 
class NxScramble 
{ 
    string ToScramble = ""; 
    int numValidCharList = 85; 
    String dummyString = "{{{{"; 

    char[] validCharList = new char[] 
    { 
     '!', '#', '$', '%', '&', '(', ')', '*', '+', '-', 
     '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', 
     '9', ':', ';', '<', '>', '?', '@', 'A', 'B', 'C', 
     'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
     'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 
     'X', 'Y', 'Z', '[', ']', '_', 'a', 'b', 'c', 'd', 
     'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 
     'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 
     'y', 'z', '{', '|', '}' 
    }; 

    public NxScramble(string s) 
    { 
     ToScramble = s; 
    } 

    public string scrambleString() 
    { 
     string sRet = ""; 

     if (ToScramble == null || ToScramble.Equals("")) 
     { 
      return ToScramble; 
     } 

     string str = encodePassword(ToScramble); 

     if (str.Length < 32) 
     { 
      str += dummyString; 
     } 

     for (int iR = (str.Length - 1); iR >= 0; iR--) 
     { 
      // 
      // Reverse string 
      // 
      sRet += str.ElementAt(iR); 
     } 

     if (sRet.Length < 32) 
     { 
      sRet += dummyString; 
     } 

     int k = getRandomValidCharFromList(); 
     int l = k + sRet.Length - 2; 

     sRet.Insert(0, k.ToString()); 

     string retStr = ""; 

     for (int i1 = 1; i1 < sRet.Length; i1++) 
     { 
      int j = findCharInList(sRet.ElementAt(i1)); 

      if (j == -1) 
      { 
       return ToScramble; 
      } 
      int i = (j + l * (i1 + 1)) % validCharList.Length; 
      /* 
      * sRet.ref(i1) = validCharList[i]; 
      */ 
      retStr += validCharList[i]; 
     } 

     char c = (char)(getRandomValidCharFromList() + 2); 
     sRet += c; 

     retStr = retStr.Replace("&", @"&amp;"); 
     retStr = retStr.Replace("\"", @"&quot;"); 
     retStr = retStr.Replace("'", @"&apos;"); 
     retStr = retStr.Replace("<", @"&lt;"); 
     retStr = retStr.Replace(">", @"&gt;"); 

     return retStr; 
    } 

    private string encodePassword(string p) 
    { 
     string sPass = ":"; 
     string sTmp = ""; 

     if (p.Equals("")) 
     { 
      return ""; 
     } 

     for (int i = 0; i < p.Length; i++) 
     { 
      char c = (char)p.ElementAt(i); 
      sTmp = String.Format("{0:d}:", (c + i + 1)); 
      sPass += sTmp; 
      sTmp = ""; 
     } 

     return sPass; 
    } 

    private int findCharInList(char c) 
    { 
     int i = -1; 

     for (int j = 0; j < numValidCharList; j++) 
     { 
      if (validCharList[j] == c) 
      { 
       i = j; 
       return i; 
      } 
     } 
     return i; 
    } 

    private char getRandomValidCharFromList() 
    { 
     int k = DateTime.Now.Second; 
     return validCharList[k]; 
    } 

} 
} 

Il est génère une chaîne à partir du mot de passe donné et je l'ajoute au fichier XML-Config du nxclient:

 NxScramble nxs = new NxScramble(passPhrase); 
     string ScambledPass = nxs.scrambleString(); 

     string nxconfig = @" 
     .... 
     .... 
     <group name='Login' > 
     <option key='Auth' value='"+ ScambledPass + @"' /> 
     <option key='Guest Mode' value='false' /> 
     <option key='Guest password' value='' /> 
     <option key='Guest username' value='' /> 
     <option key='Login Method' value='nx' /> 
     <option key='Public Key' value=' 
     ......... 
     ......... 
     ' /> 
     <option key='User' value='" + username + @"' /> 
     </group> 
     "; 

Mais le NXClient ne cesse de dire "Echec de l'authentification". Donc, je suis sûr que il doit y avoir une erreur dans mon C# -Port du code C++. Surtout je ne suis pas sûr de cette ligne du code original: sRet.ref (i1) = validCharList [i];

Je ne sais pas ce que ref (i1) est en train de faire.

Ce serait bien si quelqu'un découvre mon erreur :)

Merci à l'avance

Répondre

0

La partie de code supérieure de scrambleString() n'initialiser et travailler sur sRet, et la partie inférieure sur retStr qui enfin est retourné faire le travail sur sRet pas utilisé du tout. Vous devriez probablement combiner retStr/sRet, peut-être juste utiliser une chaîne ...

sRet.ref(i1) = validCharList[i] 

Le code ci-dessus est une simple affectation de char, remplaçant le caractère à la pos i1 en sRet avec ombles de chaîne validCharList pos i .