Cifrado DES con CryptoJS
🔐

Cifrado DES con CryptoJS

Tags
Blog
Created
August 18, 2020
El cifrado DES es un algoritmo de clave simétrica para el cifrado de datos digitales. Aunque la longitud de clave es tan solo de 56 bits (lo que lo hace demasiado inseguro para las aplicaciones), ha sido muy influyente en el avance de la criptografía.

Cómo funciona DES

La encriptación comienza con una permutación inicial de 64 bits de entrada. Estos bits se dividen entonces en dos mitades de 32 bits llamadas L y R. La encriptación procede entonces a través de 16 rondas, cada una de ellas utilizando las partes L y R existentes, y una subclave. La R y las subclaves se procesan en una función f, y la salida de la función f es exclusiva o se combina con la parte L existente para crear la nueva parte R. La nueva parte L es simplemente una copia de la parte R entrante. En la ronda final, las partes L y R se intercambian una vez más antes de la permutación final que produce el bloque de salida.

El desencriptado es idéntico al cifrado, excepto que las subclaves se utilizan en el orden contrario. Es decir, la subclave 16 se utiliza en la ronda 1, la subclave 15 se utiliza en la ronda 2, etc., terminando con la subclave 1 siendo utilizada en la ronda 16.

La función f

La función f mezcla los bits de la porción R usando la subclave de la ronda actual. Primero el valor de R de 32 bits se expande a 48 bits usando una permutación E. Ese valor es entonces o-exclusivo se excluye con la subclave. Los 48 bits se dividen entonces en ocho trozos de 6 bits, cada uno de los cuales se introduce en una caja S que mezcla los bits y produce una salida de 4 bits. Esas salidas de 4 bits se combinan en un valor de 32 bits y se permutan una vez más para producir la salida de la función f.

Generación de subclaves

Para generar las subclaves, comience con la clave de 56 bits (64 bits si incluye los bits de paridad). Estos se permutan y se dividen en dos mitades llamadas C y D. Para cada ronda, C y D se desplazan cada uno hacia la izquierda circularmente uno o dos bits (el número de bits depende de la ronda). La subclave de 48 bits es entonces seleccionada de los actuales bits C y D.

Implementación

Preparación

Se realizó una investigación sobre las librerías de JavaScript más populares de encriptación en el mercado, y la comunidad de software libre apuesta más por CryptoJS que disponible de una media de 250.000 descargas al día. El cual posee una implementación de DES que se adapta a las necesidades del proyecto. La documentación es accesible y se encuentra en línea.

image

Prueba de concepto

image

Para las pruebas de concepto con la librería, se realiza un código de ejemplo que permite la evaluación mediante un software llamado RunJS.

Ambiente

Se determinan los siguiente elementos para el desarrollo de la aplicación web.

Framework de desarrollo

image

Para el desarrollo se determina utilizar VueJS como framework para facilitar el la puesta en marcha de la página web.

Framework visual

Para el apartado visual se utiliza un framework de CSS llamado TailWindCSS para adaptar el apartado gráfico de la aplicación, es fácilmente adaptable a VueJS y de rápida implementación.

image

Repositorio de código

image

Servidor de implementación

Para respaldar el código y conectarlo a una herramienta de despliegue continuo se establece Github como repositorio principal

Para hostear la aplicación, se utiliza un sistema que permite publicación gratuita y automática llamado Netlify, el cual es perfecto para la magnitud de este proyecto.

image

Algoritmos

Con las herramientas escogidas y configuradas, se realiza la implementación de los dos métodos principales.

Encriptación

Se encripta el mensaje con la contraseña y se extraen los valores salt, iv, y texto encriptado en formato ascii

encrypt() {
  var encrypted = CryptoJS.DES.encrypt(message, password)
  var salt = encrypted.salt.toString()
  var iv = encrypted.iv.toString()
  var ascii = encrypted.toString()
}

Desencriptación

La desencriptación se procede de la misma manera, con la diferencia que el resultado se presenta en formato hexadecimal por lo que hay que transformarlo en formato ascii para mostrarlos al usuario

decrypt() {
  var hex = CryptoJS.DES.decrypt(message, password)
  var ascii = hex.toString(CryptoJS.enc.Utf8)
}

Resultado final

La implementación se complementa con retoques en el apartado gráfico que permite al usuario interactuar de una manera más fácil con el programa y el despliegue se realizó en el dominio https://melvinsalas-des.netlify.app disponible al público.

image
image

El proceso de encriptado muestra tanto el resultado ASCII para que puede ser copiado como el salt utilizado y el IV.

El proceso de desencriptado permite conocer el resultado con solo saber el texto y la clave.

image

👾
Código fuente disponible en github: github.com/melvinsalas/des_encrypter