AES javascript 加密和 Java 解密

AES javascript encryption and Java decryption

我已经在 javascrypt 中实现了 RSA 加密,在 java 中实现了 RSA 解密,这只是一个简单的过程。但问题是我必须一次性加密大量数据,这对于 RSA 来说是不可能的,要么我必须拆分要加密的数据(这会使过程复杂化),要么将 AES 与 RSA 加密和解密一起使用.所以我选择了使用 AES 和 RSA 加密和解密。

这是我的java使用 Crypto-js 的脚本代码

<script src="rollups/aes.js"></script>
<script src="components/enc-base64-min.js"></script>
<script type="text/javascript" src="rollups/jquery-min.js"></script>
<script type="text/javascript">
    var secretPass = CryptoJS.lib.WordArray.random(16);
    var message = "<username>user</username><password>password</password>";
    var encrypted = CryptoJS.AES.encrypt(message, CryptoJS.enc.Hex.stringify(secretPass));
    var encode = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
    var secretPasses = CryptoJS.enc.Hex.stringify(secretPass);
    console.log('encrypted: ',encrypted);
    console.log('secretPasses: ',secretPasses);
    console.log('encode: ',encode);
    $.ajax({
            url: 'encryption',
            type: 'POST',
            data: {
                encode: encode,
                secretPasses: secretPasses
            },
            success: function(data) {
                console.log('success');
            },
            failure: function(data) {
                console.log('failure');
            }
        });
    </script>

输出为Jsp

encrypted: U2FsdGVkX192e9xprFPyuWu3Rxv2+CDMXiu2/TtNDwExvo4Dstx1mbqCHgds27Ng7zhYayVLjifeG15cuHI7hHfmEWvVeo7DDmOUsZmQAEM=
secretPasses: 23f96d28ae9f9c1c8c37050f79acdb37
encode: a7dHG/b4IMxeK7b9O00PATG+jgOy3HWZuoIeB2zbs2DvOFhrJUuOJ94bXly4cjuEd+YRa9V6jsMOY5SxmZAAQw==

在我的 post servlet 方法中,我使用 sysout 检查接收到的数据是否相同。我得到的秘密通行证是一样的,编码数据也是一样的。问题是,在进行从加密到编码的转换时,编码数据在 jsp 本身中改变了它的形式。我试图通过 ajax 直接传递 "encrypted",但这是指向错误,如果我输入 "alert(typepof encrypted);",它会提示为 "Object"。如何将原始加密数据传递给servlet?

System.out.println("secretpasses: "+request.getParameter("secretPasses"));
System.out.println("encode: "+request.getParameter("encode"));

Java 中的输出:

secretpasses: 23f96d28ae9f9c1c8c37050f79acdb37
encode: a7dHG/b4IMxeK7b9O00PATG+jgOy3HWZuoIeB2zbs2DvOFhrJUuOJ94bXly4cjuEd+YRa9V6jsMOY5SxmZAAQw==

另外,如果我能在 Java 脚本中获得一些 AES 加密示例,在 Java 中获得一些示例,我们将不胜感激。我通知它是带有 RSA 加密和解密的 AES,但它没有插入到当前代码中。如果我能让 AES 部分正常工作,我就可以通过加密 AEs 密钥来适当地执行 RSA。

您不能直接将 encrypted 传递给后端,因为它是一个对象,其中包含密文和一些本机 CryptoJS 格式的其他重要数据。如果不做一些工作,就没有简单的方法可以在 Java 中表示这个对象。

然而,您可以通过调用 toString() 函数从该对象生成一个字符串。这将为您提供一个可以通过 ajax 发送的 OpenSSL formatted 字符串。虽然您当然可以在 Java 中解析此字符串以获得解密它的必要信息,但直接将 ciphertextsalt 参数传递给后端可能更容易。

请参阅 here 如何使用它们进行解密。请注意 saltpassword 不仅导出密钥,还导出 IV。

另一种可能性是通过利用 CryptoJS 和 Java 中的 PBKDF2 来使用更好的密码派生。有关这方面的一些示例,请参阅 here