私は、Word辞書からXKCDのようなパスフレーズ(correcthorsebatterystaple)を解読する方法を見つけようとしています。基本的には、辞書ファイルからX個の単語を連結します。正直なところ、簡単な方法があるようには見えません。
XKCDコミックの後、このようなツールがたくさん作られました。私はいつでも自分のツールを起動して辞書ファイルを作成できましたが、もっと良い方法があるはずだと思います。私の特定の用途は、MD5ハッシュでのリッパージョンです。
JtRで単語全体を連結する方法はないようです。既存の単語を変更するだけです。参照 [〜#〜]ここ[〜#〜] 下部
JtRの将来のバージョンでは、マルチワードの「パスフレーズ」クラッキングモード、またはワードリストモードの拡張機能が追加される可能性があります。
これは2008年でしたが、このような変化への言及はまだありません。そのドキュメントで説明されている手法を使用することもできますが、2つ以上のWordフレーズを実行する必要がある場合や、辞書が長すぎる場合は、醜くなります。
私の2番目のアイデアは、Crunchを使用して単語をパイプでつなぐことでした。たとえば、_crunch 0 0 -p Word1 Word2 | john --pipe mypasswd*
少し変更して-q wordlist.txtを使用し、crunchはそのテキストファイルの単語を使用します。ここでの問題は、パスフレーズに使用される単語の数を制限する方法がない(私が見つけた)ことです。たとえば、辞書に1,000語が含まれている場合、各パスフレーズは1,000語すべての連結になります。繰り返しになりますが、辞書が非常に長くなると、見苦しくなります。
編集:上記のクランチコマンドを変更して最小長と最大長を指定することを提案している人のために、ここに注意してください。これは-pまたは-qオプションでは機能しませんが、数値を指定する必要があります(したがって0プレースホルダー)。 参照 -pフラグの下
最小長と最大長は無視されますが、2つの数値を指定する必要があります。
そのため、ファイルのサイズが原因でファイルではなく、標準出力に書き込むものに要件が残り、結合する単語の数(2語句、3語など)を指定できます。他の文字やスペースが許可されている場合は、このようなツールを使用して、分離文字(correct.horse.battery.staple correct | horse | battery | staple)を指定することもできます。
これが正しいスタック交換であるといいのですが、誰か他に試してみる必要があるかどうか誰かに知らせてください。
これと同じ種類のものを探している他の人のために、ここにpythonコードの抜粋があり、多かれ少なかれ私が望むことを行います。
# iterable=['test','correct','horse','battery','staple']
## Change the file specified here to your dictionary file
iterable = [i.strip().split() for i in open("wordList.txt").readlines()]
def permutations(iterable, r=None, s=''):
pool = Tuple(iterable)
n = len(pool)
r = n if r is None else r
if r > n:
#return
r = n # Lets assume users want all permutations
indices = range(n)
cycles = range(n, n-r, -1)
temp = Tuple(pool[i] for i in indices[:r])
for item in temp: # iterate through the current Tuple and turn it into a string, to get rid of brackets and such
print s.join([str(i[0]) for i in temp])
while n:
for i in reversed(range(r)):
cycles[i] -= 1
if cycles[i] == 0:
indices[i:] = indices[i+1:] + indices[i:i+1]
cycles[i] = n - i
else:
j = cycles[i]
indices[i], indices[-j] = indices[-j], indices[i]
temp = Tuple(pool[i] for i in indices[:r])
for item in temp:
print s.join([str(i[0]) for i in temp])
break
else:
return
# The first value relates to our variable (dictionary file) at the top
# The second value is the number of words we want to combine, a 2 would indicate 2
## Word combinations, such as correct.horse, 3 would be correct.horse.staple
# The third value is the seperater, such as . in the example above, to create words
## that run together enter nothing, or ''
permutations(iterable, 2, '.')
JtRでこれを使用するには、python xkcd.py | john --pipe mypasswd*
を使用します
コードは python's itertools から取得されたため、返されるはずです...
r長さのタプル、可能なすべての順序付け、繰り返し要素なし
私はこれすべてを望んでおり、さらに、配列をメモリに格納せず(長いリストを使用するとすぐに不足します)、ディスクに書き込みません(必要に応じて出力をリダイレクトできます)。
今、私は長い実行とJtRでエラー(IOError:[Errno 32] Broken pipe)に遭遇しました。コードがずさんであるなどの理由で、いいえ、これは完全な現実の解決策ではありません。しかし、指摘されたように、これは、可能性の数のために、エラーがなくても、現実の世界では実用的ではない場合があります。時々私は何かが可能かどうか知りたいだけです!
これを監視している誰かがCを知っていて、JtRまたはCrunchにこのようなものを直接追加したい場合は、これを高速化し、これ用に設計されたプログラムに書き込んだ場合、これをはるかに信頼できると感じています。一種の仕事。
私はBASHを使用してこのソリューションを実行しました。実は楽しいですね。出力ファイルが既に存在している必要があります。スクリプトを作成しているので、touch output.txt
コマンドは難しくありません。
shuf -n5 /usr/share/dict/words | tr -d '\n' >> output.txt; sed -i -e '$a\' output.txt
だからそれは
tr
(文字を変換する)を介してそれをスローし、新しい行を削除して、出力を出力ファイルに追加します。 これは、区切り文字を挿入するステップにもなります。それをループにスクリプト化すると、5つの単語の順列のファイルが連結されます。すべてをstdoutに出力したい場合は、変更できます。
1回のパスワード試行にJtRを使用する:
shuf -n5 /usr/share/dict/words | tr -d '\n' | john --pipe mypasswd*
shuf -n5 /usr/share/dict/words;
標準出力への入力行のランダムな順列を生成します。
tr -d '\n' >> output.txt
標準入力から文字を変換、圧縮、削除し、標準出力に書き込みます。
これを使用して、SHUFによって生成された改行文字を削除し、結果を出力ファイルに連結します。
ヒントしかありません この回答では ツールが存在することを示しています。あなたの発言:
「しかし、2つ以上のワードフレーズを実行する必要がある場合、それは実際に醜くなります[....]」および
「繰り返しになりますが、辞書が非常に長くなると、醜くなります」
ツールが存在する場合、およびGPUでのパスワードクラッキングに匹敵する速度で実行される場合でも、クラッキングにかかる時間を見積もったのかどうか疑問に思います。
(私のパスフレーズ分析ツールから取られた以下)。パスフレーズが次のとおりだとします。
ワディ攻撃明白なワイヤー
そして7776語の適度な長さのDicewareのような辞書を想定すると、
GPUの代わりにCPUでリカバリーを行う場合、おそらく50 *(GPUの数)倍の時間がかかります。 CPUのアプローチは現実的ではないようです。