2011-07-06 135 views
2

問題是爲什麼一個32字符的字符串在C#.NET中工作,但不是在PHP mcrypt中,以及如何使它們兼容? (我有AES做這件事的方法,3DES保持打開狀態。C#和PHP加密/解密密鑰大小的PHP問題

我試圖創建一個使用微軟的加密API在.NET和PHP的mcrypt的加密和解密數據的加密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是錯誤的。我得到了32分,而不是37分。 – 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需要密鑰的原始字節。這裏是工作代碼:

$key = "Use any string you want as a password."; 
$encrypted = base64_decode("OcSlUzWMgac5RxYyt+An0g=="); //This is the base64 encoded cipher text 

$newKey = hash("md5", $key, TRUE); 
//echo base64_encode($newKey)."\n"; 

$decrypted = mcrypt_decrypt(MCRYPT_3DES, $newKey, $encrypted, MCRYPT_MODE_ECB); 

echo $decrypted; 

您可以通過添加salt並迭代多次來提高PBKDF的強度。因此,而不是隻使用:

md5(password) 

使用類似

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

你的想法。更好的是,在C#和PHP中使用產生相同密鑰的PBKDF2實現。

+1

謝謝,但你知道我將如何讓C#和PHP使用任意密鑰大小? –

+0

看到我編輯的答案。 – ixe013

+0

+1用於PBKDF。有關詳細信息,請參見[PKCS#5](http://www.rsa.com/rsalabs/node.asp?id=2127)。 – emboss