3

次のようなコードで対称復号化を使用しようとしています。

$encrypted = base64_decode($encryptedBase64String);
$returnText = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, key, $encrypted, MCRYPT_MODE_CBC, iv);

そして、私は奇妙な結果に遭遇します(誰も質問しなかったように)。mcrypt_decryptパディングされた文字の数に等しいバイト値で満たされたパディングでメソッドが復号化されたテキストを返す理由がわかりません。PHPマニュアルによると、メソッドはその戻り値をゼロ値のバイトで埋める必要があります。

それを明確にするために、以下に 2 つの例を示します。

[上記の pad の呼び出しはmcrypt_decrypt、長さ 32 の文字列を返します]

例 1

プレーンテキスト = 'テキスト'

「テキスト」の長さは 4 であるため、パディングのサイズは 28 文字 (32 - 4) です。

したがって、次のように returnText を受け取ります。

{\116\101\120\116\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28}

例 2

「12345678901234567890」

長さ = 20

{\49\50\51\52\53\54\55\56\57\48\49\50\51\52\53\54\55\56\57\48\12\12\12\12\12\12\12\12\12\12\12\12}

変更するにはどうすればよいですか?パディングはnullではないため、メソッド rtrim("\0") でパディングを削除すると問題が発生します。

4

1 に答える 1

9

暗号化する文字列の長さが適切でない場合、 smcrypt_encryptでパディングし\0ます。あなたが解読しようとしている文字列を暗号化した人は誰でも、最初に独自のパディングを追加したので、PHP はそれをパディングする必要はありませんでした。このタイプのパディングは と呼ばれPKCS7 paddingます。

それを削除するには、次のようなことを試すことができます(ここから盗まれました):

$strPad = ord($returnText[strlen($returnText)-1]);
$returnText = substr($returnText, 0, -$strPad);
于 2012-07-16T16:04:49.103 に答える