0

現在、NX のパスワード スクランブリング アルゴリズムを QT-C++ から C# に移植しようとしています。

ソース: http://www.nomachine.com/ar/view.php?ar_id=AR01C00125

私の現在のコード:

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

}
}

指定されたパスワードから文字列を生成し、nxclient の XML-Config ファイルに追加します。

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

しかし、NXClient は「認証に失敗しました」と言い続けます。したがって、C++ コードの C# ポートに間違いがあるに違いないと確信しています。特に、元のコードの次の行についてはよくわかりません: sRet.ref(i1) = validCharList[i];

ref(i1) が何をしているのかわかりません。

誰かが私の間違いを発見したらいいですね:)

前もって感謝します

4

1 に答える 1

0

の上部のコード部分scrambleString()は初期化して作業を行い、最後に戻っ sRetた下部は作業をまったく使用しないようにします。おそらく/を組み合わせる必要があります。おそらく1つの文字列を使用するだけです...retStrsRetretStrsRet

sRet.ref(i1) = validCharList[i]

上記のコードは単純な char 割り当てであり、 char の pos i1insRetを char from string validCharListat posに置き換えていiます。

于 2012-09-21T05:41:51.143 に答える