PHP从MCRYPT_MODE_ECB切换到AES-256-ECB

时间:2018-02-12 09:20:48

标签: php openssl mcrypt

我正在重写代码以与PHP 7.2兼容。旧代码是

public function encryptPasswordOld($password, $salt)
{
    $key = md5($salt);
    $result = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $password, MCRYPT_MODE_ECB);
    return base64_encode($result);
}

新代码应根据我的研究类似

public function encryptPasswordNew($password, $salt)
{
    $method = 'AES-256-ECB';
    $ivSize = openssl_cipher_iv_length($method);
    $iv = openssl_random_pseudo_bytes($ivSize);
    $key = md5($salt);
    $result = openssl_encrypt($password, $method, $key, OPENSSL_RAW_DATA, $iv);
    return base64_encode($result);
}

但是我尝试了openssl_encrypt选项的每个组合:OPENSSL_RAW_DATAOPENSSL_RAW_DATA | OPENSSL_ZERO_PADDINGOPENSSL_ZERO_PADDING0并且当旧方法返回时仍然会得到不同的结果

1 个答案:

答案 0 :(得分:0)

尝试在加密之前对值使用pkcs5padding。即

请记住,块大小应基于8字节,即8/16/24等。

function pkcs5_pad($text, $blocksize)
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr(0), $pad);
}

和加密选项应为OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,即

openssl_encrypt(pkcs5_pad($value, 16), 'aes-256-ecb', $aes_key, 3, '')