2011-07-06 23 views
2

問題は32文字列がC#.NETでは動作しますが、php mcryptでは動作しません。 (私はAESでそれを行うための方法を持って、3DESが開いたまま。C#とPHPの暗号化/暗号化の問題(keysize)

私は、データの暗号化と復号化に.NETおよびPHPのmcryptの中にMicrosoftの暗号化のAPIを使用して暗号化APIを作成しようとしている。

C#は暗号化と解読ができるはずですが、PhPは解読する必要があります。問題は私が自分の鍵を定義できるようにすることです。これを行うには、md5が入力したパスワードをハッシュします。 C#側ではなく、PHPで取得する

警告:mcrypt_decrypt()[function.mcrypt-decrypt]:C:\ xampp \ htdocs \ failcrypt \ crypt.phpのこのアルゴリズムでは、鍵のサイズが大きすぎます40行目

(空の文字列も有効です)、かなり大きなキーが必要です。

私が見つけることができるすべてのリンクはプリセットキーを持っていますが、私は両側の任意のキーサイズで動作する必要があります。

 echo $key."</br>"; 
     echo md5($key)."</br>"; 
     $newKey = md5($key)."</br>"; 
     echo strlen($newKey)."</br>"; 
     $decrypted = mcrypt_decrypt(MCRYPT_3DES, md5($key), base64_decode($msg), MCRYPT_MODE_ECB); 
     echo $decrypted; 

出力は

赤(キー)

bda9643ac6601722a28f238714274da4(ハッシュ)

+0

あなたがそれを運んでいる間、何かキーのように見えます。私はエンコードの問題のにおいがしますが、あなたが書いたのはMD5のハッシュです。どのようにC#からPHPにキー文字列を渡すのですか? – hakre

+0

@hakre鍵はハードコーディングすることができます。ちょうどphpとc#の両方が同じ鍵を使用できる必要があります –

+1

うーん、あなたがあなたの質問に与えるstrlenは間違っています。私は、37ではなく32の得点を得る。 – hakre

答えて

2

あなたがそれを行う方法、キーのサイズは任意ではありません。これは常にMD5ハッシュの出力になります。パスワードベースのキー導出関数(PBKDF)の(弱い)形式を使用しています。だから、キーは本当に文字列 "赤"ではない、それはMD5関数の出力です。

$ echo red | tr -d [:space:] | openssl dgst 
(stdin)= bda9643ac6601722a28f238714274da4 

$ echo The quick brown fox jumps over the lazy dog. | tr -d [:space:] | openssl dgst 
(stdin)= 09ecfef50e54940a3d241a10b7e70e3c 

つまり、mcrypt_decryptはキーの生のバイトを必要としています。

塩を加えて何度も繰り返してPBKDFの強さを上げることができます。だから、代わりにのみ使用するのでは:

md5(password) 

使用して、

md5(salt+md5(salt+md5(salt+md5(salt+md5(salt+password))))) 

のようなものをあなたのアイデアを得ます。さらに、同じキーを生成するC#とPHPのPBKDF2実装を使用してください。

+1

ありがとうございます。しかし、C#とPHPの両方を任意のキーサイズで動作させる方法を知っていますか? –

+0

私の編集した答えを見てください。 – ixe013

+0

+1 for PBKDF。詳細は、[PKCS#5](http://www.rsa.com/rsalabs/node.asp?id=2127)を参照してください。 – emboss