适当的PHP mcrypt加密方法?

时间:2011-09-16 18:15:06

标签: php mcrypt

好的,我尝试使用PHP mcrypt创建自己的加密/解密方法,当我稍后发布它们时,有些人称它们为“垃圾”。他们提到了关于“初始化矢量”等的事情。基本上,我如何才能更好地使这些加密方法:

function encrypt($key, $data){
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT);
    return base64_encode($encrypted_data);
}

function decrypt($key, $encryptedData){
    $dec = base64_decode($encryptedData);
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT);
    return trim($decrypt);
}

我希望这些能够最好地发挥作用,除非我在mcrypt这个全新的世界中成为一只鸭子,欢迎任何建议,谢谢!

2 个答案:

答案 0 :(得分:3)

这是我使用的mcrypt函数的片段。他们使用mcrypt_genericmdecrypt_generic,应根据PHP manual使用。

function encrypt($key, $data){
    $b = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($enc), MCRYPT_DEV_URANDOM);
    mcrypt_generic_init($enc, md5($key), $iv);

    // PKCS7 Padding from: https://gist.github.com/1077723
    $dataPad = $b-(strlen($data)%$b);
    $data .= str_repeat(chr($dataPad), $dataPad);

    $encrypted_data = mcrypt_generic($enc, $data);

    mcrypt_generic_deinit($enc);
    mcrypt_module_close($enc);

    return array(
        'data' => base64_encode($encrypted_data),
        'iv' => base64_encode($iv)
    );
}

function decrypt($key, $iv, $encryptedData){
    $iv = base64_decode($iv);
    $enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
    mcrypt_generic_init($enc, md5($key), $iv);

    $encryptedData = base64_decode($encryptedData);
    $data = mdecrypt_generic($enc, $encryptedData);
    mcrypt_generic_deinit($enc);
    mcrypt_module_close($enc);

    // PKCS7 Padding from: https://gist.github.com/1077723
    $dataPad = ord($data[strlen($data)-1]);

    return substr($data, 0, -$dataPad);
}

我对mcrypt也不太了解,所以我只是在一起攻击这些。我md5键,所以总是32个字符(最大键长),我随机计算一个“初始化矢量”。

使用PKCS7 Padding更好,因为你可以拥有以空格结尾的字符串(因为trim会删除它),当字符串是一定长度时加密也会更有效。

我在这里使用AES 256(MCRYPT_RIJNDAEL_256),但AES 192(MCRYPT_RIJNDAEL_192)也可以使用。

演示:http://ideone.com/WA5Tk

答案 1 :(得分:2)

您可以使用适当的加密模式大小创建mcrypt_create_iv()的静脉注射。

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_192, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);

然后将其作为可选的第五个参数传递给mcrypt_cbc()。我在此处对原始函数所做的唯一更改是传递$iv

function encrypt($key, $data, $iv){
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT, $iv);
    return base64_encode($encrypted_data);
}

function decrypt($key, $encryptedData, $iv){
    $dec = base64_decode($encryptedData);
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT, $iv);
    return trim($decrypt);
}