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

1.2K
Views
CryptoJS javascript AES-128, ECB cifrar/descifrar

Objetivo: Ejemplo simple de CryptoJS para cifrar y descifrar usando AES-128, ECB, 0-padding.

Vea a continuación mi muestra ejecutable.

El texto de entrada es "US0378331005-USD-US-en" que está cifrado (con suerte AES-128 con todo lo anterior) y luego descifrado (que no funciona)

 text: US0378331005-USD-US-en key: 11A1764225B11AA1 key length: 16 encrypted 951422f8ac8354acf23fbc decrypted a5126fa0fc3cb4c39a4f3e637be98a73 

 var text = 'US0378331005-USD-US-en'; var key = '11A1764225B11AA1'; // to ensure AES-128 this has to be 16 bit console.log('text:', text); console.log('key:', key); console.log('key length:', key.length ); text = CryptoJS.enc.Hex.parse(text); key = CryptoJS.enc.Hex.parse(key); var iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000"); var encrypted = CryptoJS.AES.encrypt(text, key, { iv: iv, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding }); encrypted = encrypted.ciphertext.toString(CryptoJS.enc.Hex); console.log('encrypted', encrypted); var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: iv, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding }); console.log('decrypted', decrypted.toString() );
 <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/aes.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/md5.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/enc-hex.min.js"></script>

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Hay varios errores en su código:

  • Los modos de cifrado de bloque como ECB siempre requieren relleno si el tamaño del texto sin formato no corresponde a un múltiplo entero del tamaño del bloque, como es el caso en el ejemplo anterior. En realidad, se debe lanzar una excepción. CryptoJS, sin embargo, rellena implícitamente con valores 0x00, realiza el cifrado y trunca el texto cifrado a la longitud del texto sin formato original. Este procesamiento es desordenado y es (en mi opinión) incluso un error.
    Como solución, se debe aplicar relleno. Dado que está hablando de relleno 0, puede querer decir relleno cero, es decir, CryptoJS.pad.ZeroPadding . Tenga en cuenta que el relleno PKCS#7 (el predeterminado) es más confiable.
  • Está utilizando el codificador hexadecimal para la importación de claves, por lo que los 16 dígitos hexadecimales de su clave se convierten en una clave de 8 bytes, que no es una clave AES válida (las longitudes de clave AES válidas son 16, 24 y 32 bytes). Sin embargo, debido a un error, CryptoJS procesa este tamaño de clave pero produce un resultado que no cumple con AES.
    Como solución, por ejemplo, se debe usar una clave de 32 dígitos hexadecimales para AES-128 en combinación con el codificador hexadecimal. Otra alternativa que funciona con la clave publicada es el codificador Utf8.
  • Obviamente, el texto sin formato no está codificado en hexadecimal, por lo que no se puede aplicar ningún codificador hexadecimal.
    Como solución, se utilizará el codificador Utf8.
  • El modo ECB no utiliza un IV, es decir, el IV se ignora y, por lo tanto, se puede omitir. Tenga en cuenta que el modo ECB es inseguro precisamente porque no utiliza un IV. Por lo tanto, se debe aplicar un modo con un IV.
  • Durante el descifrado CryptoJS.AES.decrypt() espera un objeto CipherParams , pero en el código actual se pasa el texto cifrado codificado en hexadecimal.
    La solución es crear un objeto CipherParams a partir del texto cifrado codificado en hexadecimal y pasarlo, o pasar el texto cifrado codificado en Base64, que CryptoJS convierte implícitamente en un objeto CipherParams .
  • Falta la decodificación Utf8 de los datos descifrados.

Código fijo:

 var text = 'US0378331005-USD-US-en'; var key = '11A1764225B11AA1'; console.log('text:', text); console.log('key:', key); console.log('key length:', key.length ); // Fix: Use the Utf8 encoder text = CryptoJS.enc.Utf8.parse(text); // Fix: Use the Utf8 encoder (or apply in combination with the hex encoder a 32 hex digit key for AES-128) key = CryptoJS.enc.Utf8.parse(key); // Fix: Apply padding (eg Zero padding). Note that PKCS#7 padding is more reliable and that ECB is insecure var encrypted = CryptoJS.AES.encrypt(text, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.ZeroPadding }); encrypted = encrypted.ciphertext.toString(CryptoJS.enc.Hex); console.log('encrypted', encrypted); // Fix: Pass a CipherParams object (or the Base64 encoded ciphertext) var decrypted = CryptoJS.AES.decrypt({ciphertext: CryptoJS.enc.Hex.parse(encrypted)}, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.ZeroPadding }); // Fix: Utf8 decode the decrypted data console.log('decrypted', decrypted.toString(CryptoJS.enc.Utf8));
 <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

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!