【问题标题】:AES-256-CBC Mcrypt-PHP decrypt and Crypto-JS EncryptAES-256-CBC Mcrypt-PHP 解密和 Crypto-JS 加密
【发布时间】:2014-02-06 11:28:05
【问题描述】:

我正在尝试使用 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'); // 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);  

这不会返回正确的答案。

我不确定事情在哪里进展不顺利!我需要自己做静脉注射,但如果我这样做的话:

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 实现的

【问题讨论】:

    标签: javascript php encryption aes cryptojs


    【解决方案1】:

    如果你只是修正了一些错别字,你的代码就可以工作

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

    【讨论】:

    • 这让我很生气 =[
    • 有效,尽管我在字符列表中添加了\r\n 以修剪 PHP 端
    • @Shuric 我有一个项目使用cryptoJS。它是带有cordova的客户端服务器移动应用程序。我之前只在客户端使用cryptoJS进行加密和解密,因为我只需要无法读取sqlite数据。但我需要在服务器端加密数据,使其在通过互联网传输时不可读。所以我认为这与您的回答相反。所以你能帮我解决它吗?老实说,我仍然不了解 aes 加密,我只是在使用密码加密和解密时使用密码。我不知道 iv 和 salt 是什么。提前致谢。
    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 2014-09-12
    • 1970-01-01
    • 2021-06-07
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    相关资源
    最近更新 更多