La criptografía es una necesidad derivada de realizar comunicaciones por escrito (en su origen) creada para preservar la privacidad de la información que se transmite, garantizando que una persona que no esté autorizada no pueda leer el contenido del mensaje.
En la historia hemos tenido multitud de ejemplos de formas de encriptar mensajes como los métodos espartanos de hace 2.500 años, el cifrado de Polybios (de los griegos) o el cifrador del César (de los romanos), y sin olvidarnos de la máquina de encriptación más famosa de la historia: la máquina Enigma.
Historia de la criptografía
En este artículo voy a tratar solamente de la historia de la criptografía y pondré unos ejemplos prácticos, posteriormente me adentraré en los distintos tipos de criptografía moderna y posteriormente su uso.
La escítala espartana (siglo V a. C.)
Los primeros mensajes cifrados que conocemos datan del siglo V antes de Cristo, de procedencia espartana, que ponían en práctica un método simple y rudimentario que consistía en coger una vara (llamada escítala), se le enroscaba una cinta de cuero o papiro y posteriormente se escribía de forma longitudinal (como en la imagen).
Y por último se desenrollaba la cinta, con un puñado de letras sin sentido y se mandaba a través del seur mensajero de turno al trote.
Supuestamente solo se podía desencriptar la información con una vara del mismo diámetro que la original sobre la que se escribió (obviamente si te pones a intentar cuadrar las letras acabas sacando algo en claro, pero en la época no se sabía demasiado leer, tampoco el idioma origen y mucho menos tenían la cultura general necesaria para pensar que la información estaba encriptada).
Uso
El diámetro de la escítala es la clave de este método de encriptación (o simplemente cada cuantos caracteres empieza una vuelta).
En el ejemplo encriptaremos la siguiente entrada de texto:
Genbeta Dev - Historia de la criptografía - Método usado por los espartanos
Y como clave o diámetro de la escítala (n
) tomaremos el número 7, es decir, en cada vuelta de la cinta enroscada en el la vara pondremos 7 caracteres.
El resultado es el siguiente:
G tMose-doé pn egtpabH rooreiladrttsafo aat í ln ocauooDrr ssseii-a vap de
Podéis poner la técnica en marcha con este ejemplo que he realizado y el código JavaScript es el siguiente:
function escitala(txt,n){
//Convertimos "n" en entero
var n=Math.floor(Number(n))
//"e" nos indica si entra justo en las filas
var e=(txt.length%n>0?1:0)
//Calculamos el número de filas resultantes
var lin=Math.floor((txt.length/n)+e)
//"r" contiene la respuesta
var r=''
//Añadimos el carácter a la respuesta
for(var a=0;a'+txt.charAt(a+(b*lin))+''
return r
}
La función necesita dos argumentos, el texto y el diámetro que usaremos de clave (n
) de la siguiente forma: escitala([Texto],[Entero: diámetro])
.
El cifrador de Polybios (siglo II a. C.)
Este sistema es el primer cifrado por sustitución de caracteres. Se atribuye la invención a el historiador griego Polybios y el sistema de cifrado consiste en sustituir un carácter por el numero o letra de una columna o fila (como si jugásemos al hundir la flota).
En el ejemplo de este sistema introduciremos la siguiente cadena:
Genbeta Dev Historia de la criptografia Metodo usado por los griegos
Nota: tenemos que tener en cuenta que en este método se sustituye la letra "J
" por la "I
".
El resultado de encriptar con la tabla de la imagen (la teóricamente real) es el siguiente:
BBAECCABAEDDAA ADAEEA BCBDDCDDCDDBBDAA ADAE CAAA ACDBBDCEDDCDBBDBAABABDAA CBAEDDCDADCD DEDCAAADCD CECDDB CACDDC BBDBBDAEBBCDDC
Y podéis probarlo con este ejemplo para encriptar y desencriptar con el sistema griego (Polybios).
var let='abcdefghiklmnopqrstuvwxyz'
var tra='ABCDE'
//función de encriptación
function polybios_enc(txt){
//Comprobamos que el texto es válido
var pat=/^[0-9A-z\s]*$/
if(!pat.test(txt)) return 'Texto no válido'
//Lo pasamos a minúsculas y convertimos la "j" en "i" (como requiere el método)
var txt=txt.toLowerCase().replace('j','i')
var r=''
for(var a=0;a0){
if(t.substr(0,1)==' '){
r+=' '
c=1
}
else{
var s=t.substr(0,2).split('')
r+=let.charAt((tra.indexOf(s[0])*tra.length)+tra.indexOf(s[1]))
c=2
}
t=t.substr(c,t.length-c)
}
return r
}
Ambas funciones solo necesitan el argumento con el texto a encriptar o desencriptar.
El cifrador del César (siglo I a. C.)
Los romanos hace 2100 años idearon su propio sistema de enscriptación (a la altura de los anteriores) que consistía en sustituir cada letra por otro que es el resultado de desplazar tres posiciones hacia la derecha desde el carácter origen en el abecedario (con la imagen de abajo se entenderá a la perfección).
Esta técnica se podría mejorar cambiando el abecedario "desplazado" por uno aleatorio, por ejemplo, pero el método en principio es desplazando tres caracteres a la derecha (y para desencriptarlo hacerlo al contrario, a la izquierda). Nota: este sistema puede admitir también los espacios, que se añadirán como un carácter más o de no usarse se omitirán.
Para poner otro ejemplo vamos a encriptar la siguiente cadena (contaremos los espacios):
Genbeta Dev Historia de la criptografia Metodo usado por los romanos
Y el resultado es el siguiente:
jhqehwdcghycklvwruldcghcodcfulswrjudildcphwrgrcxvdgrcsrucorvcurpdqrv
Y por último he hecho este otro ejemplo funcional del sistema de enscriptación del César, que admite distinto número de desplazamiento (n
), sea positivo o negativo (si lo encriptamos con n=3
debemos de desencriptarlo con n=-3
).
function cesar(txt,n,space){
//Comprobamos que el texto es válido
var pat=/^[0-9A-z\s]*$/
if(!pat.test(txt)) return 'Texto no válido'
//Adaptamos el texto según si admitimos espacios
var let='abcdefghijklmnopqrstuvwxyz'+(space?' ':'')
var txt=txt.toLowerCase()
if(!space) for(var a=0;a
Esta función sirve para encriptar y desencriptar (debemos de restar el desplazamiento simplemente) y necesita los siguientes argumentos: cesar([Texto],[Entero: desplazamiento],[Booleano: con o sin espacios])
.
Resumen
Esta es una pequeña introducción a la criptografía mezclada con un poco de historia (y es solo tres ejemplos, si nos pusiésemos a nombras métodos y métodos que no necesitasen computación tendríamos para rato). En la próxima parte comentare los tipos de encriptación... moderna.
En Genbeta Dev | Criptografía