Función de Javascript para emular el «Cifrado César»

El cifrado César, en criptografía, es un tipo de cifrado de sustitución en el que cada letra del mensaje original es reemplazada por otra letra que se encuentra un número fijo de posiciones más adelante en el alfabeto. Es posible que recordéis que ya hicimos en el pasado un ejercicio similar a este, usando el sistema de cifrado Rot13, que es otra forma de cifrado de sustitución muy similar. El cifrado César debe su nombre a Julio César, ya que cifraba sus mensajes militares usando un desplazamiento de tres posiciones, o al menos eso contaba Suetonio.

Usando el ejemplo de César con un desplazamiento de 3 posiciones, la letra A se convertiría en D, la letra B se convertiría en E, y así sucesivamente. Como es evidente, llegaría un punto en el que nos quedaríamos sin letras, por lo que el alfabeto se recorre de forma circular, volviendo a la A cuando pasemos de la Z.

Es un método simple e ingenioso, aunque hoy por hoy no muy seguro pues es bastante fácil de descubrir y de descifrar. ¿Podríamos hacer una función de Javascript que utilice este método de cifrado? Desde luego, haremos una pensada para una codificación de caracteres UTF-16 y que en lugar de tener un desplazamiento fijo como en Rot13 (que son siempre 13 caracteres), recibirá un parámetro con el desplazamiento que queremos aplicar:

function caesar(txt, desp) {
  var respuesta = "";
  //bucle for que recorre la cadena y sustituye cada caracter.
  for (var i = 0; i < txt.length; i++) {
    var caracter = txt[i];
    // Verifica si el caracter es una letra del alfabeto
    if (/[a-zA-Z]/.test(caracter)) {
      // sumamos al código del caracter el desplazamiento
      var codigo = txt.charCodeAt(i) + desp;
      // alfabeto circular: si nos pasamos de la z retrocedemos 26 caracteres 
      // los 26 del alfabeto anglosajón, jo tenemos soporte para ñ ni acentos.
      if (/[a-z]/.test(caracter) && codigo > 122) {
        codigo -= 26;
      } else if (/[A-Z]/.test(caracter) && codigo > 90) {
        codigo -= 26;
      } else if (codigo < 0) {
        codigo += 26;
      }      
      caracter = String.fromCharCode(codigo);
    }
    respuesta += caracter;
  }
  return respuesta;
}

Cifrar la tarjeta SD en nuestro teléfono

Cuando ayer hablaba de apps de ciberseguridad para Android comentaba entre otras buenas prácticas de seguridad la idea de cifrar la tarjeta SD del dispositivo. Me habéis preguntado cómo se hace esto y por qué habría que hacerlo.

El por qué es simple: si alguien te roba tu teléfono puede que no sea capaz de desbloquearlo si lo has protegido con un patrón, datos biométricos, código pin, etc. pero si saca la tarjeta SD y la mete en otro dispositivo entonces podrá ver todo lo que hay en ella. ¿Ventajas de cifrarla? Mayor seguridad, si te roban el teléfono esos datos están protegidos, acceder a ellos es muy difícil, puede que no imposible pero sí muy complicado ¿Contras? Dos: una pequeña pérdida de rendimiento cuando accedas a la tarjeta que será más o menos significativa según la potencia del teléfono y, sobre todo, que una vez cifrada si se te estropea el teléfono no voy a decir que sea imposible recuperar esos datos, pero estás en la misma situación que el atacante: es complicado.

¿Cómo se cifra una tarjeta SD en Android?

Bueno, como siempre con Android dependemos mucho del fabricante y de la versión del sistema operativo. Como algo genérico diré que esa opción siempre va a estar en los ajustes del teléfono, donde deberemos buscar los que sean relativos a seguridad y dentro de los mismos deberíamos encontrar alguna referencia a la tarjeta SD.

Por ejemplo, en mi actual teléfono Samsung con Android 11 habría que ir a los Ajustes, allí a Datos Biométricos y Seguridad y dentro de ese menú ya aparece una opción que es Cifrar Tarjeta SD. Esto no era exactamente igual en mi anterior teléfono, un Huawei con Android 10, en el que para cifrar la tarjeta SD habría que ir a Ajustes, allí pulsar en Seguridad, dentro de ese menú ir a Ajustes adicionales, después apretar sobre Cifrado y credenciales y finalmente Cifrar tarjeta de memoria. Como véis esta opcion estará en el apartado de seguridad del teléfono, pero según el fabricante estará más accesibe o menos. En todo caso, seguramente en la web del fabricante del teléfono tendréis un manual de instrucciones de vuestro dispositivo en el que vendrán detalladas las instrucciones concretas para hacerlo en ese modelo.

¿Qué es una función hash?

Ayer comentaba en Facebook que una cadena alfanumérica que aparecía en una noticia «parecía el resultado de alguna función hash» y hubo gente que me preguntó qué era eso de una función hash. Así que he pensado que lo mejor será contarlo por aquí que me puedo extender más.

Cifrado

Las funciones hash, también llamadas «digest» o «de resumen«, son algoritmos que calculan y devuelven una cadena de texto alfanumérica de longitud fija calculada a partir de un dato de entrada, que puede ser un texto o un fichero binario. Se trata de funciones unidireccionales, lo que quiere decir que aun teniendo el resultado y conociendo el algoritmo no debe ser posible revertir las operaciones para descifrar el dato de entrada.

Son también funciones determinísticas, siempre devuelven la misma salida para la misma entrada. Al ser resúmenes existe la posibilidad de que dos entradas totalmente distintas devuelvan el mismo resultado, es lo que se llama una «colisión«. Teóricamente es imposible crear una función hash sin colisiones, puesto que las posibilidades de entrada son infinitas pero las de salida están limitadas a la longitud de la cadena de resumen, por tanto a mayor logitud de respuesta menor posibilidad de colisión y mayor robustez para el algoritmo. Las colisiones son lo que facilita un tipo de ataque criptográfico llamado «Ataque de Cumpleaños» del que puedes leer en ese enlace.

Por ejemplo, si calculo el hash de la cadena «hola» con el algoritmo md5 el resultado será: 4d186321c1a7f0f354b297e8914ab240. En cambio si le paso la cadena «Hola«, con mayúscula, el resultado devuelto será: f688ae26e9cfa3ba6235477831d5122e.

¿Qué utilidad tiene esto? Bueno, no se trata de un algoritmo para cifrar un mensaje y poder descifrarlo luego, como pueda ser el caso de AES, no tiene el mismo propósito que la criptografía simétrica o asimétrica. Las funciones hash son útiles por ejemplo para almacenar contraseñas en una base de datos, ya que aunque alguien lograra acceder a ellas no podría descifrar cual es la contraseña original. Otro de sus principales usos es asegurar que un fichero no ha sido modificado durante el trayecto desde su envío: se calcula el hash antes de enviarlo, si al recibirlo lo volvemos a calcular y el resultado no es el mismo implica que alguien ha capturado (un ataque de intermediario o man in the middle) y modificado el fichero. Las funciones hash también se utilizan en los procesos de firma digital de documentos.

¿Cuales son los algoritmos de resumen más populares o más comunes? Te dejo una lista con sus enlaces a Wikipedia:

Cifrar una máquina virtual de Virtual Box

Virtual Box nos permite dar un extra de seguridad a nuestras máquinas virtuales cifrando sus discos duros, recurriendo al algoritmo de cifrado simétrico AES, dándonos a elegir entre claves de 128 bits y de 256 bits.

Para ello seleccionamos en la pantalla principal de Virtual Box la máquina que queremos cifrar y pulsamos el botón de Configuración.

Virtual box

Allí nos vamos a la pestaña Disk Encryption, marcamos el check de Enable Disk Encryption, elegimos en el desplegable el tipo de cifrado y finalmente definimos una contraseña.

Cifrar Unidad

Tras aceptar comenzará el cifrado de los discos de la máquina elegida. Una vez terminado cuando la iniciemos nos pedirá la contraseña para continuar. Si queremos deshacer el cifrado basta con desmarcar el check de Enable Disk Encryption y poner la contraseña cuando nos la pida.

Cifrado extremo a extremo en Whatsapp ¿de qué va esto?

Seguramente a muchos ayer os apareció un mensaje tal que así si sois usuarios de Whatsapp:

actualización seguridad whatsapp

Por culpa del mensaje me pasé el día hablando de esto, así que creo que lo mejor es comentarlo por aquí. Whatsapp añade cifrado de extremo a extremo ¿esto qué significa?

Bueno, empezamos recordando que Whatsapp en sus inicios no era una aplicación que destacara por su seguridad ya que enviaba sus mensajes en texto plano. Las constantes publicaciones sobre los fallos de seguridad del popular servicio de mensajería llevaron a que en 2011 la compañía se decidiera a mejorar la seguridad aplicando un sistema de cifrado en tránsito. Esta solución evitaba que un atacante pudiera ver los mensajes mientras se enviaban, pero no protegía los mensajes almacenados a nivel local.

Ya a finales de 2014 Whatsapp anunció que comenzaría a aplicar un sistema de cifrado extremo a extremo, o end to end, para mejorar la seguridad en ese sentido, delegando del desarrollo y la implementación en una tercera empresa: Open Whisper Systems. Dicha empresa se ha basado en el software de código abierto de su creación TextSecure, que fue la base para el software de mensajería seguro Signal (nota: un amigo mío, experto en seguridad, me recomienda encarecidamente dicho software).

El funcionamiento del nuevo sistema de seguridad es el siguiente: se crea una clave privada vinculada al dispositivo cada vez que se envía un mensaje, que sólo se almacena en dicho dispositivo. El mensaje es cifrado con una clave pública y sólo puede ser descifrado con dicha clave privada. De esta forma ni la propia compañía podría tener acceso a los mensajes, al menos en teoría (luego en la práctica ya veremos).

¿Cómo se activa? En principio viene activado por defecto en la última versión, así que si actualizáis ya lo veréis. Si queréis saber si lo tenéis activado os vais a los ajustes de Whatsapp:

ajustes cuenta whatsapp

Y ahí pulsáis en Seguridad:

Pestaña seguridad

Debería estar tal que así. Para que esto funcione el usuario con el que os comunicáis debe tener también el whatsapp actualizado. Para saber si podéis comunicaros con esa persona de forma segura podéis pulsar en su nombre para ver sus datos, y por allí os aparecerá un mensaje tal que así para confirmaros si la conexión está cifrada:

whatsapp confirma cifrado

Pulsando este código además podrás confirmar que los mensajes se están enviando cifrados. Si el contacto está presente físicamente puedes hacerlo mediante el escaneo de un código QR en pantalla, y si no mediante la comparación de un código de 60 dígitos que aparece bajo el código.

En resumen, que Whatsapp es sensiblemente más seguro que antes de esta actualización, y probablemente en cuatro días tendrá una pelotera tremenda con el FBI por esto, sobre todo tras la polémica que también tuvieron con Apple. ¿Significa esto que puedes mandar fotos tuyas en pelotas por este medio? Yo no te lo recomendaría.

Cifrar una memoria USB en Ubuntu

Tras una serie de artículos dedicados a otros temas volvemos con algunas de mis cuestiones favoritas: software libre, cifrado/encriptación y seguridad informática. Aunque algunos gobiernos nos quieran hacer creer que esto es sólo para quien tiene algo que ocultar, la privacidad es un derecho y el cifrado una herramienta necesaria para ello. ¿A alguien le parecería lógico pedir una ley  nos obligara a vivir en casas de paredes transparentes? ¿que quitáramos las persianas de nuestras ventanas y las cerraduras de nuestras puertas por si ocultamos algo tras ellas? El cifrado es la pared de tus datos, es la persiana, es la puerta.

En mis tiempos de subsistencia freelance llevaba muchas veces el proyecto de un cliente en un pendrive. ¿Qué pasaría si lo pierdo? La propia Ley Orgánica de Protección de Datos nos solicita almacenar la información sensible de una persona de forma segura. Si la tengo que llevar en una unidad extraíble entonces esta necesariamente debe estar cifrada.

Lo primero para nuestro caso es instalar el paquete cryptsetup si todavía no lo tenemos disponible en nuestra distro:

sudo apt-get install cryptsetup

Una vez instalado, y con el pendrive conectado al equipo, abrimos el administrador de discos de Ubuntu.

Administrador de discos de Ubuntu

Bajo la tabla de particiones del dispositivo verás un botón cuadrado parecido a un botón de stop (en la captura que he puesto a continuación es un botón de play porque ya lo había pulsado) que nos dará la opción de desmontar el volumen.

Particionando unidad usb

Una vez desmontado el volumen pulsas el botón con dos engranajes que está a la derecha del de desmontar y eliges la opción de Formatear. En el menú desplegable de la ventana flotante que se abrirá eliges Cifrado, compatible con sistemas Linux (LUKS + Ext4) en el menú desplegable con todos los formatos. Como puedes observar este método nos permite cifrar una partición, de forma que si no quieres no tienes por qué cifrar todo el pen, puedes hacerlo sobre una parte y dejar otra con menos seguridad para llevar algo intrascendente y tener un acceso más rápido. Seguidamente añades un nombre para el volumen que vas a formatear y una contraseña.

Finalizando el formateo de unidad cifrada

Si en el futuro quieres deshacerte de la partición formateada tendrás que volver a formatear el dispositivo, pero en cambio si quieres cambiar la contraseña el administrador de discos te dará esa opción.

Cuando insertes un volumen así cifrado en un equipo con Ubuntu te dará varias opciones: pedir siempre la contraseña, recordarla mientras dure la sesión o recordarla siempre. Esta última puede ser muy cómoda, pero piensa que en según qué casos puede que no te interese que los datos estén accesibles siempre que el pen se conecte a ese equipo.

Tres herramientas libres para el cifrado de archivos

Como llevo unos días estudiando temas de seguridad (firma electrónica, VPN, algoritmos de encriptación, funciones de resumen…) es un buen momento para una corta entrada sobre herramientas para cifrar tus archivos. Voy a recomendar las que creo que son las tres mejores herramientas para encriptar tus archivos.

  • GPG o GNU Privacy Guard: Es la versión libre de PGP, y podéis descargarla desde este enlace. No sólo es ideal para el cifrado de archivos locales, e incluso de sistemas de discos enteros, sino también para el encriptado de comunicaciones. Permite el uso de pares de claves, firmas con tiempo limitado y esquemas de cifrado varios. Aunque en principio funciona en línea de comandos, existen varios plugins y entornos gráficos para el mismo, tanto en Linux como en Windows o MacOS.
  • True Crypt: Una de las más poderosas herramientas del mercado, se trata de una herramienta on-the-fly, que descrifa los archivos cuando los abres y los vuelve a cifrar cuando no están en uso. True Crypt es libre, gratis y está disponible para Linux, MacOS y Windows desde su web oficial. Está fuertemente optimizado para que la diferencia entre trabajar con un volumen cifrado y uno sin cifrar sea la menor posible. Permite cifrar tanto archivos como unidades enteras de disco, crear discos de seguridad virtuales y hasta crear volúmenes ocultos para mayor seguridad.
  • AxCrypt: En el caso de AxCrypt la utilidad es mayormente la de cifrar archivos sueltos o carpetas. Está disponible aquí para Windows y se integra en la shell del SO para que, con sólo hacer click derecho sobre un archivo, ya tengas la opción de Encriptar/Desencriptar. Permite además crear archivos autoextraíbles para transportarlos y transferirlos de forma segura, sin tener que tener instalado AxCrypt en el otro equipo.

Conste que si la idea es simplemente encriptar un archivo, el compresor 7zip te da la posibilidad de utilizar AES-256 para codificar el paquete ZIP, con lo que tus archivos estarán totalmente seguros.

En fin, con estas tres aplicaciones, no hay excusa para tener tus datos más confidenciales expuestos.