初めまして、すみません、簡単な問題かもしれませんが、暗号化の方法が分からなくて困ってます..
次の関数を使用して暗号化/復号化しています。
private function encodemc($value,$skey){
if(!$value){return false;}
$skey = substr($skey, 2, 4);
$text = $value;
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $skey, $text, MCRYPT_MODE_ECB, $iv);
return trim($this->safe_encode($crypttext)); // safe_encode adds another encoding using `base64_encode`
}
private function decodemc($value,$skey){
if(!$value){return false;}
$skey = substr($skey, 2, 4);
$crypttext = $this->safe_decode($value);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $skey, $crypttext, MCRYPT_MODE_ECB, $iv);
return trim($decrypttext);
}
は次の$key
ようになります570c45546dwq45gjk191
。
暗号化する値を最初の関数に渡し、それをデータベースに保存してから、データベースから取得し、復号化して HTML テキストとして表示します。
問題は、一部のテキストが正しく復号化/暗号化されず、間違ったテキスト エンコーディングであるかのように html ページに表示されることです。
奇妙な点は、10 個の項目のうち、キーによっては 2 つまたは 3 つしか文字化けしていないことです。また、文字列の一部だけが文字化けすることもあります。
文字化けの原因はランダムな文字であることがわかりました。たとえば、上記のキーを使用するS
と、文字がコードを壊し、テキストが文字化けします。
それでsubstr($skey, 2, 4);
、キーに適用して、何かが変わったかどうかを確認しました。キーを変更すると、コードを壊す文字が異なることがわかりました。
しかし、長さ == 1 のキーを使用しても問題は解決しません。
何が問題なのですか?
編集:
残りのコードはこちら。
private function safe_encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_',''),$data);
return $data;
}
private function safe_decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return stripslashes(base64_decode($data));
}