5

次の関数を使用して、サーバー上のデータを復号化します。

function decrypt($key, $text) {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}

ただし、ECBを使用しないことについて多くのことを読みました(そして、それが非推奨であることを知っているので、CBCに切り替えたいと思いました。モードを次のように切り替えるだけです:

function decrypt($key, $text) {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CBC, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND)));
}

ただし、機能しません。エラーは生成されませんが、返されるデータは暗号化されたままです。

私は何が欠けていますか?

更新されたコード - まだエラーがあります:

$key = "hello"; 

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);

function encrypt($key, $text) {
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}


function decrypt($key, $text) { 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
}


$text = 12345;

echo "Plain Number : " . $text . "<br><br>";

$encrypted = encrypt($key, $text);
echo "AES Number : " . $encrypted . "<br><br>";

echo "Plain Number : ". decrypt($key, $encrypted) . "<br><br>";

これは機能するはずですが、次のエラーが返されます。

ブロックサイズ

blocksize in> 警告: mcrypt_encrypt()

[function.mcrypt-encrypt]: IV パラメーターは、ブロックサイズ内のブロックサイズと同じ長さでなければなりません

ブロックサイズ

4

3 に答える 3

7

復号化するときは、暗号化したときと同じ IV を使用する必要があります。復号化中に新しいランダムな IV を生成しているようです。

IV を暗号文に追加または追加しても問題ありません。IV は秘密ではありませんが、暗号化されたメッセージごとに一意であり、一度だけ使用する必要があります。

于 2010-11-10T22:19:06.130 に答える
5

更新されたコードには$iv、それぞれのエンコード/デコード関数で使用できないグローバル変数であるという問題があります。

$key = "hello"; 

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);

function encrypt($key, $text, $iv) {
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}

function decrypt($key, $text, $iv) { 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
}

$text = 12345;

echo "Plain Number : " . $text . "<br><br>";

$encrypted = encrypt($key, $text, $iv);
echo "AES Number : " . $encrypted . "<br><br>";

echo "Plain Number : ". decrypt($key, $encrypted, $iv) . "<br><br>";

$ivまたは、グローバルをローカル関数スコープにインポートすることで、引き続きグローバルに依存できます。

function encrypt($key, $text) {
    global $iv; // or use $GLOBALS['iv] instead of $iv in the call below
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}

function decrypt($key, $text) { 
    global $iv; // or use $GLOBALS['iv] instead of $iv in the call below
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC, $iv));
}

ただし、これはコードをグローバル変数に結合するため、推奨される方法ではありません。

于 2010-11-11T08:09:05.727 に答える
3

このテキストも暗号化するときにモードを変更しましたか?

また、MCRYPT_MODE_CBC を使用する場合は、暗号化と復号化で同じキーと IV を使用する必要があります。無作為化 IV は CBC では機能しません。

于 2010-11-10T22:20:37.467 に答える