3

友人が私に挑戦をくれました。彼はPHPの暗号化関数(CRYPT_STD_DES)(PHP4から)を使用して文字列を暗号化しました。暗号化に使用されるソルトを知っています。cryptは一方向のアルゴリズムであるため、ブルートフォース方式を使用する必要があります。パスワードは小文字のみで構成されていることを知っています。

今、私は16コア(2x Xeon)とたくさんのRAMを備えたマシンを持っています。この強制攻撃を実装するための最も効率的な方法は何ですか(PHPを使用する必要があると思いますが、これはまったく問題ありませんが、アイデアがあれば...)

[編集]

そして、私は言及するのを忘れました、暗号化された表現は13文字の長さであり、文字列は単純なパスワード暗号化のように8文字未満です:)

4

3 に答える 3

2

PHPマニュアルから:

crypt()は、標準の Unix DES ベースのアルゴリズムまたはシステムで利用可能な代替アルゴリズムを使用して、ハッシュされた文字列を返します。

一部のオペレーティング システムでは、複数の種類のハッシュがサポートされています。実際、標準の DES ベースのアルゴリズムが MD5 ベースのアルゴリズムに置き換えられることがあります。ハッシュ タイプは、salt 引数によってトリガーされます。5.3 より前のバージョンでは、PHP はシステムの crypt() に基づいてインストール時に利用可能なアルゴリズムを決定していました。ソルトが指定されていない場合、MD5 の可用性に応じて、PHP は標準の 2 文字 (DES) ソルトまたは 12 文字 (MD5) のいずれかを自動生成します。

つまり、crypt()関数は、オペレーティング システムの crypt() 関数を C ライブラリから呼び出すだけです。これは 2 つのことを意味します。

まず、暗号化の種類が標準化されています。ブルート フォースを実行するために PHP を使用する必要はありません。使用されるアルゴリズムを知る必要があるだけです。Cane and Abel や Jack the Ripper などの多くのプログラムは、ブルート フォース攻撃、辞書攻撃、またはレインボー テーブル攻撃によっていくつかのアルゴリズムを破ることができます。

次に、暗号化のタイプは、暗号化されたオペレーティング システムに基づいています。これは、どの暗号化方式が使用されたかについて明らかな手がかりがない限り、いくつかの異なる暗号化方式を試す必要があるかもしれないことを意味します (暗号化された文字列のパターンが何かの手がかりになるかもしれません)。

解釈された言語は、コンパイルされた対応する言語よりもはるかに遅く実行されるため、PHP を使用して力ずくで実行しようとすることは絶対にお勧めしません。

于 2010-09-29T00:28:38.450 に答える
2

これは、 Ubuntu 10.04.1でのコード (でコンパイルgcc -O2 -lcrypt)の C でのクイック トライです。

  #define _XOPEN_SOURCE
  #include <unistd.h>
  #include <stdio.h>
  #include <stdlib.h>

  void inc(char *p)
  {
     int i;
     for (i=0 ; i<8 && p[i]=='z' ; i++);
     if (i >= 8) exit(printf("Not found :-(\n"));
     if (!p[i]) p[i]='a';
     else p[i]++;
     while (--i >= 0) p[i]='a';
  }

  int main ()
  {
    char *salt = "XY";
    char *buzz = "XYaAbBcCZ0123";

    char pass[] = { 'a',0,0,0,0,0,0,0,0 };

    while(1)
      if ( ! strcmp(crypt(pass, salt), buzz))
        exit(printf("Found %s :-)\n", pass));
      else
        inc(pass);
  }

そのコードは、最近の PC で1 日か 2 日 (2.10^11 の組み合わせ) 以内に実行されるはずです。複数のマシンで実行できます。1 つは "a" から "gzzzzzzzz"、別のマシンは "haaaaaaa" から "nzzzzzzz" などです。 .. 例えば。

于 2010-09-29T08:19:00.737 に答える
1

最も効率的な (おそらく最も困難ではない) 方法は、おそらく既にそれを実装している人を見つけることです (たとえば、John the Ripperを使用します)。

于 2010-09-29T00:33:36.610 に答える