ランダム文字生成 - ランダム出力!

ランダム文字生成 - ランダム出力!

緊縮措置は次のような影響を与える可能性があります。

[user@localhost ~] crunch 3 3 ab
Crunch will now generate the following amount of data: 32 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 8 
aaa
aab
aba
abb
baa
bab
bba
bbb
[user@localhost ~] 

ところで解決策はありますか?これはクランチと同じですか?唯一の違いはランダム出力ラインですか?

[user@localhost ~] SOMEMAGIC 3 3 ab
bba
bab
abb
aaa
bbb
aab
baa
aba
[user@localhost ~] 

「sort-R」のようなものを使うのは良くありません!解決策は「即時」でなければならないからです。

答え1

危機を模倣する

これは、3つの文字列の長さのセット{a、b}のすべての順列を生成し、混合出力を使用しますshuf

$ printf "%s\n" {a..b}{a..b}{a..b} | shuf
bbb
aab
abb
bba
baa
aba
bab
aaa

これは実際に使用することに関連していますsort -R

隠されたランダム化

scriptX引数リストが与えられた場合などの任意のリストを返すようにインターフェイスを非表示にすることを意図している場合は、crunchエイリアスまたはシェルスクリプトでラップするとアクションが実行されます。以下をシェルスクリプトに入れることができますmycrunch.bash

#!/bin/bash

crunch "$1" "$2" "$3" | sort -R

実行可能としてマークします。

$ chmod +x mycrunch.bash

次のように実行してください。

$ ./mycrunch.bash 3 3 ab

スプリアスクランチ出力フィルタリング

上記のスクリプトのコマンドを使用して、grep次のようにこれらの行をフィルタリングできます。

crunch "$1" "$2" "$3" | grep -vE "Crunch|0" | sort -R

これにより、「Crunch」または「0」文字列を含むすべての行が無視されます。

答え2

分析する

あなたがしたいことには根本的な困難があります。

crunchすべての可能な行をランダムな順序で出力するには(すべての行を事前に作成し、ORとして機能せずに)、すでにsort -R印刷shufされている行を覚えておく必要があります。この情報を保存するには、最終的にすべての行を保存するのに十分なスペースが必要です。まだ印刷されていないコレクション全体から行をランダムに選択するために必要な合計計算作業は、コレクション全体を操作するために必要な計算作業にsort -R似ていますshuf

crunch厳密な順序で行を生成するので、このような気軽に行を生成できます。次の行を知るには、コマンドライン引数と現在の行(そして使用されているアルゴリズム)を知るだけでcrunch十分です。私のポイントは、crunch前の行を覚えておく必要はなく、比較したり検索したりする必要がないということです。その行が何であるか既に知っていて、まだ印刷していないので、次の行にすばやく移動します。

自分で試してみてください。 0から26までのすべての数字をランダムな順序で(または少なくともランダムに見える順序で)大声で話してください。繰り返しや欠落はなく、各数字は一度だけ実行されます。急いで!さて、0から26までのすべての数字を自然に話しましょう。

理論的には、上記の負担なしにランダムに見えるシーケンスを取得する方法は少なくとも2つあります。

  1. 現在の行とコマンドライン引数だけを知ると、内部アルゴリズムは何らかの方法で前の行crunch(大規模なコレクションの場合は数百万行)とは異なる次の行を生成できるため、最終結果はランダムにソートされているように見えます。 。

  2. 使用されたコマンドライン引数がわかると、crunch外部フィルタは現在の行を取得しcrunch(並べ替えられた方法で動作)、任意の方法で変換できるため、crunch完了すると最終結果がランダムに整列されているように見えます。

フィルタ内またはフィルタ内のアルゴリズムは、crunch重複や欠落なしに可能なすべての行を生成する必要があります。シードを提供して、次のフル実行時に結果がランダムに混在するように見せることができます。そのようなアルゴリズムを作成することは(可能であればアルゴリズム自体の負担を隠さずに)簡単ではない作業だと思います。


しかし、なぜ?

crunch無差別代入を介してパスワードを推測するために単語リストを生成するために一般的に使用されます。次のように生成されたリストが必要だとします。

crunch 9 9

ランダムシーケンスがソートされたシーケンスよりも優れていますか?実際のパスワードに他の文字が含まれている場合や長さが異なる場合は、リストに表示されず、両方の順序が同じように悪いです。パスワードが異なるものであることを確認するには、リストの1つを完全に消費する必要があります。

実際のパスワードがリストにある場合は、幸運にも早くリストに登るかもしれません。これは、パスワード所有者(作成者)がユーザーがデフォルトのcrunchaz順序文字セットを使用すると予測する場合、意図的にazで始まる「賢い」パスワードを選択することができ、z成功を遅らせるだけです。リストを乱すと、この戦略は無効になります。実際のパスワードはリストの前半に近い場合も、リストの最後に近い場合もあるため、平均してリストの半分を使い切る必要があります。平均的にこれを行うと、で始まる「スマート」パスワードを推測するのに約半分の時間がかかりますz

はい。この場合、リストを並べ替えると便利です。

しかし、「スマート」パスワードの所有者をだますためにzaを使用するのはどうですか?

crunch 9 9 zyxwvutsrqponmlkjihgfedcba

これにより、比較的迅速に「スマート」パスワードを推測できますz。しかし、ポスターが予測するならこれ特定の攻撃を行う場合は、むしろパスワードを生成するほうが良いでしょうa

行う方法:コインを投げてaz(前面)またはza(背面)を使用してください。

すべてのパスワード(ポリシーを使用するかポリシーなしで生成されます)に対して、azは幸運ではなく、azは幸運ではなく、zaは幸運です。したがって、リストにパスワードしかない場合は、幸運な順序を使用する確率は50%です。一般的にリストの半分を使い果たす必要があります。リストを混ぜるかのように。コインを一度投げると、どんな戦略も役に立たなくなります。

答え3

さて、sort -Rを使用して、「Crunch will now」で始まる出力行の後ろのすべての内容をパイプできます。このように:

crunch 3 3 ab| sed -e '0,/^Crunch will now/d' | sort -R

それでも、これが「即時」と見なされるかどうかはわかりません。

答え4

しかし、ランダムな出力ラインだけが異なるだけで、クランチと同じ解決策がありますか?

いいえ。

この問題は、次の 2 つの手順で解決できます。

  1. 可能なすべての組み合わせを作成する
  2. 結果のランダム置換の生成

少なくとも単一のアルゴリズムを使用して組み合わせを作成しない限り、同時に両方を実行することはできません。さまざまなアルゴリズムが必要であり、プログラムの起動時にランダムに1つを選択し、これらのさまざまなアルゴリズムの最終結果が均等に分布していることに注意してください。

とにかく、何も見つからないと思います。シンプルcrunchこれは+とは大きく異なりますsort -R

関連情報