PHP中的加密会留下不需要的字符

时间:2012-10-25 10:45:32

标签: php encryption

我已经创建了一个加密函数,它可以加密一个简单的值并将其存储在数据库中。以下是加密和解密的代码:

public function encrypt($string){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $value = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->key256, $string, MCRYPT_MODE_ECB, $iv);
    $value = base64_encode($value);
    return $value;
}

public function decrypt($string){
    $value = base64_decode($string);
    $value = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->key256, $value, MCRYPT_MODE_ECB);
    return $value;
}

当我加密一个简单的值时,例如迈克尔'并再次解密,我得到了值:

Michael���������

我有没有理由得到所有这些问号或摆脱它们的方法?

2 个答案:

答案 0 :(得分:7)

根据我的经验,这些额外字符是用于填充的NULL字节,在解密后保留。

您应该尝试将decrypt()功能更改为:

public function decrypt($string){
    $value = base64_decode($string);
    $value = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->key256, $value, MCRYPT_MODE_ECB);
    return trim($value, "\0");
}

答案 1 :(得分:-1)

使用bin2hex()代替bas64_encode(),您可以在解密前使用hex2bin()代替base64_decode()

protected function hex2bin($hexdata) 
{
 $bindata = '';
 for ($i = 0; $i < strlen($hexdata); $i += 2) {
 $bindata .= chr(hexdec(substr($hexdata, $i, 2)));
     }

  return $bindata;
}

当然,您可以在PHP中使用hex2bin()。此自定义代码用于与Java类平台兼容。 我是这样做的。也许你可以尝试一下。

由于