节点。js在Java中解密文本时出错
我有下面的NodeJS代码用于解密,它工作得非常好,但当我当时试图在Java中转换相同的代码时,我得到了下面的错误
给定的最终块未正确填充。如果在解密过程中使用了坏密钥,则可能会出现此类问题
节点JS代码段:
let textParts = text.split(':');
let iv = Buffer.from(textParts.shift(), 'hex');
let encryptedText = Buffer.from(textParts.join(':'), 'hex');
let decrypted = decipher.update(encryptedText);
let decipher = crypto.createDecipheriv(
'aes-256-cbc',
Buffer.from(ENCRYPTION_KEY),
iv,
);
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString();
Java代码片段:
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] original = cipher.doFinal(Base64.decodeBase64(encyptedData));
return new String(original);
} catch (Exception ex) {
ex.printStackTrace();
}
节点JS和Java代码的加密密钥都相同。 提前谢谢
# 1 楼答案
问题似乎在于解码时java中变量的大小。 检查此链接可能会给您一些提示:
1-ejava-base64-encode-and-decode
2-given-final-block-not-properly-padded
# 2 楼答案
如果初始向量为32字节,则需要按如下方式解密