2014-01-17 109 views
7

私はJavascriptでCryptoJSで暗号化し、PHPで解読しようとしています。 JSコードは次のとおりです。AES-256-CBC Mcrypt-PHP解読とCrypto-JS暗号化

var salt = CryptoJS.lib.WordArray.random(128/8); 
var key256Bits500Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32, iterations: 500 }); 
var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); // just chosen for an example, usually random as well 

encrypted = CryptoJS.AES.encrypt("Message", key512Bits1000Iterations, { iv: iv }); 
var data_base64 = crypted.ciphertext.toString(CryptoJS.enc.Base64); 
var iv_base64 = crypted.iv.toString(CryptoJS.enc.Base64); 
var key_base64 = crypted.key.toString(CryptoJS.enc.Base64); 

、次のようにPHPは次のとおりです。

$encrypted = base64_decode($data_base64); 
$iv = base64_decode($iv_base64); 
$key = base64_decode($key_base64); 

    $plaintext = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv); 
echo ($plaintext); 

これは正しい答えを返しません。

状況が悪いとわかりません。 - のみkey_base64を変更することができるものではありません、それは何をしなければなら

CryptoJS.AES.Encrypt("Message", "Secret Passphrase"); 
var data_base64 = crypted.ciphertext.toString(CryptoJS.enc.Base64); 
var iv_base64 = crypted.iv.toString(CryptoJS.enc.Base64); 
var key_base64 = crypted.key.toString(CryptoJS.enc.Base64); 

それが正常にPHPのコードで動作します:私はちょうど言うのならば、私は自分のIVを行う必要がありますが、ユーザーが覚えている...そして、それは、入力したパスフレーズからキーを取得し、それはあなたがちょうどそこ

をいくつかのタイプミスを修正した場合CryptoJS

を使用して

答えて

14

あなたのコードが動作することを得ることができたかIDKする私に塩を与えますJS

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 
    <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script> 
    <script> 
     var salt = CryptoJS.lib.WordArray.random(128/8); 
     var key256Bits500Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32, iterations: 500 }); 
     var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); // just chosen for an example, usually random as well 

     var encrypted = CryptoJS.AES.encrypt("Message", key256Bits500Iterations, { iv: iv }); 
     var data_base64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64); 
     var iv_base64 = encrypted.iv.toString(CryptoJS.enc.Base64);  
     var key_base64 = encrypted.key.toString(CryptoJS.enc.Base64); 
    </script> 

PHP

<?php 
     $encrypted = base64_decode("data_base64"); // data_base64 from JS 
     $iv  = base64_decode("iv_base64"); // iv_base64 from JS 
     $key  = base64_decode("key_base64"); // key_base64 from JS 

     $plaintext = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv), "\t\0 "); 
+0

これは私がPHP側 – Paul

+0

ワークス[=私はそんなに怒っ作ら。これは、コードバとクライアントサーバーのモバイルアプリです。私はちょうどsqliteのデータを読み取ることができない必要があるので、私は暗号化と復号化のためにクライアント側でちょうど前にcryptoJSを使用します。私はそれがインターネット経由で転送中にそれを読むことができないようにサーバー側のデータを暗号化する必要があります。だから私はあなたの答えの反対だと思う。あなたはそれを解決するために私を助けることができます。正直なところ私はまだaes暗号では理解できません。私はちょうどcryptoJSで暗号化と復号化にパスフレーズを使用しています。私はivと塩が何であるか知りません。前もって感謝します。 –

+0

@Shuricをトリミングする文字のリストにN '、 '\ rを\を追加​​しましたが、私はプロジェクトがcryptoJSを使用する必要があり、 –

関連する問題