Encriptar y codificar es esconder y ¿cuál es la mejor forma de esconder algo?: mostrarlo sin señalarlo ni acotarlo.
Se ha cometido un asesinato, varios testigos vieron a una única persona cometer el crimen.
La persona que lo cometió se confiesa como autora... pero no puede ser condenada... porque además, otras 20 personas más se han autoidentificado como autoras materiales. Me suena que hubo un caso verídico con unos gemelos, ante la imposibilidad de determinar cuál de ellos fue el autor, ante la posibilidad de condenar a un inocente, no se condenó a ninguno.
La mejor forma de esconder una palabra es esconderla en medio de más palabras, así nadie puede determinar cuál de las palabras es la palabra. Y ni si quiera que ese conjunto de palabras esconde algo que es importante para algo.
Aplicado a encriptación, supongamos que queremos codificar una letra, una letra secreta. Y tenemos una clave de desencriptación que mismamente es otra letra.
Para este ejemplo será un algoritmo de encriptación muy básico: una transposición. Cada letra tiene un valor numérico basado en su orden alfabético (a=1, b=2, c=3,...).
La letra secreta es la "E". La clave de desencriptación es "B" y la letra encriptada aplicando la clave sería:
E+B... (E+2) >>> GPara desenciptar bastaría con hacer la operación inversa:
G-B... (G-2) <<<>Bien, el espía se encuentra con el código: "G", y empieza a probar claves, y se da cuenta de que aun conociendo el algoritmo, cualquier clave que introduzca ofrece una desencriptación válida: una letra del alfabeto. Por tanto le es imposible saber cual es la letra secreta.
Vamos a ampliar ahora a dos letras. Aquí la cosa se complica un poco. Se supone que encriptamos un par de letras, pero ese par de letras debe de tener sentido en algún lenguaje, humano o cibernético (pueden ser datos de un programa o de un fichero interpretable por un programa).
Pongamos que es una palabra en castellano; algunos resultados válidos serían: es, el, lo, un, as, yo, tu, su, do, re, mi, fa, la, si, no... etc y resultados no válidos serían: ww, gh, ia, rr, vz... etc.
Por tanto, aquí el espía podría acotar un poco más, separando entre claves que devuelven resultados lógicos, y claves que devuelven basura desechable. Pero tampoco resolvería nada, si el conjunto de claves válidas le devolviera múltiples resultados válidos, infinitos resultados válidos, palabras con sentido. Nuevamente... ¿cuál de ellas es la palabra de dos letras secreta?
A medida que crece la cadena, la combinatoria válida se reduce y es más fácil acotar, a menos que la clave crezca con la cadena.
Para una palabra secreta de dos caracteres bastaría una clave de mismamente dos caracteres para obtener resultados válidos infinitos, y por tanto inútiles. Para 3 letras, clave de 3 caracteres; para 4 letras, clave de 4 caracteres... para 5678 letras, clave de 5678 caracteres... por muy simple que sea el algoritmo de cifrado.
Como nuestra memoria no es infinita, pero la de los ordenadores sí, mejor idear un sistema que mantenga la clave de descifrado pequeñita, aun a costa de aumentar la longitud del archivo encriptado... pero no de cualquier forma, los caracteres de relleno deberían de generarse bajo algún criterio que no delatase lo que es relleno y lo que es fundamental.
¿Y si es archivo encriptado estuviera preparado para obtener infinitos resultados válidos con las infinitas posibles claves independientemente de la longitud de la cadena secreta?
Para empezar vamos a esconder la longitud verdadera de la cadena, vamos a introducir código basura: falsos culpables.
La palabra secreta de 2 caracteres de longitud sería encriptada, por ejemplo, en un fichero de 8 caracteres de longitud, de los cuales 6 serían inservibles para obtener la palabra secreta correcta, pero útiles para obtener multitud de palabras "secretas" incorrectas. Hemos aumentado el caos, hemos escondido un grano de arena en una playa. Nadie puede diferenciar nuestro grano del resto de los granos.
Como gracias a la tecnología, cada vez los problemas de espacio son menores, y la seguridad de los datos bien merece espacio extra, este sistema de esconder lo válido dentro de un caos capaz de aumentar la probabilidad de resultados legibles falsos y disminuir la posibilidad de concretizar entre ellos, es bastante interesante. Estenografía + criptografía.
La tecnología avanza, y algoritmos que al día de hoy pudieran parecer inquebrantables, podrían descifrarse con los ordenadores y nuevas técnicas del futuro. La idea sería: muy bien, que los ordenadores del futuro resuelvan y desencripten lo que quieran... pero que cuando resuelvan, obtengan infinitos resultados válidos. Tenerlo todo es como no tener nada, podría el ordenador disponer de todos los textos posibles en todos los idiomas posibles, como en la Biblioteca de Babel de Borges, pero a ver qué criterio sigue para saber cual de esos textos es el que estaba oculto.
Además, que lo que he dicho un poco más arriba sobre que para una palabra secreta de 3 caracteres basta una clave de 3 caracteres para hacerla indescifrable es falso. Cuando se disponen de varios archivos codificados con el mismo algoritmo y la misma clave, se puede acotar más el conjunto de claves válidas, descartando aquellas que ofrezcan resultados no legibles en cualquiera de los ficheros codificados del repertorio, y en función del número de "muestras" para comparar, se podría llegar a hacer peligrar la inquebrantabilidad de la encriptación.
Claro que, esto también se puede neutralizar mediante juego sucio, nuevamente usando la información basura: si tenemos un directorio con todos nuestros ficheros de información codificada, bastaría introducir alevosamente entre ellos una proporción de ficheros con contenido ilegible codificado, ficheros basura que llevarían al espía a descartar -sin saberlo- claves válidas.
No, acceder a la información secreta no puede ser tan simple como en las películas: entrar en el ordenador del enemigo usando como clave el nombre de su mascota, para que a continuación aparezcan todos los ficheros secretos abiertos en el escritorio.
La información bien escondida puede estar a la vista, pero nunca acotada ni recuadrada con un marco que diga "TOP SECRET". Estará en cambio rodeada de datos falsos y posibilidades infinitas. Y la mayor falla de cara a la seguridad es el propio sistema operativo: la posibilidad de recuperar datos borrados del disco duro (los ficheros originales antes de la encriptación), datos temporales desencriptados que fueron almacenados mismamente como temporales en el disco duro, la posibilidad de consultar la fecha de acceso a archivos para saber cuales son los importantes...
NOTA: Cuando hablo de infinito, se entienda en sentido práctico, no real ni absoluto. Los resultados posibles de descifrado son siempre finitos, pero en la medida en la que abarquen todas las posibilidades y por tanto no concreticen en una única, dentro de su micromundo de posibilidades significan el todo, el infinito relativo.
[ampliación Martes 6 de Febrero]
La utopía de una clave corta que genere infinitas soluciones válidas aun a costa de aumentar el tamaño del código cifrado es inviable, a priori.
Las combinaciones están limitadas por la interacción con los elementos de la clave, por combinatoria.
Si tenemos una clave basada en 25 posibles letras, para generar infinitas soluciones de encriptación-desencriptación sobre un archivo que también contiene exclusivamente 25 caracteres, necesitaríamos una clave tan larga como el propio texto a encriptar.
Por ejemplo, un texto de 10 caracteres, escrito con 25 posibles valores.
Los posibles textos que se pueden generar con estas bases son 25^10 es decir... 9,5367E13
Para interaccionar con cada uno de esos caracteres y producir un nuevo caracter
independiente de los demás, y por tanto obtener los infinitos resultados posibles (todos los resultados posibles por combinación), harían falta otros 10 caracteres con 25 posibles valores.
De otro modo no se podría generar la totalidad de posibilidades, y por tanto cabría el riesgo de que el cifrado fuera frágil.