4

サーバーから返されたphpでデータをデコードしようとしています:データAES 256がデコードされ、PKCS7パディングがあることは知っていますが、どのブロックモードを使用しているかわかりません

ここに私のphp関数があります:

public function decode($data)
{
    //AES decode
    $iv = mcrypt_create_iv(GEServerConnection::FBENCRYPT_BLOCK_SIZE, MCRYPT_RAND);
    $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->cryptKey, base64_decode($data), MCRYPT_MODE_ECB, $iv);

    //return $data;
    $len = strlen($data);
    $pad = ord($data[$len - 1]);

    return substr($data, 0, - $pad);
}

およびエンコードされたデータの例

3KD+zb/2u5gGEWvOy0Q0nSQE9pbQZmg27iN6WLiO/Af9YjN8MhHOb8TMa5uETaab

ECB (MCRYPT_MODE_ECB) でデコードすると、データの先頭のみがデコードされ、残りは読み取れません

"Please input yo��޸̓��g|��*P�Te���  R�B

CBC(MCRYPT_MODE_CBC)モードでデコードすると、読み取り不能になり始めます

��0�=v������.3ur username and password again"

結果は次のようになります(Objective-CでCommonCryptorを使用してMacで取得したもの):

"Please input your username and password again"

誰かが何が間違っているか、正しい方法でデコードする方法を知っていますか?

4

1 に答える 1

6

ウィキペディアの記事をご覧ください。ECB と CBC がどのように復号化を行うかをご覧ください。ECB が使用されたモードである場合、すべてのテキストを正しく復号化できます。以前の暗号文+現在の暗号文+復号化関数を使って原文を取得していることから、暗号はCBCを使ったものと思われます。これが、2 番目のブロックを正しくデコードした理由です。

では、なぜ最初のブロックのデコードが間違っているのでしょうか? これは、正しい初期化ベクトルを提供する必要があるためです。暗号化に使用されたものと同じでなければなりません。ECB は初期化ベクトルを使用しないため、ECB が最初のブロックをデコードしたことを知っていることは幸運です。

答えは簡単です。ランダム IV が最初のブロックを間違った出力に変更したため、CBC をゼロの初期化ベクトル (すべてのバイトがゼロ) で使用します。

于 2015-06-07T15:41:13.687 に答える