Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

355
Vistas
El cifrado con Crypto en Node.js no da el resultado esperado

Tengo un dispositivo incrustado antiguo que espera una contraseña cifrada con un cifrado, una clave y un IV determinados. Una aplicación existente escrita en .NET Framework crea una cadena cifrada AES-128-CBC y estoy reescribiendo esto en Node.js usando la biblioteca Crypto.

Sin embargo, cuando cifro una cadena con la misma clave e IV en Node.js, el resultado no es el mismo que en .NET. He verificado dos veces el cifrado con herramientas en línea y arrojan el mismo resultado que .NET, por lo que Node.js Crypto es el extraño.

El código C# para .NET (la clave y el IV se han sustituido con fines de demostración):

 byte[] encrypted; using (AesManaged aes = new AesManaged()) { aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.Zeros; aes.Key = new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; aes.IV = new byte[] { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 }; ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { swEncrypt.Write("admin"); } encrypted = msEncrypt.ToArray(); } } } return encrypted;

Esto da la cadena Base64 gE1twb8LV/44oO/6UKwwCg== . He probado el mismo cifrado, clave e IV con herramientas en línea, y dan el mismo resultado.

Mi código Node.js:

 const crypto = require('crypto'); const key = Buffer.from('00112233445566778899aabbccddeeff', 'hex'); const iv = Buffer.from('aabbccddeeff00112233445566778899', 'hex'); const plaintext = 'admin'; var cipher = crypto.createCipheriv('aes-128-cbc', key, iv); cipher.update(Buffer.from('admin')); var encrypted = cipher.final().toString('base64');

Esto da la cadena Base64 4TT9E4WDH/TmlKjJdVFeHQ== .

He intentado todo lo que se me ocurre sin suerte. Me di cuenta de que el código .NET especifica un relleno cero, pero no he podido encontrar una manera de configurar esto en Node.js Crypto. Supongo que esta es probablemente la razón por la que no da el mismo resultado.

¿Alguien sabe cómo especificar el relleno cero en Node.js Crypto?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Como ya habrás notado, los acolchados no coinciden. En el código C# se especifica relleno cero, en el código NodeJS se usa PKCS#7 de forma predeterminada. Dado que el módulo criptográfico de NodeJS no admite el relleno cero, debe implementarlo usted mismo y deshabilitar el relleno predeterminado.

Además, la codificación de entrada y salida debe definirse para las llamadas update() y final() y las partes deben estar concatenadas. En el siguiente código NodeJS, UTF-8 se especifica como codificación de entrada y Base64 como codificación de salida:

 const crypto = require('crypto'); const key = Buffer.from('00112233445566778899aabbccddeeff', 'hex'); const iv = Buffer.from('aabbccddeeff00112233445566778899', 'hex'); const plaintext = 'admin'; var cipher = crypto.createCipheriv('aes-128-cbc', key, iv); cipher.setAutoPadding(false); // Disable default PKCS#7 padding var paddedPlaintext = zeroPad(plaintext, 16); // Zero pad plaintext var encrypted = cipher.update(paddedPlaintext, 'utf8', 'base64'); // Specify input-/outputencoding encrypted += cipher.final('base64'); // Specify outputencoding and concatenate console.log(encrypted); // gE1twb8LV/44oO/6UKwwCg== function zeroPad(text, bs){ var padLength = text.length; if (text.length % bs > 0){ padLength += bs - text.length % bs; } return text.padEnd(padLength, '\0'); }

con la salida:

 gE1twb8LV/44oO/6UKwwCg==

que coincide con la salida del código C#.


Tenga en cuenta que un IV estático es inseguro. Es más seguro usar un IV generado aleatoriamente para cada encriptación. Para fines de prueba, por supuesto, esto está bien.
Además, el relleno cero no es confiable. Una mejor opción es el relleno PKCS#7 (que es el valor predeterminado de cifrado ).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda