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」などの単純な値を暗号化して再度復号化すると、次の値が得られます。

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;
}

もちろん、PHP で使用することもできます。このカスタム コードは、同様のプラットフォームhex2bin()との互換性を保つためのものです。Java私はこのようにしています。試してみてもいいかもしれません。

ありがとう

于 2012-10-25T10:56:25.373 に答える