0

初めまして、すみません、簡単な問題かもしれませんが、暗号化の方法が分からなくて困ってます..

次の関数を使用して暗号化/復号化しています。

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

1 に答える 1

0

それは非常に奇妙な問題のようです。

明確な答えはありませんが、いくつか試してみてください。

  1. データベースにアクセスせずに暗号化/復号化します。問題が解消された場合は、暗号化機能を介して出力された文字を処理するデータベースに問題があります。
  2. 値を暗号化する前にトリミングします。問題が解決した場合は、暗号化のトリムが間違っています。
  3. safe_encodeおよびコードを削除しsafe_decodeます。問題が解決した場合、これらの関数は重要なものを追加/削除しています。

複数の問題が発生する可能性があるため、上記のすべてを一度に行うことが重要です。上記の手順で問題が解決した場合は、一度に 1 つずつ再導入して、問題の原因を特定します。

于 2013-01-07T11:20:54.023 に答える