2016-10-18 6 views
1

練習として、私はPHPでMD5を実装しようとしています。 PHPにはこのための関数が組み込まれていることは知っていますが、実際のソースを読み、実行し、勉強したいと思います。私はthis scriptが適切なセクションのコメントを解除して(メッセージパディングを有効にする)、配列がそれに応じてフォーマットされている(PHPのバージョンとの互換性がある)場合にうまくいくことを発見しました。例えば、長さゼロの文字列のMD5ハッシュは次のようになります。PHPのMD5スクリプト

d41d8cd98f00b204e9800998ecf8427e

が、同じのためのスクリプトによって返されるハッシュは以下のとおりです。

85bd946a585af9fd3fb9eda68707c1d8

私は他の文字列を試してみました相関はありません。私はMD5を勉強してきたので、それがどのように動作するかについて合理的な知識を持っています。私はスクリプトを尋問してきましたが、それは合法的です。私は、なぜこのスクリプトがMD5を返さないのかを発見するという挑戦のために、別の人に叫び声をあげていると思います。

+0

'私のバージョン? – JOUM

+1

私はそれを実行し、それは '未定義のインデックス'のスルーを吐き出すので、私はそこをあきらめました。 – AbraCadaver

+0

残念ながら、私は古いバージョンを実行しています - 5.3.28しかし、それでも純正のMD5ハッシュが返されるはずです。このスクリプトが真のMD5ハッシュを7で返したかどうか教えていただけないでしょうか? – James

答えて

2

ローテーション機能に問題があるため、このスクリプトは正真正銘のMD5ハッシュを返していませんでした。

現在、PHPはネイティブのビットローテーション機能を提供していません。それにもかかわらず、ビットシフトは、左シフト結果と右シフト結果とを組み合わせることによって達成することができる。しかし、負符号付き整数の右ビットシフトの間、符号ビットはオペランドの符号保存のためにシフトインされる。これは望ましくない結果をもたらし、ビットマスクを使用して克服される。

ここで、$xは入力値、$cはシフトするビット数です。すべての値は32ビットです。

オリジナルコード:

`return ($x << $c) | ($x >> (32 - $c));` 

新しいコード:

if($x < 0){ 
    return ($x << $c) | abs(((pow(2, $c)) * -1) - ($x >> (32 - $c))); 
} else { 
    return ($x << $c) |       ($x >> (32 - $c)) ; 
} 

私は意図的に式の類似性と存在感を示すために、ライン2と対比するためにライン4に複数のスペースを残してきました(または不在)を示す。

三項はフォーマット:PHP` PHP7の

return ($x < 0) ? (($x << $c) | abs(((pow(2, $c)) * -1) - 
     ($x >> (32 - $c)))) : (($x << $c) | ($x >> (32 - $c)));