Saltar al contenido

Cifrado AES-256-CTR en nodo JS y descifrado en Java

Este grupo redactor ha pasado horas buscando para dar espuestas a tu duda, te ofrecemos la resolución y nuestro objetivo es resultarte de mucha apoyo.

Solución:

En su código JS, está utilizando los 32 caracteres string [email protected]@234 directamente como el AES keycon cada carácter ASCII asignado directamente a un único key byte.

En el código de Java, en lugar de eso, primero hashing el mismo string con MD5, y luego usando la salida MD5 como AES key. No es de extrañar que no coincidan.

lo que probablemente deberían estar haciendo, en ambos casos, es:

  1. generando aleatoriamente un string de 32 bytes (la mayoría de los cuales no serán caracteres ASCII imprimibles) y usarlo como el key; o
  2. usando un key función de derivación (KDF) para tomar una entrada arbitraria string y convertirlo en un AES pseudoaleatorio key.

En este último caso, si la entrada string es probable que tenga menos de 256 bits de entropía (por ejemplo, si es una contraseña elegida por el usuario, la mayoría de las cuales solo tienen unas pocas docenas de bits de entropía en el mejor de los casos), entonces debe asegurarse de usar un KDF que implemente key estirándose para ralentizar los ataques de adivinación de fuerza bruta.


PD. Para abordar los comentarios a continuación, MD5 genera un resumen de 16 bytes, que producirá un AES-128 key cuando se utiliza como AES SecretKeySpec. Para usar AES-256 en Java, deberá proporcionar un archivo de 32 bytes key. Si intenta usar un AES de 32 bytes key en Java arroja una InvalidKeyException, probablemente esté utilizando una versión anterior de Java con una política de cifrado limitada que no permite el cifrado keys más de 128 bits. Como se describe en esta respuesta a la pregunta vinculada, deberá actualizar a Java 8, actualización 161 o posterior, u obtener e instalar un archivo de política de cifrado ilimitado para su versión de Java.

En el código Java, está tomando el hash MD5 de secret antes de usarlo como key:

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(secretBytes);
SecretKeySpec skey = new SecretKeySpec(thedigest, "AES");

Mientras que, en su código NodeJS, no hace esto en ninguna parte. Así que estás usando dos diferentes keys al cifrar y descifrar.

No copie y pegue el código sin entenderlo. Especialmente el código criptográfico.

Calificaciones y comentarios

Acuérdate de que tienes la capacidad de explicar .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *