【发布时间】:2015-04-06 02:52:39
【问题描述】:
我正在尝试使用mcrypt 进行加密/解密例程,但它似乎弄乱了我试图加密的数据。
代码如下:
$data = 'Some important data';
$key = "mycryptKey";
$cipher = "rijndael-128";
$encryptedData = mcrypt_encrypt($cipher, $key, $data, MCRYPT_MODE_ECB);
$decryptedData = mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB);
var_dump($data); //string 'Some important data' (length=19)
var_dump($encryptedData); //string '™ì{*¾xv-&n5’Œü½Ýëc®n)mSƒ7]' (length=32)
var_dump($decryptedData); //string 'Some important data�������������' (length=32)
它不断在原始字符串的末尾添加这些字符。 我在How do you Encrypt and Decrypt a PHP String? 看到了一个例子,但它不起作用
这是实际测试。我使用的密钥和数据与此处发布的相同
编辑
我意识到,在@jonhopkins 评论之后,mcrypt 在 $data 内容之后填充了一些“\0”字符,所以我在解密后使用“strtok”对其进行了清理:
$decryptedData = \strtok( mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB), "\0" );
var_dump($decryptedData); //string 'Some important data' (length=19)
【问题讨论】:
-
如果我不得不猜测,我会猜测加密方法是自动填充字符串。 IIRC rijndael-128 要求其输入的长度为 16 的倍数,因此
mcrypt_encrypt用 0 填充最多 32 个字节,但我想mcrypt_decrypt无法确定原始长度,所以它留下了那些额外的字节。 -
你是个天才@jonhopkins!但这是另一个问题:如果我必须在传递给 mcrypt 之前对其进行修改,我应该如何返回相同的数据?
-
这是一个很好的问题,我希望我知道答案......我什至不能 100% 确定这就是正在发生的事情。但如果我能找到任何东西,我会告诉你的。编辑:stackoverflow.com/q/20507050 这可能会有所帮助
-
得到了答案:leaseweblabs.com/2014/02/aes-php-mcrypt-key-padding 并更新了我的问题。再次感谢@jonhopkins
-
我稍后再看看。感谢您的提示@Ja͢ck
标签: php encryption mcrypt