3

暗号化と復号化は成功しましたが、値を復号化すると、文字列の末尾に "���" という奇妙な文字が表示されます。イニシャル$_POST['value']に空白や変な文字はありません。

どうすればこれを解決できますか?

私はこれで暗号化します:

$key = 'my key';
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);        
$id = mcrypt_generic($td, $_POST['value']);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

私はこれで解読します:

$key = 'my key';
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$id = mdecrypt_generic($td, $_COOKIE['value']);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
4

5 に答える 5

6

使用されたブロックサイズに基づいて結果をパディングするだけです。rtrim() を使用すると、それらを取り除くことができます。

于 2010-09-28T15:57:19.520 に答える
3

これらは Unicode エンティティです。出力で utf8_decode() を試してください。

関連するクローズド PHP バグもあります

mcrypt は iso-8859-1 でも utf-8 でもないバイナリ出力を生成するため、そのデータがテキスト データではなくバイナリ データであることをデータベースに伝える必要があります。

この情報は、 mcrypt のサンプル ページでも見つかりました。

VB と PHP 内で暗号化/復号化できましたが、VB で暗号化して PHP で復号化しようとすると、mcrypt 関数だけで間違った値が得られました。

少なくとも VB9 では、ストリームの暗号化が 8 ビット ストリームに残っている不足バイト数の値である UTF char を使用することがわかりました。

したがって、1234 を暗号化すると、chr(4) が 4 回追加されます (失われたバイトの量)。私は物事を説明するのが苦手ですが、私が考え出したPHPコードは以下のとおりです。

于 2009-06-22T09:15:39.943 に答える
1

ecb モードではなく cfb モードに切り替えてから、暗号化と復号化の両方に同じ IV を使用するように関数を書き直してください。これを行う簡単な方法は、暗号化されたデータとともに IV を渡すことです (関数の最後に「return $encrypted_data」のようなものがあると仮定します。$encrypted_data 自体の代わりに $iv.$encrypted_data を返すことができます。次に substr() で IV を取得します)。私のために働いた。

于 2010-04-11T19:25:14.080 に答える
0

復号化されたテキストには、次の関数を使用します。

function pkcs5_unpad($text)
{
    $pad = ord($text{strlen($text)-1});
    if ($pad > strlen($text))
        return false;
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
        return false;
    return substr($text, 0, -1 * $pad);
}
于 2010-04-06T15:32:13.240 に答える
-1

NotVBからのものはPHP(暗号化)とPHP(復号化)からのもので、ページはUTF-8、データベースはUTF-8、接続はUTF-8です。

Notすべてからです。2 つのパスフレーズを暗号化します。最初のものには奇妙なキャラクターがあり、最後のものにはありません。すべての値は同じ からの POST<form>です。

于 2009-06-22T09:38:17.793 に答える