【问题标题】:mcrypt messing with datamcrypt 搞乱数据
【发布时间】: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


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 2020-04-22
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多