4

例:

$data = "Test Data\x00\x00";
echo strlen($data);

$key = "mykey";
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, MD5($key, true), $data, MCRYPT_MODE_ECB);
echo strlen($encrypted);

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, MD5($key, true), $encrypted, MCRYPT_MODE_ECB);
echo strlen($decrypted);

$newData = rtrim($decrypted,"\x00");
echo strlen($newData);

出力:

11
16
16
9  <-- I want 11 here

それで、暗号化の前にすでにヌルが埋め込まれている可能性のあるデータを復号化し、正しい長さのデータを取り戻す方法はありますか?

4

1 に答える 1

5

これは、暗号化するときにデータが特定のサイズである必要があるためです。あなたのデータはそれよりも小さいので、パディングされています。PHP はデータに NULL 文字を埋め込むため、 を実行すると、NULL と PHP で追加されたものの両方rtrimが削除されます。

1 つの解決策は、別の方法を使用してデータを正しい長さにパディングすることです。私は個人的にPKCS7 paddingを使用しています。

このパディング方法の使用方法の例を次に示します ( https://gist.github.com/1077723から適応):

$data = "Test Data\x00\x00";

$key = "mykey";

$blocksize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);

// PKCS7 Padding
$pad = $blocksize - (strlen($data) % $blocksize);
$data .= str_repeat(chr($pad), $pad);

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, MD5($key, true), $data, MCRYPT_MODE_ECB);

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, MD5($key, true), $encrypted, MCRYPT_MODE_ECB);

// PKCS7 Padding
$strPad = ord($decrypted[strlen($decrypted)-1]);
$newData = substr($decrypted, 0, -$strPad);

デモ: http://ideone.com/bMZxyf

于 2013-01-15T20:50:45.117 に答える