在几个网站上有一个mcrypt片段:
https://stackoverflow.com/a/11538728/408872
http://www.techbees.org/best-way-to-use-php-to-encrypt-and-decrypt/
$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
echo 'Encrypted:' . "\n";
var_dump($encrypted);
echo "\n";
echo 'Decrypted:' . "\n";
var_dump($decrypted); // spaces are preserved
有人知道为什么在$ string上引入额外的空格?
答案 0 :(得分:2)
您提供的来源几乎使用完全相同的代码。我只能假设他们互相窃取了代码。所以这不是几个网站这样做的,很可能是一个网站,其他不了解发生了什么的网站只是继承了这个网站。
没有良好的理由在加密字符串之前为字符串添加额外的空格,它不会以任何方式增强加密的强度,它不会使它“更好”。
我的猜测是,在这些示例中,已经完成了显示像trim
这样的函数不会影响加密流的内容。 (我个人不明白为什么需要证明这一点 - 对我而言似乎完全合乎逻辑)
如果您接受base64编码的加密数据(可能来自表单提交),您很可能会修改提交的数据以删除用户留在那里的任何糠,我怀疑有人担心修剪加密数据会打破原来的明文。
修改强>
注意,如果此字符串不是base64编码,则完全有可能损坏密文。由于密文将以二进制形式表示,因此最终可能会有空格字符,这可能会被裁掉,导致损坏。
编辑2:
键的 md5(key)
和初始化向量的md5(md5(key))
都是 可怕的 实现此方法。
首先,AES 256应该有256位密钥。如果您想使用密码,请使用hash('sha256', $passphrase, true)
。最后的true
使得它返回结果为二进制,而不是十六进制编码,这很重要,因此您实际上可以在密钥中获得尽可能多的熵。
其次,初始化向量不应该重复使用。对于相同的密钥,md5(md5(key))
将始终生成相同的值。如果攻击者设法获得多个密文,这会大大削弱您的加密。