4

というわけで、私はここ数か月、この号の壁に頭を悩ませてきました。これは副次的な関心事であり、プログラミングが苦手なためでもあります。私はウェブ全体を検索して調査しましたが、運がなかったので(わずかな成功を除いて。以下を参照)、専門家に尋ねてみようと思いました.

私がやろうとしているのは、タイトルが示すように、「事実上の」標準に従って、パスフレーズから 40/64 ビットの WEP キーを生成することです。( http://www.powerdog.com/wepkey.cgiなどのサイトでは、予期される出力が生成されます。) 入力を受け取り、それらをファイルに書き込むスクリプトの一部を既に作成しました。入力の 1 つはパスフレーズで、小文字にサニタイズされます。

長い間、私は事実上の標準が何であるかを知りませんでした。ましてや、それを実装する方法さえ知りませんでした。私はついに、この問題について私がこれまで持っていたのと同じくらい多くの光を当てている論文 ( http://www.lava.net/~newsham/wlan/WEP_password_cracker.pdf )に出くわしました (18 ページに関連するビットがあります)。どうやら、パスフレーズは「XOR を使用して 32 ビット値にマッピングされ」、その結果が「線形合同 PRNG (Python が持っているいくつかの PRNG の 1 つがこの説明に適合するかどうかはわかりませんが、私にはわかりません。その結果から、結果のいくつかのビットが取得されます. 説明がかなり曖昧なので、これを実装する方法がわかりません.

私が必要としているのは、ジェネレーターを Python で作成する際の助けと、キーがどのように正確に生成されるかを理解するための助けです。つまり、「jackson」を「09F38AF593」に変換するコードが必要です。(そして教えないでください jackson = 09F38AF593; print (jackson))

私はあまりプログラマーではないので、説明もありがたいです。

(はい、WEP が安全でないことは知っています。)

4

2 に答える 2

5

あなたがリンクしたCコードは、質問に含めるのに非常に役立ちました;-)とにかく、先に進んでPythonに翻訳しました。読む前に、自分で試してみて、私の書き起こしをガイドとしてのみ使用することを強くお勧めします. あるプログラミング言語から別のプログラミング言語にアルゴリズムを翻訳することは、一方または両方の言語のスキルを向上させたい場合に、一般的に優れた方法です。C を知らなくても、Python でプログラムを作成できるほど Python に精通していれば、C コードの要点は理解できるはずです。多くの類似点があるからです。

とにかく、コードに進みます。

import itertools, operator

まず、プレゼンテーションで線形合同ジェネレーターとして識別された疑似乱数ジェネレーターaこのタイプの PRNG は、 、c、およびm(ウィキペディアの記事で言及されている変数) の特定の値を選択することによって「カスタマイズ」できる一般的なアルゴリズムです。以下は、一般的な線形合同ジェネレーターの実装です。

def prng(x, a, c, m):
    while True:
        x = (a * x + c) % m
        yield x

(うまくいけば、あなたは自分でそれを思いついたかもしれません)

実際の機能については次のとおりです。

def pass_to_key(passphrase):

プロセスの最初のステップは、提供されたパスフレーズを 32 ビットの数値にハッシュ (または「マップ」) することです。WEP アルゴリズムは、ゼロに初期化される 4 バイトのセット (したがって 4*8=32 ビット) を作成することによってこれを行います。

    bits = [0,0,0,0]

文字列を通過し、各文字をバイトの 1 つと XOR します。具体的には、 characteriは byte に XOR されますi % 4

    for i, c in enumerate(passphrase):
        bits[i & 3] ^= ord(c)

次に、これらの 4 バイトが順番に連結されて、1 つの 32 ビット値が形成されます。(あるいは、最初から 32 ビットの数値として格納するコードを書くこともできました)

    val = reduce(operator.__or__, (b << 8*i for (i,b) in enumerate(bits)))

この 32 ビット値は、コードで確認できる特定の値を持つ線形合同ジェネレーターのシードとして使用されます。元の開発者がこれらの数値をどのように計算したかはわかりません。

    keys = []

線形合同ジェネレーターは、一度に最大 32 ビットの出力を生成できます。(C では、これはデータ型の制限です。Python では、人工的に強制する必要がありました。) 4 つの 40 ビット (5 バイト) WEP キーを生成するには 20 バイトが必要なので、PRNG を 20 回繰り返します。

    for i, b in enumerate(itertools.islice(prng(val, 0x343fd, 0x269ec3, 1<<32), 20)):

各数値から、右から 3 番目のバイト (ビット 16 ~ 23) のみを取得します。

        keys.append((b >> 16) & 0xff)

なぜ3番目?まあ、上限 (右から 4 番目) のビットはあまり変化しない傾向があり、下限のビットは PRNG 定数の多くの値に対して予測可能です。

その後、生成されたバイトを 5 つのグループで出力するだけです。

    print ('%02x:%02x:%02x:%02x:%02x\n'*4) % tuple(keys)
于 2010-05-23T03:14:08.220 に答える
1

そのウェブサイトが何を「デファクト スタンダード」と呼んでいるかはわかりませんが、ルーター メーカーがすべて独自の方法を実装していることは確かです。同じ入力が常に同じ出力になる限り、どのように行うかは問題ではありません。これは、WEP ユーザーが実際の 16 進キーの代わりにパスフレーズを覚えられるようにするための便利な機能です。投稿した PDF のメソッドでさえ、ほとんどあいまいです。未定義のPRNGを使用し(PRNGのすべてのタイプで異なる結果が得られます)、どちらを指定せずに各結果から「1バイト」を取得します。特定のルーターの方法をリバース エンジニアリングしようとしている場合は、投稿でそのことを述べてください。その仕組みを突き止めることができるかもしれませんが、標準的な方法はありません。

于 2010-05-23T02:02:28.753 に答える