gpt4 book ai didi

javascript - java加密aes值和javascript加密值不匹配

转载 作者:行者123 更新时间:2023-11-30 21:18:13 25 4
gpt4 key购买 nike

我有 java 代码可以为我生成 aes 加密代码,现在我正尝试在使用 crypto-js 的 javascript 上使用它,但是两种代码都提供了不同的 key ,我不知道为什么以及如何获得相同的 key ,这是我的代码

public static String encrypt(String text, byte[] iv, byte[] key)throws Exception{ 

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
System.out.println("KEY SPECCCC: "+keySpec);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);
byte [] results = cipher.doFinal(text.getBytes("UTF-8"));
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(results);
}

JavaScript 代码

  require(["crypto-js/core", "crypto-js/aes"], function (CryptoJS, AES) {
ciphertext = CryptoJS.AES.encrypt(JSON.stringify(jsondata),
arr.toString(),arr.toString());
});

字符串转utf-8

var utf8 = unescape(encodeURIComponent(key));
var arr = [];
for (var i = 0; i < utf8.length; i++) {
arr.push(utf8.charCodeAt(i));
}

最佳答案

首先,即使您的代码工作正常,您也无法正确解密它,因为当您在 Java 中创建 AES 密码时,您使用的是 CBC 密码,并且您正在实现 PKCS5Padding 填充算法。因此,您的 Java 代码执行以下操作;当它得到输入时,它首先将它分成 16 位 block ,然后如果你的输入没有分成 16 个整体,那么提醒将被填充以用相同数量的提醒填充 block 。你可以通过以下理解我的意思图片。

enter image description here

因此它将在 Java 端使用填充密码进行加密,但在 Javascript 部分您既不声明 Aes 将使用什么类型的模式,也不声明它应该使用什么类型的填充。因此,您应该将这些值添加到您的代码中。您可以搜索以下代码部分。

                        mode:CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7

关于它出现的不同 key ,因为您将一个 Byte[] 发送到您的 Encrypt 方法,然后在您创建 key 时使用这个未知的 Byte[]。您没有提到为什么您的加密方法将用于您的程序,但您应该在两种方法中以相同的方式创建该“字节 [] key ”。例如,您可以引用以下代码作为生成该代码的示例,但它不是生成 key 的安全方式我只是添加它来向您展示我的内容意思是您应该以相同的方式生成两个 key 。

    //DONT USE THIS IMPLEMENTATION SINCE IT IS NOT SAFE!
byte[] key = (username + password).getBytes("UTF-8");

关于javascript - java加密aes值和javascript加密值不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45462400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com