java - AES javascript加密和Java解密

标签 java javascript encryption encoding cryptography

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

这是我使用 Crypto-js 的 javascript 代码

<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==

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

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

Java 输出:

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

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

最佳答案

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

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

参见 here它们如何用于解密。请注意,saltpassword 不仅可以导出 key ,还可以导出 IV。

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

关于java - AES javascript加密和Java解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28252990/

相关文章:

java - 如何在 Java 注释中初始化一个类?

java - 使用列表迭代器访问对象的方法

javascript - 当我们运行 2 个或多个项目时无法创建新的 session ID

c# - 将 RSA 私钥存储在文件中

sql-server - 如何通过powershell关闭数据库加密

c++ - 如何在 C++ 中向 BYTE 数组添加填充?

java - 将 Stream 包装到 Flux 时的事务处理

java - Spring Controller 中Post方法的请求体

javascript - 将对象拆分为数组

javascript - 链接到 JavaScript 的最佳方式