1

実際の質問に入る前に、いくつかのことを明確にしたいと思います。なぜなら、文脈から外れたときに「javascriptによるブルートフォーシング」がいかにばかげているかを知っているからです:)。

私は学士論文に取り組んでおり、その最後に、概念実証のJavascriptベースのハッシュクラッカーを実装することを目指しています。アイデアは次のように機能することです。ユーザーは、使用されているアルゴリズムに関する情報とともにハッシュ値を送信できます。(その他)ユーザーは、クラッキングプロセスに参加するために、Webサイトのボタンをクリックすることもできます。サーバーのタスクは、送信された「注文」を受け入れて、使用可能なワーカーの数に応じて範囲に分割することです。次に、範囲は、上記のボタンをクリックしたクライアントに送信されます。

私は現在、このブルートフォース機能を実際に実装する方法についての2つの大きな質問に悩まされています。ですから、今の私の主な問題は、率直に言って、私はまだJavascriptにそれほど慣れていないということです。手始めに、ハードコードされた文字セットを使用します。英数字、小文字、大文字、特殊文字は使用しません。問題は、正直なところ、文字の組み合わせをすべて試す関数を実際に実装する方法や、それをプログラムする方法についての手がかりがまったくないことです。文字セットを含む通常の配列を使用し、次に2つの文字列を使用することを想像できます。1つの文字列には範囲が含まれ、もう1つの文字列には試行された組み合わせが含まれます。だから私はどういうわけか文字セット配列と文字列をカスケードされたforループか何かで繰り返す必要がありますが、私は本当に「どのように」という質問に固執しています:)。私はしません そのような関数の完全なソースコードを実際に提供してくれることを期待しますが(もちろん必要な場合を除きます)、そのようなブルー​​トフォース関数を実装する方法についてのヒントや説明をいただければ幸いです。また、この時点では、パフォーマンスや最適化されたコーディングについては気にしませんが、包括的なコーディング、またはあなたがそれを呼びたいと思うかもしれないものについては気にしません:)

質問の詳細が曖昧になった場合は申し訳ありません。もしそうなら、教えてください。もちろん、さらに明確にしようと思います。

4

1 に答える 1

1

アルファベットに対するブルート フォース スタイル関数。これを行うには、おそらくもっと簡単な方法があります。

function brute(alphabet, match, int_start, int_stop){
    var a = alphabet, al = 0,                     // for alphabet
        m = match.toString(), ml = m.length,      // for our compare
        i = int_start || 0, j = int_stop || 0,    // range of numbers to test
        k = 0, l = 0, add = 0, sub = 0, diff = 0, // for building test string
        test = '', found = false;                 // test string and result

    if(i < 0) throw 'int_start must be at least 0';

    if(a.constructor !== undefined){           // We need a string or array as
        if( a.constructor.name !== 'String' && // our alphabet so we check for
            a.constructor.name !== 'Array' )   // correct input and modify if
                a = a.toString();              // necessary, or if we can't, 
    }
    else throw 'Bad alphabet type';            // we throw an error

    al = a.length;    // shorthand length

    add = al;                             // when i=0, we start prefix here
    while(add <= i - sub) sub += add,     // then work out what we have to
                          add = add * al; // prefix our number with

    diff = add - sub; // shorthand to save calculations

    while( i < j ){   // actual brute force loop starts here
        test = '';       // empty any previous string
        k = diff + i;    // convert our number from "x" to "1x"

        while(k > 0){           // build it as a string
            l = k % al;         // get index of digit
            test = a[l] + test; // add digit to string
            k = ( k - l ) / al; // move digits along
        }

        test = test.substring(1); // cut off the initial "1" we added

        if(test.length === ml && test === m){ // compare test to what you want
            found = true;
            break;
        }

        i++;                  // prepare for our next loop
        if(i - sub === add)   // and if we need another digit
            sub += add,       // then recalculate our prefix
            add = add * al,   // and then
            diff = add - sub; // update the shorthand 
    }

    // brute force ended, let's see what we've got

    if(found === false) i = -1; // if not found, return -1 as index

    return [i, test, m]; // index found, string found with, what we were looking for
}

次に、たとえば経由で使用します

brute('0123abcd', '0c', 0, 20); // [14, "0c", "0c"]
于 2012-09-05T17:57:26.467 に答える