Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

517
Views
Cifrado y Descifrado en Java y Javascript (Nodejs)

Cifré un texto en Java y quiero descifrarlo en Javascript y viceversa, mi código Java se ve así

 Cipher c = Cipher.getInstance("AES/GCM/NoPadding"); SecretKeySpec k = new SecretKeySpec(this.key.getBytes(), "AES"); c.init(Cipher.ENCRYPT_MODE, k); byte[] encryptedData = c.doFinal(this.value.getBytes()); byte[] iv = c.getIV(); sb.append(new String(Base64.getEncoder().encode(iv))); sb.append(';'); sb.append(new String(Base64.getEncoder().encode(encryptedData))); // send sb.toString() to the other end

Probé node-forge y elliptic para el descifrado en Nodejs, en node-forge tengo un error al quejarme de una etiqueta que no tengo, alguien puede proporcionar una solución en Nodejs.

Código JavaScript

 function convertFromMxBase64(FormatEncryptedString) { const speratorIndex = FormatEncryptedString.indexOf(';'); const encryptedBase64 = mxFormatEncryptedString.substr(speratorIndex + 1); const ivBase64 = mxFormatEncryptedString.substr(0, speratorIndex); return { iv: forge.util.createBuffer(forge.util.decode64(ivBase64), 'utf8'), payload: forge.util.createBuffer(forge.util.decode64(encryptedBase64), 'utf8') }; } function decrypt() { let { iv, payload } = convertFromMxBase64(mxCombi); const key = forge.util.createBuffer(theKey, 'utf8'); var cipher = forge.cipher.createDecipher("AES-GCM", key); // forge.rc2.createDecryptionCipher(key); cipher.start({ iv }); cipher.update(payload); cipher.finish(); var encrypted = cipher.output; // outputs encrypted hex console.log(encrypted.toHex()); }
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

El modo GCM utiliza, por definición, una etiqueta que se necesita para la comprobación de autenticidad/integridad.
El problema de la etiqueta en el lado de NodeJS se debe a que no se tiene en cuenta la etiqueta de autenticación. En el lado de Java, esto no es necesario porque el proveedor SunJCE lo hace automáticamente agregando la etiqueta al texto cifrado: por lo tanto, los últimos 16 bytes del resultado son la etiqueta. En el lado de NodeJS, por el contrario, el texto cifrado y la etiqueta se manejan separados, por lo que ambas partes deben separarse explícitamente , por ejemplo:

 var ciphertext = forge.util.createBuffer(payload.data.substring(0, payload.length() - 16)); var tag = forge.util.createBuffer(payload.data.substring(payload.length() - 16));

La etiqueta y el texto cifrado se deben pasar a la instancia de cipher de la siguiente manera:

 cipher.start({ iv:iv, tag:tag }); // apply tag cipher.update(ciphertext); // apply ciphertext

Otro error es que la codificación UTF-8 se usa al crear iv y payload . Esto es incorrecto, los datos deben pasarse como una cadena binaria, es decir, 'utf8' debe reemplazarse por 'binary' o eliminarse por completo.

 iv: forge.util.createBuffer(forge.util.decode64(ivBase64)), payload: forge.util.createBuffer(forge.util.decode64(encryptedBase64))

Además, en getBytes() del código Java se debe especificar una codificación, por ejemplo, getBytes(StandardCharsets.UTF_8) . Si esto no se hace, se utiliza una codificación predeterminada dependiente de la plataforma, lo que significa que se pueden aplicar diferentes codificaciones según el entorno.

Con estos cambios, el descifrado funciona en el lado de NodeJS.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!