1

http://blog.kevburnsjr.com/php-unique-hashにリストされているPseudoCryptスクリプトを逆にする方法を作成しようとしています。このコードでは、次の式があります。

$dec = ($num * $prime)-floor($num * $prime/$ceil)*$ceil;

$numを除くすべての変数を取得できました。たとえば、次の番号を取ります。

$dec = 566201239;
$prime = 566201239;
$ceil = 916132832;

その場合、方程式は次のようになります。

566201239 = ($num * 566201239)-floor($num * 566201239/916132832)*916132832;

答えは1でなければなりません。しかし、私は方程式=$numを作る方法を決定していません。URLで作成されたハッシュを使用してから、ハッシュを復号化してデータベースでクエリを実行したいと考えています。

編集:複製の余地がほとんどない一意のハッシュを作成するためのより良い方法がある場合は、代わりにそれを受け入れます。

編集:どういうわけか私は$decに間違った値を入れました。編集:機能するコードで更新されたブログ投稿。

4

3 に答える 3

2

コメント投稿者のPadraigKennedyの助けを借りて、ライブラリがアップグレードされ、可逆性がサポートされるようになりました
http://blog.kevburnsjr.com/php-unique-hash

于 2013-05-14T22:45:04.790 に答える
1

それを観察する

物-床(物/天井)*天井

は(thing%ceil)と同じです。ここで、%はモジュロ演算子(除算後の余り)です。あなたの場合、

$ dec =($ num * $ prime)%$ ceil

これは常に0から$ceil-1の間であるため、$ceilに等しい値$decを取得できないことに注意してください。一方、0と$ceil-1の間の特定の$decに対して、0と$ceil-1の間の解$numを効率的に見つけることができます。

(観察結果は、$numが$num + i * $ ceilよりもソリューションである場合、任意のiもソリューションです。)

$ dec=42の進め方は次のとおりです。

$ ceil = 2 ^ 5 * 31^5という事実を使用します。したがって、方程式は次のようになります。

42 =($ num * 566201239)%(2 ^ 5 * 31 ^ 5)

まず、($ num%2)、つまり$numが奇数か偶数かを調べます。2を法とする方程式の両辺を取ります。

0 = 42%2 =(($ num * 566201239)%(2 ^ 5 * 31 ^ 5))%2。

2は$ceilを除算するため、右側は($ num * 566201239)%2になります。これが0でなければならない場合、$ numは偶数でなければなりません($ primeはそうではないため)。したがって、いくつかの$ aに対して($ num = 2 * $ a)があり、

2 * 21 = 42 =(2 * $ a * 566201239)%(2 ^ 5 * 31 ^ 5)、

2で割った後、

21 =($ a * 566201239)%(2 ^ 4 * 31 ^ 5)。

%記号の後の部分も2で割られていることに注意してください。このモジュロ2を使用して続行します。つまり、$ aが奇数であることがわかります。つまり、$bに対して$a = 2 * $ b+1です。

21 =((2 * $ b + 1)* 566201239)%(2 ^ 4 * 31 ^ 5)、

349931614≡21-566201239≡(2 * $ b * 566201239)%(2 ^ 4 * 31 ^ 5)、

(私は合同表記≡を使い始めました; x≡y%zによって私はx%z = y%zを意味します)。

174965807≡($ b * 566201239)%(2 ^ 3 * 31 ^ 5)

私たちは続けます...

174965807≡((2 * $ c + 1)* 566201239)%(2 ^ 3 * 31 ^ 5)

174965807-566201239≡(2 * $ c * 566201239)%(2 ^ 3 * 31 ^ 5)

66830984≡2*$c * 566201239)%(2 ^ 3 * 31 ^ 5)

33415492≡($ c * 566201239)%(2 ^ 2 * 31 ^ 5)

33415492≡(2 * $ d * 566201239)%(2 ^ 2 * 31 ^ 5)

16707746≡($ d * 566201239)%(2 * 31 ^ 5)

16707746≡(2 * $ e * 566201239)%(2 * 31 ^ 5)

8353873≡($ e * 566201239)%(31 ^ 5)。

置換を要約すると、次のことを思い出してください

$ num = 2 * $ a = 2 *(2 * $ b + 1)= 4 * $ b + 2 = 4 *(2 * $ c + 1)+ 2 = 8 * $ c + 6 = 8 * 2 * $ d + 6 = 8 * 2 * 2 * $ e + 6 = 32 * $ e + 6

ちなみに、31 ^5を法とする方程式の$primeを減らすこともできます(各ステップで現在の法によってそれを減らし続けることができますが、誰が気にしますか?):

8353873≡($ e * 22247370)%(31 ^ 5)。

乗数は素数ではないことがわかりますが、実際には問題ではありません。

ここで、31を法とする最後の方程式を見てみましょう。

8353873≡($ e * 22247370)%(31 ^ 5)。

24≡8353873≡($ e * 22247370)%(31 ^ 5)≡($ e * 22247370)≡($ e * 3)%31

31を法とする3の倍数のルックアップテーブルでは、$e≡8%31、または$ e = 31 * $ f+8であることがわかります。

8353873≡((31 * $ f + 8)* 22247370)%(31 ^ 5)。

8353873-8 *22247370≡(31 * $ f * 22247370)%(31 ^ 5)。

2149819≡8353873-8*22247370≡(31 * $ f * 22247370)%(31 ^ 5)。

69349 = 2149819 /31≡($ f * 22247370)%(31 ^ 4)

そして私たちは続けます...

2≡69349%31≡($ f * 22247370)%(31 ^ 4)≡($ f * 3)%31

$f≡11%31

$ f = 31 * $ g + 11

69349≡((31 * $ g + 11)* 22247370)%(31 ^ 4)

81344≡69349-11*22247370≡(31 * $ g * 22247370)%(31 ^ 4)

2624≡($ g * 22247370)%(31 ^ 3)

乗数をもう一度減らしましょう...

2624≡($ g * 23284)%(31 ^ 3)

20≡2624≡($ g * 23284)%(31 ^ 3)=($ g * 3)%31

$ g = 31 * $ h + 17

2624≡((31 * $ h + 17)* 23284)%(31 ^ 3)

23870≡2624-17*23284≡(31 * $ h * 23284)%(31 ^ 3)

770≡($ h * 23284)%(31 ^ 2)

26≡770≡($ h * 23284)%(31 ^ 2)=($ h * 3)%31

$ h = 31 * $ i + 19

770≡((31 * $ i + 19)* 23284)%(31 ^ 2)

434≡770-19*23284≡(31 * $ i * 23284)%(31 ^ 2)

14 =($ i * 3)%31

$ i = 15

後方置換により、$ h = 31 * 15 + 19 = 484、$ g = 31 * $ h + 17 = 15021、$ f = 31 * $ g + 11 = 465662、$ e = 31 * $ f+8が得られます。 = 14435530、$ num = 32 * e + 6=461936966。

結果を確認するだけです。

。>>>(461936966 * 566201239)%916132832

42

わお!:-)

ブログの人はむしろmd5を使うべきでした。

于 2011-04-08T16:53:07.620 に答える
0

これは作者によってハッシュ関数と呼ばれているので、「復号化」できるとは思いません。十分に長く検索すると、同じハッシュを生成する複数の入力が見つかるため、どれが使用されたかを知る方法はありません。

于 2011-04-08T14:13:24.507 に答える