es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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()));

Tags:  , , ,

Answer

  1. Avatar for 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:

    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()));
    

    Al utilizar el mismo modo de relleno y un IV fijo en ambos lenguajes, el problema con el relleno debería resolverse.

Comments are closed.