使用 AES Crypto-JS 的加密和解密无法正常工作

Encryption and decryption with AES Crypto-JS does not work as it should

我有两个不同的 html 页面,在第一个页面中有一个表单,在提交时调用一个 Javascript 函数来加密两个不同的参数,然后将这两个参数发送到第二页,第一页 html 代码之后:

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Test Encrypt</title>

    <script type="text/javascript">


    /**
    Function to encrypt in AES tex
    **/
    function encText(plainText){

        var salt = CryptoJS.enc.Utf8.parse("12345678");

        var password = "test";
        var keyBits = CryptoJS.PBKDF2(password, salt, {
            hasher: CryptoJS.algo.SHA1,
            keySize: 8,
            iterations: 2048
        });
        console.log(keyBits.toString(CryptoJS.enc.Base64));

        var iv = CryptoJS.enc.Base64.parse("dGVzdGFhYTAxMjM1Njc4OQ==");

        var encrypted = CryptoJS.AES.encrypt(plainText, keyBits, {
            iv: iv,
            padding: CryptoJS.pad.Pkcs7,
            mode: CryptoJS.mode.CBC
        });

        //var decrypted = CryptoJS.AES.decrypt(encrypted, key).toString(CryptoJS.enc.Utf8);
        //var decrypted = encrypted.toString(CryptoJS.enc.Utf8)

        //var decrypted = CryptoJS.enc.Utf8.stringify(encrypted);
        return encrypted.toString();


    }

    function formEncrypt(){
        var name = document.getElementById("name").value;
        var surname = document.getElementById("surname").value;

        var encName = encText(name);
        var encSurname = encText(surname);

        document.getElementById("name").value = encName;
        document.getElementById("surname").value = encSurname;

    }

    </script>
</head>


<form action="/decrypt.php"  method="get" name="myForm">
    name: <input type="text" name="name" id="name"><br>
    surname: <input type="text" name="surname" id="surname"><br>
<input type="submit" value="Submit" onclick="formEncrypt()">

在使用 JavaScript 函数的第二页中,我尝试按照第二页的代码破译两个参数值:

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Decrypt</title>

    <?php
    echo '<script type="text/javascript">';
    echo 'var encName = \'' . base64_encode ( $_GET['name'] ). '\';';
    echo 'var encSurname = \'' . base64_encode ( $_GET['surname'] ) . '\';';
    echo '</script>';
    ?>

    <script type="text/javascript">

        function decText(encryptedText){

            //var message = CryptoJS.enc.Base64.parse(encryptedText);

            var salt = CryptoJS.enc.Utf8.parse("12345678");

            var password = "test";
            var keyBits = CryptoJS.PBKDF2(password, salt, {
                hasher: CryptoJS.algo.SHA1,
                keySize: 8,
                iterations: 2048
            });
            console.log(keyBits.toString(CryptoJS.enc.Base64));

            var iv = CryptoJS.enc.Base64.parse("dGVzdGFhYTAxMjM1Njc4OQ==");

            var result = CryptoJS.AES.decrypt(CryptoJS.enc.Base64.parse(encryptedText), keyBits, {
                iv: iv,
                padding: CryptoJS.pad.Pkcs7,
                mode: CryptoJS.mode.CBC
            });

            console.log(result.toString(CryptoJS.enc.Utf8));

            return result.toString(CryptoJS.enc.Utf8)
        }

        function yoo(){
            console.log(encName);
            console.log(encSurname);
            var name = decText(encName);
            var surname = decText(encSurname);
            $('#pName').text(name);
            $('#pSurname').text(surname);
            //document.getElementById("pName").value += name;
            //document.getElementById("pSurname").value += surname;
        }


    </script>


</head>
<body>

    <p>Yooooo</p>

    <p id="pName"> </p>
    <p id="pSurname"> </p>

    <button onclick="yoo()">clearText</button>

</body>

但是结果总是一个空字符串,我认为有错误,但我没有找到哪里。

要解码 base64 字符串,请将包含单词数组的解析对象传递给 Utf8 编码器的 stringify 函数。 CryptoJS.enc.Utf8.stringify(parsedObjectContainingWordArray)

const encName = '<?php echo base64_encode($_POST["surname"]); ?>';
const encSurname = '<?php echo base64_encode($_POST["name"]); ?>';

function decText(encryptedText) {
  const salt = CryptoJS.enc.Utf8.parse("12345678");
  const password = "test";
  const keyBits = CryptoJS.PBKDF2(password, salt, {
    hasher: CryptoJS.algo.SHA1,
    keySize: 8,
    iterations: 2048
  });
  const iv = CryptoJS.enc.Base64.parse("dGVzdGFhYTAxMjM1Njc4OQ==");
  const result = CryptoJS.AES.decrypt(
    // This here is where the action is. If the wrong value gets passed,
    // result turns out to be empty string.
    CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(encryptedText)),
    keyBits, {
      iv: iv,
      padding: CryptoJS.pad.Pkcs7,
      mode: CryptoJS.mode.CBC
    }
  );

  return result.toString(CryptoJS.enc.Utf8)
}

function yoo() {
  const nameNode = document.getElementById("pName");
  const surnameNode = document.getElementById("pSurname");
  nameNode.textContent = decText(encName);
  surnameNode.textContent = decText(encSurname);
}