web-dev-qa-db-ja.com

奇数パスワードスクランブルアルゴリズム

今まで見たことのないパスワードスクランブルアルゴリズムを備えたアプリケーションを研究しています。いくつかのパスワードを生成し(最大長は8文字です)、次の結果を得ました。

password:     0  0  0  0  0  0  0  3
scrambled:    W1 U6 W1 U6 W1 U6 W1 X2

password:     0  0  0  0  0  0  0  2
scrambled:    W1 U6 W1 U6 W1 U6 W1 M7

password:     0  0  0  0  0  0  0  1
scrambled:    W1 U6 W1 U6 W1 U6 W1 F2

password:     0  0  0  0  0  0  0  0
scrambled:    W1 U6 W1 U6 W1 U6 W1 U6

password:     1  2  3  4  5  6  7  8
scrambled:    H9 G6 B5 G3 F8 Q7 X8 O9

スクランブルは明らかに可逆的です。辞書マッピングを生成することができればさらに悪くなると思いますが、これを行うための賢い方法があると思います。

誰かが以前にこのような何かに遭遇したことがありますか?

更新

より多くの値と注記:

  • 0は他の文字とはまったく異なる動作をします
  • @も注目に値します(すべての位置で一定)
  • アルゴリズムが3文字未満のパスワードを処理できない、または処理できない
4  4  4  4  4  4  4  4
A2 S5 K9 G3 Y6 U0 M4 E8

3  3  3  3  3  3  3  3
L4 Z5 B5 R1 R5 F7 H6 X2

2  2  2  2  2  2  2  2
W6 G6 S0 C0 K4 U3 C8 M7

1  1  1  1  1  1  1  1
H9 N6 F6 J8 D3 J0 B0 F2

1  0  0  0  0  0  0  3
H9 U6 W1 U6 W1 U6 W1 X2

a  b  a  b  a  b  a  b
H1 E3 B8 W6 Z4 S0 X1 K4

b  b  b  b  b  b  b  b
S8 E3 O2 W6 G6 S0 C0 K4

a  a  a  a  a  a  a  a
H1 L3 B8 H5 Z4 D7 X1 Z8

A  B  C
N6 C0 L0

B  B  B  B  B  B  B  B
M7 Y1 I1 Q5 A5 I9 S8 E3

A  B  A  B  A  B  A  B
B0 Y1 V6 Q5 T3 I9 R0 E3

A  A  A  A  A  A  A  A
B0 F2 V6 B4 T3 X5 R0 T7

A  A  A  A  A  A  A
J0 B0 F2 V6 B4 T3 X5

A  A  A  A  A  A
D3 J0 B0 F2 V6 B4

A  A  A  A  A
J8 D3 J0 B0 F2

A  A  A  A
F6 J8 D3 J0

A  A  A
N6 F6 J8

@  @  @  @
M2 M2 M2 M2

#  #  #  #
P2 B9 F3 T4

*  *  *  *
A9 A1 U7 Q9

!  !  !  !
Z4 D7 X1 Z8

これらのパスワードのスクランブルを解除するためのブルートフォースアプローチの一般的なルール:

長さLの文字列では、位置Nの指定された文字は常に同じ値になります

IE:8文字の長いパスワードでは、最初の文字がAの場合、常に同じ方法でエンコードされます。

注意:私はこれらをスクランブル解除する「ブルートフォース」の方法を見つけましたが、パスワードのスクランブルに使用されるアルゴリズムを知りたいです。誰かがこのようなことを元に戻した経験があれば、ここから先に進むためのヒントをいくつか教えてください。

8
Juicy

私が提案しようとしているヒントの多くは、スクランブラーを過度に使用する必要があります。これらは辞書攻撃ではありませんが、データを収集するためにパスワードスクランブルが多数含まれています。あなたの目標が関数に対してあまりにも多くのテストプローブなしでこれを行うことである場合、またはそれを行うことができない場合、私は実際には多くのヒントを持っていません。

整数

整数は扱いが簡単で、独自のスクランブルを実装する人はおそらく文字列ではなく整数を操作するでしょう。 2つのシンボルトークン(_J8_、_D9_など)と整数の対応を見つけることは非常に重要です。すべての数字と文字が表現されているので、使用する_26*20=260_異なるトークンがあります。 _260_は_256_に快適に近いため、トークンは単なるバイトのエンコーディングである可能性があります。

直感的なアプローチは、Xnを_10*X+n_として解釈することです。ここで、Xは文字Xのインデックスで、nは0〜9の整数です。これは、整数に対応するトークン_Z8_によって除外されます_258_、1バイトに対して大きすぎます。同様の方法で、少なくともこれらの単純な線形の組み合わせである他のいくつかのエンコーディングを除外できます。

_b = 10*X + n
b = 10*(26-X) + n
b = (26-X) + 26*n
b = 10*(26-X) + (9-n)
b = (26-X) + 26*(9-n)
_

私たちが行うエンコーディングの推測を排除するには、スクランブルにどのような分岐が現れるかを知ることが非常に役立ちます。トークンがバイトのエンコーディングである場合、表示されない_260-256=4_トークンが存在する必要があります。これらのトークンを見つけると、貴重なヒントが得られます。すべてのトークンがいずれかの時点で発生する場合、それも貴重なヒントになります。

ボックス

パスワードのスクランブル(「AAA」、「AAAA」、「AAAAA」...)は、有用な情報を提供します。スクランブル関数単一のシンボルの場合が関数f(symbol, integer) -> tokenであると推測できるため、整数iはパスワードの長さとシンボルのインデックスの合計です。例えば。 f(A, 4+1) = f(A, 3+2) = J8。一般にf(symbol, length + index)は、すべての長さとインデックスに対して定数です。

_A  A  A  A
F6 J8 D3 J0

A  A  A
N6 F6 J8
_

パスワードは8つの記号に制限されているため、検索する_8+8 = 16_異なるスクランブル関数g_n(symbol) -> tokenがあります。これらの関数が整数「n」に依存するかどうか(つまり、_length + index_)は、利用可能なデータから確立するのは困難です。関数_g_n_は、ルックアップテーブルとして実装でき、パターンに従うことはできません。

@

_@_文字に困惑しましたが、おそらくスクランブルされた電子メールアドレスを認識するためです。電子メールアドレスは8シンボルより長く、スクランブルがより長い入力でも機能することを意味している可能性があります。つまり、関数_g_n_ arenに依存していることを示唆しています(遅延の定理、ランダムなルックアップテーブルを作成する人はいません)

ルックアップテーブルの作成

これは、すべてのパスワードを単純にスクランブル__aa...a_、_bb...b_ ... _^^...^_し、長さと位置の関係を使用して、どの関数_g_n_がスクランブルされた結果に属するかを決定することで実行できます。に。このデータは、トークンがデータをエンコードする方法と方法を見つけるのにも役立ちます。

テーブルを見て

長さ8のすべての繰り返しアルファベットパスワードのテーブルを作成した場合、 aaaaaaaabbbbbbbなど。スクランブルされた結果を8x26の画像として視覚化できます。人間は画像をよく見るので、最も単純なもの(直線性など)は画像から簡単に見られます。画像の水平、垂直、正方形、または斜めのアーティファクトを探すことは、パスワードをスクランブルするために使用されるアルゴリズムについて多くのことを言うことができます。このアプローチは非常に有機的であり、スクリプト/プログラミングのスキルが必要です。

私の視覚化アプローチは次のようになります:

  • 8つの繰り返しのすべてのパスワードのスクランブルを生成ASCII文字(または可能であればバイト)
  • いくつかの単純なスキーム(例:線形結合)を使用してトークンをバイトに変換する
  • バイトをバイナリファイルとして保存_bytes.gray_
  • ImageMagickconvertユーティリティを使用:_convert -size 8x256 -depth 8 bytes.gray bytes.png_
  • 画像を見て、パターンを見つけてください
3
Juha Kivekäs

このシーケンス:

a  b  a  b  a  b  a  b
H1 E3 B8 W6 Z4 S0 X1 K4

b  b  b  b  b  b  b  b
S8 E3 O2 W6 G6 S0 C0 K4

a  a  a  a  a  a  a  a
H1 L3 B8 H5 Z4 D7 X1 Z8

XORのほとんどの使用は16進数で出力されますが、この出力がbase36である場合を除いて、XORのように、入力パスワードをスクランブルするために使用されるキーがあることを通知しますか?

このシーケンス

A  B  A  B  A  B  A  B
B0 Y1 V6 Q5 T3 I9 R0 E3

A  A  A  A  A  A  A  A
B0 F2 V6 B4 T3 X5 R0 T7

A  A  A  A  A  A  A
J0 B0 F2 V6 B4 T3 X5

A  A  A  A  A  A
D3 J0 B0 F2 V6 B4

異なる長さの文字列には異なるキーがあると思います。

したがって、私はアルゴリズムが平文「a」を取り、「a」(97)のASCII値を取り、それをbase36(2P)に変換し、キーのそれぞれの値とXORし、H1のbase36値を与えると思います。

編集:それはbase36ではないようです。使用されているエンコード方式が何であれ、XORを使用していると私はまだ推測しています。 XとXORされたゼロは常にXであるため、ゼロの動作を説明するのに役立ちます。

これが当てはまる場合、プロセスは可逆的であり、キーを見つけることができるため、ブルートフォースやルックアップテーブルを作成する必要がなくなります。

6
mcgyver5