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

            
        

    

参考:AES-256-CBC Mcrypt-PHP decrypt and Crypto-JS Encrypt

我尝试使用Shurik提供的代码来获得有效的示例,但无法使其正常工作。

谢谢你的帮助。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Encrypt with javascript and decrypt using php</title>
    <meta name="generator" content="BBEdit 10.5" />

    <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>
        function encrypt_me(obj)
        {
            // alert(obj.input_value.value);

            var input_value = document.getElementById("input_value").value;
            // alert(input_value);

            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(input_value+"_Messsage", 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);

            document.getElementById("data_base64").value = data_base64;
            document.getElementById("iv_base64").value = iv_base64;
            document.getElementById("key_base64").value = key_base64;
            document.getElementById("encrypted_value").value = encrypted;
        }
    </script>
</head>
<body>
    <?php

        $mode = 'text';     // choices {"text", "hidden"}
        if(isset($_POST['submit']))
        {
            echo('<pre>'.print_r($_POST, true).'</pre>');

            $input_value = $_POST['input_value'];
            $encrypted_value = $_POST['encrypted_value'];
            $decrypted_value = $_POST['decrypted_value'];

            $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

            $decrypted_value = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted_value, MCRYPT_MODE_CBC, $iv ), "\t\0 " );
            echo ("\$decrypted_value : ".$decrypted_value."<br />");
        }
        else
        {
            $input_value = "";
            $encrypted_value = "";
            $decrypted_value = "";

            $encrypted = "";
            $iv = "";
            $key = "";
            $plaintext = "";
        }
    ?>
    <form action="sample_encrypt.php" method="post" name="main_form" id="main_form">

        input_value : <input type="text" id="input_value" name="input_value" value="<?=$input_value?>" size="100"><br />
        encrypted_value : <input type="text" id="encrypted_value" name="encrypted_value" value="<?=$encrypted_value?>" size="100"><br />
        decrypted_value : <input type="text" id="decrypted_value" name="decrypted_value" value="<?=$decrypted_value?>" size="100"><br />
        <br />
        data_base64 : <input type="<?=$mode?>" id="data_base64" name="data_base64" value="<?=$encrypted?>" size="100"><br />
        iv_base64   : <input type="<?=$mode?>" id="iv_base64" name="iv_base64" value="<?=$iv?>" size="100"><br />
        key_base64  : <input type="<?=$mode?>" id="key_base64" name="key_base64" value="<?=$key?>" size="100"><br />

        <input type="button" id="no_submit" name="no_submit" value="Encrypt" onclick="encrypt_me(this.form);">
        <br />
        <input type="submit" id="submit" name="submit" value="Decrypt">
    </form>
</body>
</html>

参考方案

您需要更改三件事才能使其正常工作。

首先,由于您使用的是128位AES,因此密钥必须为128位:

var key256Bits500Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 128/32, iterations: 500 });

注意,我将keySize从256/32更改为128/32。

接下来,您需要从输入中获取加密的iv和密钥:

$encrypted = base64_decode($_POST["data_base64"]); // data_base64 from JS
$iv        = base64_decode($_POST["iv_base64"]);   // iv_base64 from JS
$key       = base64_decode($_POST["key_base64"]);  // key_base64 from JS

注意,我在字符串周围添加了$ _POST [...]。

最后,您应该对base64解码加密的值。

$encrypted_value = base64_decode($_POST['encrypted_value']);

完整参见代码here。

Mongo汇总 - javascript

我的收藏中有以下文件{ "_id": ObjectId("54490b8104f7142f22ecc97f"), "title": "Sample1", "slug": "samplenews", "cat": …

编码JSON数据以保留json格式 - javascript

由于JSON值是动态生成的,并且其中的值是基于用户输入的,因此,如果用户在字符串中输入了不可接受的字符(如"),则会使json无效。就像是:{ "tag" : "demo", "value": "user " input" } 有没有一种方法可以编码或转义JS…

Django将数据发送到模板中的Javascript - javascript

我想为提取的文档之间的某些链接制作一个非常简单的网络图,并将其显示在现有的Django应用程序中。我看过很多Bokeh / Django集成以及类似的东西,但似乎没有什么合适的。因此,我决定继续尝试D3。我不懂任何Javascript。我复制了此处提供的模板:http://bl.ocks.org/mbostock/2706022,这对我来说很好。我需要做的就…

执行onclick时获得意外令牌 - javascript

我正在使用onclick事件从PHP调用JS函数。这是我的代码:我在一个函数中,因此我需要通过PHP来完成它,因为然后我会返回:$html = '<input type="checkbox" checked value="1" id="setGetSku" name="se…

如何从客户端将数据插入数据库? - javascript

我是Web开发的初学者,可以访问cpanel上托管的网站,并且需要对其进行一些更改。这个网站的后端是由蛋糕PHP制作的,我想使用ajax从客户端将一些数据插入其数据库。问题是我不知道如何获取负责插入数据库的PHP文件的URL。参见下面的代码:var xhttp = newXMLHttpRequest(); xhttp.onreadystatechange= …