mcrypt 弄乱数据

mcrypt messing with data

我正在尝试使用 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 在 $data 内容之后填充了一些“\0”字符,所以我在解密后使用 [=32= 清理了它]:

$decryptedData = \strtok( mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB), "[=11=]" );
var_dump($decryptedData); //string 'Some important data' (length=19)

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

$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