2011-12-08 18 views
2

json_decodeでjsonコードを実行すると正常に動作しますが、mcryptで暗号化してurlencodeでエンコードしてからデコードと復号化を行うと動作しません。PHP:urldecodeとmcryptを使用しているときにJSONが機能しない

何が間違っているのか分かりますか?

復号化されたjsonは、暗号化される前にjsonとまったく同じように見えます。

マイコード:

<? 
    $json = '{"entry1":{"name":"bob","age":"15"},"entry2":{"name":"bill","age":"50"}}'; 

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $key = "abcdefghijkl"; 
    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $json, MCRYPT_MODE_ECB, $iv); 
    $urlencoded = urlencode($encrypted); 
    $urldecoded = urldecode($urlencoded); 
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $urldecoded, MCRYPT_MODE_ECB, $iv); 

    // json and decrypted json comparison 
    echo "<h3>JSON & Decrypted JSON look the same:</h3>"; 
    echo $json . " // json<br>"; 
    echo $decrypted . " // decrypted json<br>"; 

    // json - works! 
    echo "<h3>JSON works:</h3>"; 
    $data = json_decode($json); 
    $i = 1; 

    while ($i <= 2) { 
     $entrynumber = "entry" . $i; 
     echo "name ----- " . $data->$entrynumber->name . "<br>"; 
     echo "age ------- " . $data->$entrynumber->age . "<br>"; 
     $i++; 
    } 

    // decrypted json - doesnt work! 
    echo "<h3>Decrypted JSON doesnt work:</h3>"; 
    $data = json_decode($decrypted); 
    $i = 1; 

    while ($i <= 2) { 
     $entrynumber = "entry" . $i; 
     echo "name ----- " . $data->$entrynumber->name . "<br>"; 
     echo "age ------- " . $data->$entrynumber->age . "<br>"; 
     $i++; 
    } 
?> 

あなたがPHPのドキュメントにそのコードを貼り付ける場合は、私が何を意味するかが表示されます。

スクリーンショット:

enter image description here

+1

「それは動作しません」良いエラーの説明* *ことはありません。何が間違っているのか、どのようなエラーメッセージが出るのかなどを記述してください。 –

+0

私は説明しました、PHPのコメントを見てください。 – supercoolville

+0

ブラウザのスクリーンショットではなくHTMLを貼り付けることができますか?暗号化されたjson文字列に"などのHTMLエンティティが含まれているか、または何か – catchmeifyoutry

答えて

10

あなたの暗号化/復号化アルゴリズムは、ブロックサイズに合わせてパディングを追加しています。次の例のように、端からNULLで文字を削除する必要があります。

rtrim($decrypted, "\0");

+0

とありがとうございました!!!!!!!!!! – supercoolville

+0

ありがとうございます!私は今朝これを理解しようとしてきました。 –

+0

ちょうど頭が上がると、あなたのアプリケーションはパッディングのoracle攻撃にさらされます。あなたは暗号化の前に平文でPKCS7のパディング戦略を使用する方がずっと優れています。 –

3

いくつかのトラブルシューティングを行なったし、これは私が得たものである:

URLエンコード/デコードは問題ではありません。符号化前と復号後の文字列は同じです:符号化前の

string 'è?¡OùpU4ˆß•ý£ÉGÒô½åLqe 2w¨”—Ô¢§|MþWþxÎZ±8“єЩɓ ŽšÁkèíSòøÓ€¥ðÒ(³!§¬žIê\&' (length=96) 

デコードした後:

string 'è?¡OùpU4ˆß•ý£ÉGÒô½åLqe 2w¨”—Ô¢§|MþWþxÎZ±8“єЩɓ ŽšÁkèíSòøÓ€¥ðÒ(³!§¬žIê\&' (length=96) 

問題は、暗号化/復号化プロセスです。

string '{"entry1":{"name":"bob","age":"15"},"entry2":{"name":"bill","age":"50"}}' (length=72) 

JSON文字列を復号化した後:暗号化する前に

JSON文字列

string '{"entry1":{"name":"bob","age":"15"},"entry2":{"name":"bill","age":"50"}}������������������������' (length=96) 

は末尾に追加余分な文字化けを参照してください。

あなたが文字化けをトリミングするためにこれを行う場合は、あなたのJSONは罰金デコードし復号化した後:

json_decode(substr($decrypted,0,72)); 

私はmcryptに非常に精通していないよ、そううまくいけば、誰かがあなたがしている理由を把握することができます最後に追加の文字を取得します。

+0

ありがとうございます。 – supercoolville

関連する問題