1

我制作了一个加密函数,它加密一个简单的值并将其存储在数据库中。下面是加密和解密的代码:

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���������

我得到所有这些问号是有原因的还是有办法摆脱它们?

4

2 回答 2

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");
}
于 2012-10-25T10:58:07.997 回答
-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;
}

当然你可以hex2bin()在 PHP 中使用,这个自定义代码是为了与Java类似平台兼容。我这样做。可能你可以试一试。

谢谢

于 2012-10-25T10:56:25.373 回答