gpt4 book ai didi

java - AES/CBC/NoPadding 解密中的乱码输出

转载 作者:太空宇宙 更新时间:2023-11-04 07:00:31 24 4
gpt4 key购买 nike

我正在尝试解密使用 CryptoJS 加密的 java 文本。我在其他帖子中读到它们使用不同的默认模式和填充,因此我将它们(java/cryptojs)都设置为使用 aes/cbc/nopadding。我在 java 中不再遇到异常,但在解密过程中出现乱码输出

加密(JS):

var parsedLogin = JSON.parse(login);
var publicKey = "abcdefghijklmnio";
var publiciv = "abcdefghijklmnio";
var key = CryptoJS.enc.Hex.parse(publicKey);
var iv = CryptoJS.enc.Hex.parse(publiciv);
var encrypted = CryptoJS.AES.encrypt(parsedLogin.password, publicKey, {iv: publiciv}, { padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.CBC});

// send encrypted to POST request

解密(Java)

String PUBLIC_KEY = "abcdefghijklmnio";
String PUBLIC_IV = "abcdefghijklmnio";
byte[] byteArr = PUBLIC_KEY.getBytes();
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
final SecretKeySpec secretKey = new SecretKeySpec(byteArr, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(PUBLIC_IV.getBytes()));

byte[] parsed = Base64.decodeBase64(encrypted.getBytes());
//byte[] parsed = DatatypeConverter.parseBase64Binary(encrypted);

byte[] fin = cipher.doFinal(parsed);
String decryptedString = new String(fin);

我得到的结果是这样的:Š²Û!aå{’` @"Ûîñ?Œr~krÆ

我已经尝试将 getBytes() 中的 CHARSET 更改为 US-ASCII、UTF-8 和 UTF-16,但所做的只是更改乱码文本

我也尝试过使用其他阻塞模式和填充,但它们在 js 级别失败了。我现在只需要一个简单的加密方法。

注意:忽略安全问题...比如在 js 中公开 key 等。我稍后会处理这些问题..

最佳答案

除非密码始终为 16 字节,否则您不应该能够在没有填充的情况下使用 AES CBC。它可能应用某种默认填充,这可能是也可能不是一个好主意。

无论如何:你需要将你的 key 和 iv 作为 WordArray 传递给 CryptoJS;如果你给它一个字符串,它会假设你给它一个密码并从中派生出一个不同的 key 。因此,您的 Java 解密代码将使用不同的 key /iv 对。您可以使用

从字符串创建 WordArray
var key = CryptoJS.enc.Utf8.parse("abcdefghijklmnio")
var iv = ...

关于java - AES/CBC/NoPadding 解密中的乱码输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22172588/

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