c#和PHP加密/解密PHP问题与密钥大小


C# and PHP encryption/decryption php problem with keysize

问题是为什么32个字符串在c# .NET中工作,而不是在php mcrypt中,以及如何使它们兼容?(我有一个方法做它与AES, 3DES保持开放。

我试图创建一个加密api,它使用微软Crypto api在。net和PHP的mcrypt加密和解密数据。

c#应该能够加密和解密,PhP只需要解密。问题是我希望用户能够定义他们自己的键。为此,我对他们输入的密码进行了md5散列。这在c#端工作得很好,但在PHP中我得到

警告:mcrypt_decrypt() [function。在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(哈希值)

通过这种方式,密钥大小永远不会是任意的。它将始终是MD5哈希的输出。您正在使用一种(弱)形式的基于密码的密钥派生函数(PBKDF)。因此,密钥实际上不是字符串"red",而是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;

可以通过添加盐和多次迭代来增加PBKDF的强度。所以不要只使用:

md5(password)

使用像

这样的字符
md5(salt+md5(salt+md5(salt+md5(salt+md5(salt+password)))))

你懂的。更好的是,使用c#和PHP中的PBKDF2实现来生成相同的键。