c#和PHP加密/解密PHP问题与密钥大小
本文关键字:PHP 密钥 问题 解密 加密 | 更新日期: 2023-09-27 18:01:17
问题是为什么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实现来生成相同的键。