mcrypt搞乱数据

时间:2015-02-06 02:42:35

标签: php encryption mcrypt

我试图使用mcrypt创建一个crypt / decrypt例程,但它似乎弄乱了我试图加密的数据。

下面是代码:

    $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正在填充一些" \ 0" $ data 内容之后的字符,所以我使用' strtok'

进行解密后进行清理
$decryptedData = \strtok( mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB), "\0" );
var_dump($decryptedData); //string 'Some important data' (length=19)

1 个答案:

答案 0 :(得分:1)

你在这里缺少的是填充物;必须首先填充要加密的数据:

$data = pkcs7_pad($data, 16);

同样,解密后你需要反转填充:

$decryptedData = pkcs7_unpad($decryptedData, 16);

使用的功能:

function pkcs7_unpad($data)
{
    return substr($data, 0, -ord($data[strlen($data) - 1]));
}

function pkcs7_pad($data, $size)
{
    $length = $size - strlen($data) % $size;
    return $data . str_repeat(chr($length), $length);
}

另外,重要的是要注意mcrypt扩展相当陈旧且维护得不好;我建议改用OpenSSL。有关完整示例,请参阅我的earlier answer