douniuta4783
2014-01-17 08:01
浏览 174

AES-256-CBC Mcrypt-PHP解密和Crypto-JS加密

I am trying to encrypt in Javascript with CryptoJS and decrypt in PHP. The JS code is:

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);

And the PHP is as follows:

$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);  

This does not return the correct answer.

I am unsure where things are going poorly! I need to do my own IV, but if I do just say:

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);

It DOES successfully work in the PHP code -- only the key_base64 isn't something that can be changed, it has to be what the user remembers... And then it gives me a salt to get a key from the passphrase entered and IDK how it managed to get that using CryptoJS

图片转代码服务由CSDN问答提供 功能建议

我正在尝试使用CryptoJS在Javascript中加密并在PHP中解密。 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');  //刚刚选择了一个例子,通常也是随机的
 
enenpted = 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);  
   
 
 

这不会返回正确的答案。

我不确定哪些方面的情况很糟糕! 我需要做自己的IV,但如果我只是说:

  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代码中成功运行 - 只有key_base64不是可以更改的东西,它必须是用户记住的...然后它给出 我输入密码来获取密钥,以及IDK如何使用CryptoJS获取密钥

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dpo15099 2014-01-20 05:58
    已采纳

    Your code WILL work if you just fix a few typos there

    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 " );
    
    已采纳该答案
    打赏 评论

相关推荐 更多相似问题