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: abcdefghijklmnopqrstuvwxyzAsi cada letra del mensaje original se corresponde con una del alfabeto de cifra.
alfabeto de cifra: defghijklmnopqrstuvwxyzabc
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: defghijklmnopqrstuvwxyzabcO usando la aritmetica modular con la operacion contraria a la de cifrado:
alfabeto para descifrar: abcdefghijklmnopqrstuvwxyz
(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