Cifrado AES CBC en Node.js y descifrado en Java.
NodeJs:
Estoy intentando descifrar texto usando AES CBC PKCS7 en NodeJs y PKCS5 en Java. Estoy obteniendo el siguiente error: “Given final block not properly padded. Such issues can arise if a bad key is used during decryption.”
ACTUALIZADO
encrypt() {
var key = ‘ThirtyTwoBytes3$ThirtyTwoBytes3$’;
var iv = CryptoJS.enc.Utf8.parse(CryptoJS.lib.WordArray.random(128 / 8));
let utf8Pass = CryptoJS.enc.Utf8.parse(“Hello”);
let encVal = CryptoJS.AES.encrypt(utf8Pass.toString(), key, {mode:
CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: iv});
return iv.concat(encVal.ciphertext).toString(CryptoJS.enc.Base64);
}
Java:
byte[] keyB = “ThirtyTwoBytes3$ThirtyTwoBytes3$”.getBytes(StandardCharsets.UTF_8);
IvParameterSpec ivParameterSpec = new IvParameterSpec(encryptedText.getBytes(), 0, 16);
SecretKeySpec key = new SecretKeySpec(keyB, “AES”);
Cipher aesCBC = Cipher.getInstance(“AES/CBC/PKCS5Padding”);
aesCBC.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);
byte[] decryptedData = Base64.getDecoder().decode(encryptedText);
decryptedText = new String(Hex.decodeHex(new String(aesCBC.doFinal(decryptedData), StandardCharsets.UTF_8).toCharArray()));
El IV fijo funciona correctamente
NodeJs
var encKey = CryptoJS.enc.Utf8.parse(“ThirtyTwoBytes3$ThirtyTwoBytes3$”);
var encKeyIv = CryptoJS.enc.Utf8.parse(“$1SixteenBytes6$”);
let utf8Pass = CryptoJS.enc.Utf8.parse(“Hello”);
let encVal = CryptoJS.AES.encrypt(utf8Pass.toString(), encKey, {mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: encKeyIv});
encVal.ciphertext.toString();
Java:
SecretKey key = new SecretKeySpec(“ThirtyTwoBytes3$ThirtyTwoBytes3$”.getBytes(), “AES”);
AlgorithmParameterSpec iv = new IvParameterSpec(“$1SixteenBytes6$”.getBytes());
byte[] decodeBase64 = Base64.decode(encVal);
Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”);
cipher.init(Cipher.DECRYPT_MODE, key, iv);
decString = new String(Hex.decodeHex(new String(cipher.doFinal(decodeBase64), “UTF-8”).toCharArray()));
davy.ai
El error
Given final block not properly padded
indica que hay un problema de relleno durante el proceso de desencriptación. En este caso, los modos de relleno utilizados en NodeJs y Java son diferentes: PKCS7 en NodeJs y PKCS5 en Java. Para solucionar este problema, es necesario utilizar el mismo modo de relleno en ambos lenguajes.Para actualizar el código, se recomienda utilizar un IV fijo en NodeJs y Java para asegurar resultados consistentes. Aquí tienes el código actualizado para ambos lenguajes con un IV fijo:
NodeJs:
Java:
Al utilizar el mismo modo de relleno y un IV fijo en ambos lenguajes, el problema con el relleno debería resolverse.