0

几个网站上有一个 mcrypt 片段:

https://stackoverflow.com/a/11538728/408872

http://www.binrand.com/post/3810303-mcrypt-md5-how-to-create-an-online-encryption-decryption-web-page.html

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 上引入了额外的空格?

4

1 回答 1

2

您提供的所有资源都使用几乎完全相同的代码。我只能假设他们从彼此那里窃取了代码。所以这不是几个站点这样做,很可能是一个站点,而其他不真正了解发生了什么的人只是继承了这个。

在加密之前没有充分的理由在字符串中添加额外的空格,它不会以任何方式增强密码学的强度,也不会使其“更好”。

我的猜测是,在这些示例中,已经完成了类似的功能trim不会影响加密流的内容。(我个人不明白为什么需要证明这一点——这对我来说似乎完全合乎逻辑)

如果您正在接受 base64 编码的加密数据(可能来自表单提交),您很可能会修剪提交的数据以删除用户留在其中的任何谷壳,我怀疑某处有人担心修剪加密数据会破坏原始明文。

编辑:

请注意,如果此字符串不是 base64 编码的,则完全有可能损坏密文。由于密文将以二进制形式表示,因此它的末尾可能会有空白字符,这些字符可能会被修剪掉,从而导致损坏。

编辑2:

md5(key)对于密钥,md5(md5(key))对于初始化向量都是非常糟糕的实现方式。

首先,AES 256 应该有一个 256 位的密钥。如果要使用密码,请使用hash('sha256', $passphrase, true). finaltrue使它以二进制而不是十六进制编码的形式返回结果,这很重要,因此您实际上可以在密钥中获得尽可能多的熵。

其次,初始化向量永远不应该被重复使用md5(md5(key))对于相同的键,将始终产生相同的值。如果攻击者设法获得多个密文,这会大大削弱您的加密。

于 2012-11-21T12:37:04.117 回答