4

この問題は、より数学的な側面にあります。16 進数の 4 バイト UID のリストと、対応する 2 バイト コードのリストを示しました。これらをハッシュと呼びましょう。

次のようになります。

7D04E214 --> 4A49
7D048DC3 --> A0E7
7D04DB2E --> 4191
...

私はこれらのタプルを 50 ほど持っているので、すべての UID の正しいハッシュを計算するアルゴリズムを見つければ、それが正しいものであると確信できます。

これが私の問題です。開始方法が本当にわかりません。私は数学者ではなく、この種の問題の経験はありません。ある種のビット単位のアルゴリズムが疑われます。CRC16の可能性があるようですが、すでに改ざんされています。一般的なアルゴリズムではないと思います。また、アルゴリズムはそれほど複雑ではないと思います (または希望します)。

特定の入力から特定の出力を計算する関数を見つけるという一般的な問題は決定できないことを知っています。しかし、アルゴリズムが単純なものであると仮定すると、どのような可能性があるでしょうか? 役立つツールはありますか? 独自のツールを作成するために提案できる読み物はありますか? ある種のブルートフォースについて考えていますが、これを体系的に行うにはどうすればよいですか?

前もって感謝します!

更新:私の質問には不明確な点があるため: 最初に UID からハッシュを作成するために使用された 1 つのアルゴリズム、または可能なすべての UID (つまり 4 -バイト番号)。考えられる関数は無数にあると指摘されたので、最も単純なものを見つけて、より多くの UID 値に対してテストする必要があると思います。私が言ったように、私はアルゴリズムが単純であり、あいまいな鍵でいっぱいではないと実際に仮定しています. もし私が間違っていたら、あなたが指摘したように私は運命づけられています。しかし、そうでない場合は、試行錯誤のチャンスがあるかもしれません。

4

3 に答える 3

5

他の人がコメント/回答したように、未知の関数の既知の情報がほとんどないという不適切な問題があります(まあ、結局のところ不明です:)。遺伝的プログラミングを使用して関数を推測することはできますが、それが未知の関数を実際に表しているという確信を期待することはできません->

しかし、ダミーの実験として、遺伝的プログラミングをいじってみたところ、与えられた3つの例に対して次のプログラムが見つかりました。

def guess(a, key=0xbeef): # The parameter 'a' is an input value.
    temp = (a % (-14)) << 3
    if temp == 0:
        temp = -4
    temp = ((a ^ (-2 * key)) - temp) >> 2
    res = (temp + a + (a % (-15))) % key
    return res

次の結果が得られます。

Input      Output (guess)   Actual output    Diff
0x7d04e214 0x4a49           0x4a49           0
0x7d048dc3 0xa0e7           0xa0e7           0
0x7d04db2e 0x4191           0x4191           0

したがって、作成されたプログラムでは、これらの入力に対して合計誤差が 0 単位になるため、関数は指定された例に対して正しいですが、それは何の意味もありません。例でエラーが発生しないプログラムを生成するには、数回の実行、数千世代などを要しました。さて、ここで注目すべき差し迫った問題は、未知の関数がkey入力と一緒にパラメーターを取ると仮定したことです。さらに、私は単にキーが0xbeef主に、それは素敵な 16 進数値であるためです。これらの決定の結果として、プログラムはこれらの選択に対応するプログラムを作成しようとしますが、未知の関数が行うことに関しては完全に間違っている可能性があります。これが意味することは、関連する結果を期待するために、この未知の関数を現在よりももう少し知られるようにする必要があるということです。

于 2013-02-11T03:22:35.260 に答える
1

特に達成しようとしていることを明確にする必要があります。

50 個の FIXED 入力値のようなものを 50 個以上の FIXED 出力値にマップできるようにしたいだけの場合は、既に提案されているように、入力値から出力値へのある種のマッピング テーブルを作成するだけで十分です。

一方、50 個の入力値とそれに対応する 50 個の出力値が与えられ、少なくとも数学的な観点から、他の入力値に対応する出力値を正しく予測できるようにしたい場合、固定数の入力が与えられた場合、問題は解決できません。値のマッピングを出力するには、これまでに表示されたすべての入力値をこれまでに表示されたのとまったく同じ出力値にマップし、これまでに表示されていない値に対して別の結果を計算する関数がまだ INFINITE 個あります。

于 2013-02-10T22:53:24.767 に答える
0

これは、より多くの情報を見つけるか、すべての可能な入力と出力のマッピングを組み立てて徹底的に実験できるようにしない限り、不可能なクエストです。

于 2013-02-10T23:12:56.223 に答える