29.6.07

El cifrado de Cesar

Este cifrado recibe su nombre de Julio Cesar que segun Suetonio usaba el sistema para comunicar mensajes confidenciales a sus tropas, el cifrado de Cesar es una tecnica muy simple en el que se usa desplazamiento en el que se substituye una letra por otra que esta n espacios mas adelante de ella en el alfabeto, de modo que no es muy seguro que digamos.

Cifrando

El cifrado se puede hacer de dos formas, la primera es alineando los dos alfabetos el original y el cifrado, el alfabeto cifrado sera el original desplazado n espacios, en el caso de Julio Cesar n=3

alfabeto original:   abcdefghijklmnopqrstuvwxyz
alfabeto de cifra: defghijklmnopqrstuvwxyzabc
Asi cada letra del mensaje original se corresponde con una del alfabeto de cifra.

La otra forma de codificar es usando aritmetica modular, hacemos que se correspondan las letras con los números naturales asi a=0,b=1,...,z=26 (sin usar la ñ) y hacemos la operacion siguiente:

(original+N) mod 26

Esto nos va devolviendo el texto cifrado con la clave N, por ejemplo 3.

Descifrando

Basta con intercambiar los alfabetos de cifrado y descifrado
Aqui un pequeño programa en python que nos permite cifrar y descifrar mensajes de esta forma:

alfabeto del mensaje cifrado:   defghijklmnopqrstuvwxyzabc
alfabeto para descifrar: abcdefghijklmnopqrstuvwxyz
O usando la aritmetica modular con la operacion contraria a la de cifrado:

(original-N) mod 26

El siguiente es un pequeño programa en python que realiza las operaciones de cifrado y descifrado:

def cifradocesar(cadena,clave):
....resultado=""
....for letra in cadena:
........if letra != ' ':
............aux=ord(letra)-97
............resultado+=chr(((aux+clave) % 26)+97)
....return resultado

def descifradocesar(cadena,clave):
....resultado=""
....for letra in cadena:
........if letra != ' ':
............aux=ord(letra)-97
............resultado+=chr(((aux-clave)%26)+97)
....return resultado

clavestr=raw_input("introduzca clave: ")
if clavestr.isalnum():
....clave=int(clavestr)
cadena=raw_input("introduzca la palabra a cifrar: ")
print cifradocesar(cadena,clave)
cadena=raw_input("introduzca la palabra a descifrar: ")
print descifradocesar(cadena,clave)



Ataque

Hay dos formas de atacar a este sistema, si sabemos como esta cifrado nos basta con ir probando todas las claves, quiere decir ir probando todos los desplazamientos, solo hay 25 posibilidades (no contamos la de sumar 0) asi por ejemplo tenemos este texto cifrado:

hofli udgrf hvdui xhqrp
eudgr dvlhq krqru dmxol
rfhvd utxlh qxvrx qdoid
ehwrf rqghv sodcd plhqw
rghwu hvhvs dflrv

Tomamos solo la primera linea y vamos atacando con todas las posibles claves hasta obtener algo coherente asi:

0 hofliudgrfhvduixhqrp
1 gnekhtcfqegucthwgpqo
2 fmdjgsbepdftbsgvfopn
3 elcifradocesarfuenom
4 dkbheqzcnbdrzqetdmnl
5 cjagdpybmacqypdsclmk
6 bizfcoxalzbpxocrbklj
7 ahyebnwzkyaownbqajki
8 zgxdamvyjxznvmapzijh
9 yfwczluxiwymulzoyhig
10 xevbyktwhvxltkynxghf
11 wduaxjsvguwksjxmwfge
12 vctzwiruftvjriwlvefd
13 ubsyvhqtesuiqhvkudec
14 tarxugpsdrthpgujtcdb
15 szqwtforcqsgoftisbca
16 rypvsenqbprfneshrabz
17 qxourdmpaoqemdrgqzay
18 pwntqcloznpdlcqfpyzx
19 ovmspbknymockbpeoxyw
20 nulroajmxlnbjaodnwxv
21 mtkqnzilwkmaizncmvwu
22 lsjpmyhkvjlzhymbluvt
23 kriolxgjuikygxlaktus
24 jqhnkwfithjxfwkzjstr
25 ipgmjvehsgiwevjyirsq

Asi que deducimos que la clave es 3 y probamos con todo el mensaje:

"el cifrado cesar fue nombrado asi en honor a julio cesar quien uso un alfabeto con desplazamiento de tres espacios"

Este es el codigo en python para un ataque por fuerza bruta:

def descifradocesar(cadena,clave):
....resultado=""
....for letra in cadena:
........if letra != ' ':
............aux=ord(letra)-97
............resultado+=chr(((aux-clave)%26)+97)
....return resultado

def ataquecesar(cadena):
....for clave in range(26):
........print str(clave) + " " + descifradocesar(cadena,clave)

cadena=raw_input("Cadena a atacar: ")
ataquecesar(cadena)


Usando las frecuencias de letras:



Segun este grafico las letras aparecen segun el conocido orden EAOSR asi que vamos a probar en nuestro mensaje este orden:

a 0.0
b 0.0
c 0.884955752212
d 9.73451327434
e 1.76991150442
f 4.42477876106
g 3.53982300885
h 10.6194690265
i 2.65486725664
j 0.0
k 0.884955752212
l 5.30973451327
m 0.884955752212
n 0.0
o 3.53982300885
p 1.76991150442
q 6.19469026549
r 9.73451327434
s 1.76991150442
t 0.884955752212
u 5.30973451327
v 7.0796460177
w 2.65486725664
x 4.42477876106
y 0.0
z 0.0

Usando estas frecuencias sustituimos las primeras ocurrencias, es importante darse cuenta de que cuanto mas largo sea el texto cifrado que tenemos mas facil es que acertemos en el analisis de frecuencias, como nuestro texto es pequeño nos quedaremos solo con las mayores
E A O S R N I D L C
h 10.6194690265
d 9.73451327434
r 9.73451327434
v 7.0796460177
q 6.19469026549
u 5.30973451327
l 5.30973451327
f 4.42477876106
x 4.42477876106


e=h
a=d
o=r
s=v
r=u
n=q


hofli udgrf hvdui xhqrp eudgr dvlhq krqru dmxol rfhvd utxlh qxvrx qdoid ehwrf rqghv sodcd plhqw rghwu hvhvs dflrv

eofli ragof esari xenop erago aslen konor amxol ofesa rtxle nxsox naoia eewof onges soaca plenw ogewr esess aflos



Ahora todo es cuestion de ir probando diferentes combinaciones para las letras que quedan siempre sin ovlidarnos de los posibles errores que pudiesemos haber cometido ya, por ejemplo es razonable suponer que las secuencias ago se corresponden con las secuencias ado por lo tanto g=d

eofli radof esari xenop erado aslen konor amxol ofesa rtxle nxsox naoia eewof ondes soaca plenw odewr esess aflos

Tambien es razonable suponer que rado es el final de una palabra asi que podremos separar dicho final del resto que nos quede a la derecha

eofli rado fesari xenop erado aslen konor amxol ofesa rtxle nxsox naoia eewof ondes soaca plenw odewr esess aflos

Tenemos ahora dos secuencias fesar, podemos considerar que se refiere a cesar por lo que f=c



eocli rado cesar ixenop erado aslen konor amxolo cesar txle nxsox naoia eewoc ondes soaca plenw odewr esess aclos

Separamos las palabras que hemos formado para intentar aclarlarlo un poco mas intentando encontrar patrones de palabras conocidas especialmente donde mas letras haya

eocli rado cesar ixenop erado aslen konor amxolo cesar txle nxsox naoia eewoc ondes soaca plenw odewr eses saclos



Si asignamos l=i siguiendo el orden de frecuencias obtendriamos:



eocii rado cesar ixenop erado asien konor amxoio cesar txie nxsox naoia eewoc ondes soaca pienw odewr eses saclos



y seguir probando conbinaciones, hay algunas mas obvias que otras pero se ve desde lejos que esto de descifrar por frecuencias tiene mas de arte que de ciencia y depende mucho de la habilidad del que lo este haciendo para captar los patrones, tambien es muy importante la informacion que sabemos sobre el texto que se ha cifrado, por ejemplo si supiesemos que el cesar del que se habla era julio cesar podriamos haber intentado transformaciones que nos condujesen a julio en alguna parte o si supiesemos que se hablaba de criptografia intentado transformaciones que nos llevasen a cifrado etc.



En este caso estabamos condicionados por que conociamos el texto plano pero en un caso real habria que intentar unas y otras transformaciones hasta ir consiguiendo trozos de texto plano con sentido esto no es tan facil como parece y este es el metodo mas sencillo de cifrado que conozco!!!



Frecuencias de las letras en español
Cifrado Cesar