Buscar en la base de conocimientos
< Todos los temas
Imprimir

Encriptar y desencriptar una cadena de texto en Javascript

// Función para encriptar un texto
function encrypt(plaintext, key, iv) {
    var cipher = "aes-256-cbc";
    var options = { iv: iv };
    var cipher_key = crypto.createCipheriv(cipher, key, iv);
    var encrypted = cipher_key.update(plaintext, "utf8", "base64");
    encrypted += cipher_key.final("base64");
    return encrypted;
}

// Función para desencriptar un texto
function decrypt(ciphertext, key, iv) {
    var cipher = "aes-256-cbc";
    var options = { iv: iv };
    var decipher_key = crypto.createDecipheriv(cipher, key, iv);
    var decrypted = decipher_key.update(ciphertext, "base64", "utf8");
    decrypted += decipher_key.final("utf8");
    return decrypted;
}

La función encrypt toma un texto en claro (plaintext) y una clave (key) y un vector de inicialización (iv) para encriptar el texto utilizando el algoritmo AES-256-CBC. La función devuelve el texto cifrado en Base64.

La función decrypt toma un texto cifrado en Base64 (ciphertext) y una clave (key) y un vector de inicialización (iv) para desencriptar el texto utilizando el mismo algoritmo. La función devuelve el texto en claro.

Es importante tener en cuenta que la clave y el vector de inicialización deben ser los mismos tanto para la función de encriptación como para la de desencriptación.

Además, estas funciones requieren que se utilice la biblioteca Node.js crypto, por lo que es necesario tener acceso a esa biblioteca para utilizar estas funciones en JavaScript.

¿Cómo puedo generar un vector de inicialización aleatorio para utilizar en la función de encriptación?

Para generar un vector de inicialización aleatorio en JavaScript, puedes utilizar la función crypto.randomBytes de la biblioteca Node.js crypto. Esta función devuelve un búfer de bytes aleatorios, que puedes convertir en una cadena hexadecimal o en cualquier otra representación necesaria.

Aquí te muestro un ejemplo de cómo generar un vector de inicialización aleatorio utilizando crypto.randomBytes:

const crypto = require("crypto");

// Generar un vector de inicialización aleatorio
const iv = crypto.randomBytes(16);

console.log(iv.toString("hex"));

Este código genera un vector de inicialización aleatorio de 16 bytes y lo convierte en una cadena hexadecimal utilizando el método toString("hex"). Puedes utilizar esta cadena para inicializar el vector de inicialización en la función de encriptación.

Es importante tener en cuenta que el vector de inicialización debe ser único para cada mensaje que se encripte con la misma clave. Por lo tanto, es recomendable generar un nuevo vector de inicialización aleatorio para cada mensaje en lugar de reutilizar el mismo vector de inicialización para varios mensajes.

¿Cómo puedo asegurarme de que el vector de inicialización sea único para cada mensaje?

Para garantizar que el vector de inicialización sea único para cada mensaje que se encripte con la misma clave, se recomienda generar un nuevo vector de inicialización aleatorio para cada mensaje en lugar de reutilizar el mismo vector de inicialización para varios mensajes.

Una forma común de generar un vector de inicialización único para cada mensaje es incluir un valor de nonce (número utilizado una sola vez) en la generación del vector de inicialización. El valor de nonce puede ser un contador que se incrementa cada vez que se encripta un mensaje, un valor de tiempo o cualquier otro valor único que se pueda generar.

Aquí te muestro un ejemplo de cómo generar un vector de inicialización único para cada mensaje utilizando un valor de nonce:

const crypto = require("crypto");

// Generar un vector de inicialización único con un valor de nonce
function generateIV(nonce) {
  const iv = crypto.randomBytes(16);
  iv.writeUInt32BE(nonce, 0);
  return iv;
}

// Ejemplo de encriptar un mensaje con un vector de inicialización único
const key = "clave-secreta";
const nonce = 0;
const iv = generateIV(nonce);
const plaintext = "Este es un mensaje secreto";
const ciphertext = encrypt(plaintext, key, iv);

En este ejemplo, la función generateIV genera un vector de inicialización aleatorio y escribe un valor de número utilizado una sola vez (nonce) en los primeros 4 bytes del vector de inicialización utilizando el método writeUInt32BE. El valor de nonce se pasa como parámetro a la función generateIV.

Luego, el vector de inicialización único se utiliza en la función de encriptación encrypt para encriptar el mensaje. Cada vez que se encripta un mensaje, el valor de nonce se debe incrementar para garantizar que el vector de inicialización sea único para cada mensaje.

Es importante tener en cuenta que el valor de nonce debe ser único y no repetirse para cada mensaje encriptado con la misma clave y no debe ser predecible. Por lo tanto, es recomendable utilizar un generador de números aleatorios de alta calidad o un generador de números pseudoaleatorios criptográficamente seguro para generar valores de nonce únicos.

Sidebar