Sobre Criptoretos II (II)

Bueno, parece ser que nadie intenta resolverlo, o nadie puede, en todo caso, como es aburrido esperar, os daré la solución:

No voy a reescribir lo que ya comenté en el post anterior sobre el Criptoreto II, así que escribo presuponiendo que se ha leído ése post. Sabemos que la clave varía en una cantidad fija cada vez que avanzamos una posición en el texto, y eso nos tendría que dar alguna pista. Bien, podríamos intentar imaginar qué parejas de letras son las menos probables, con lo que también se obtendría fácilmente las diferencias entre letras menos probables. ¿Qué obtenemos con ello? Si analizamos el texto cifrado buscando las diferencias entre letras consecutivas que menos aparecen (lo que menos aparece es la diferencia, no las letras) podremos suponer que también se corresponden con las diferencias menos comunes del texto en claro, suponiendo ésto sólo hace falta restar y obtenemos un valor para K2 (la segunda parte de la clave). (O puede que no sea el valor bueno, entonces cogeríamos la segunda diferencia menos común…).

Bien, ¿Y como sabemos qué diferencias son las menos comunes en el texto en claro si no lo tenemos? Pues no lo sabemos a ciencia cierta, pero las podemos acotar y podemos calcular la media conociendo la cantidad de letras de cada tipo que tiene el mensaje en claro (dato que dí con el reto). Otra forma de hacerlo es por la patilla y suponer que los pares de letras que menos aparecen son los pares de letras iguales, es decir, diferencia 0. En este caso particular se da la casualidad de que no sólo son las menos, si no que además no se da ni un caso, con lo que en la lista de diferencias ese 0 resalta claramente (haciendo sospechar).

Bien, analizando el mensaje el 0 (o mínimo) apareció en la diferencia 23. De eso deduzco que el valor de K2 es 23, ya que como (suponemos) no aparecen nunca dos letras iguales seguidas en el texto en claro y nunca aparecen dos letras con diferencia 23 seguidas en el texto cifrado hay una probable correlación.

Una vez hemos obtenido K2, lo que se hace es ir restando módulo 40 a las letras del mensaje cifrado, a la primera no se le resta nada, a la segunda se le resta 23, a la tercera (23*2)mod40, y así hasta la n-ésima restándole (23*(n-1))mod40. Hecho esto podemos aplicar un simple ataque estadístico buscando pares de conjuntos de letras que tengan la misma probabilidad de aparición, uno en el texto en claro y otro en el cifrado. Para las demás letras sólo haría falta calcular la clave K1 y no tener que buscar esas relaciones. K1 se puede buscar restando a una letra del mensaje cifrado su letra correspondiente del mensaje en claro.

Y bueno, para los listillos que no quieran trabajar, también se puede imaginar uno que todo texto medianamente correcto termina con un punto, así que, ¿Por qué no probar a ver si la última letra es un punto? Si fuera así no tendríamos que contar letritas, sólo tendríamos que restar el valor numérico del punto a la última letra del mensaje para obtener K1, y ya estaríamos.

Como véis ésto no es una ciencia ni mucho menos exacta, si se quiere ir rápido se pueden hacer supuestos (y luego ya veremos si nos hemos equivocado o no), y bueno, si se quiere ser puntill0so, también se puede hacer sin supuestos, lo del punto final no es necesario, y lo de las letras seguidas tampoco. Un rato más de cálculo muestra lo mismo, las letras iguales aparecen juntas con probabilidad baja.

Otro día con más tiempo explico como se hace para detectar el sistema de cifrado (que tal vez sea lo más complicado).

Hasta otra, y bueno, otra vez le dedico este post a Chisposo, ya que sin él no habría cifrado el mensaje.

Chisposo ha muerto :(

Siento anunciar que uno de mis seres más queridos falleció ayer a las 10:30 de la mañana después de haber estado funcionando ininterrumpidamente durante 24 horas. Se trata de Chisposo, mi portátil, parece ser que quería cumplir el dicho “Muere joven y deja un cadáver bonito”.

Tenía ahora poco más de un año, llegó a mi vida después de navidad (no la pasada, sino la anterior) y desde entonces hemos sido inseparables, hemos estado juntos en los buenos y en los malos momentos (cuando lo conocí estaba infectado con Windows XP y todos los frikis lo repudiaban), y es por ello que dedico hoy ésta entrada a mi querido chisposo (de hecho no tenía nombre hasta hoy que se me ha ocurrido ponerle uno para recordarlo mejor).

Descanza en paz Chiposo.

P.D.: Para los morbosos mañana ésta tarde (al final han pasado 2 semanas :p) cuelgo una imagen de Chisposo destripado.

No vam celebrar la diada de PI!!!

Avui he descobert que ahir era la diada de PI (amb pàgina web pròpia i tot http://www.piday.org/) !! Mes 3, dia 14. Els americanets escriuen la data de forma que recorda molt al mític número: mes.any, així queda 3.14 . Ara bé, podriem frikejar una mica més i fins i tot instaurar el minut i el segon ( 1:59:26 p.m. ) jejeje.

Sembla ser que l’any 1988 (l’any que van néixer la majoria dels companys de curs i jo mateix :D ) es va iniciar aquesta tradició al ‘Museu de Ciencies de SanFrancisco’ per una iniciativa d’un físic anomenat Larry Shaw.

Que hi farem, a veure si l’any que vé ho celebrem com és degut i ho transformem també en tradició a la UAB :D .

La noticia l’he trobat a http://www.alt1040.com

Apa, paseu-vos-ho molt bé aquestes vacances :D!.

Sobre el Criptoreto II

Hola, :p, parece que no sale muy bién ésto de descifrar el mensaje, así que bueno, he decidido explicar almenos el mecanismo utilizado, (que no las claves) para facilitar la tarea.

En el sistema de cifrado anterior, lo que hacíamos era lo siguiente: si A és el alfabeto utilizado , M = (m1m2…mn) el mensaje en claro, C = (c1c2…cn) el mensaje cifrado, y K la clave, cada letra ci del mensaje cifrado era de la forma ci=(mi+K)mod|A| . Donde |A| denota el cardinal de A, o lo que es lo mismo, la cantidad de letras de que consta.

En el segundo criptoreto lo que he hecho es hacer que se sume un número diferente para cada mi. ¿Cómo? Bien, no he hecho una clave tan larga como el mensaje ni mucho menos, de hecho solo he utilizado dos números. K = (K1, K2). Y cada letra del mensaje cifrado la podemos calcular así:

ci=(mi+ki)mod|A|
Donde cada ki és de la forma ki=(ki-1+K2)mod|A| . Gráficamente se podría entender como si estuviéramos utilizando un rotor con el alfabeto ordenado puesto en su perímetro y que girara a cada vuelta K2 posiciones.

por cierto, escribo una función python por si la queréis implementar para probar el mecanismo:

def cifra(msg, K1, K2):
alf = " ,.:ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
cmsg = ""
k = K1

i = 0
while i < len(msg):
cmsg += alf[(alf.index(msg[i])+k)%len(alf)]
k = (k+K2)%len(alf)
i += 1

return cmsg

def descifra(cmsg, K1, K2):
alf = " ,.:ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
msg = ""
k = K1

i = 0
while i < len(cmsg):
msg += alf[(alf.index(cmsg[i])-k)%len(alf)]
k = (k+K2)%len(alf)
i += 1

return msg

Criptoretos II

Bueno, parece ser que ha sido fácil adivinar cual era el mensaje escondido, así que tendré que poner otro! :D Ésta vez será más largo y utilizaré un mejor sistema de cifrado (aunque similar al anterior).

Antes que nada, os diré qué alfabeto utilizo, para que sepáis qué letras pueden aparecer y cuales no, y además qué posición ocupan para facilitar los cálculos :) . El alfabeto es el siguiente (entre comillas) :

” ,.:ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789″
Como podéis ver, el alfabeto tiene 40 carácteres, que corresponderán con los números del 0 al 39 con el mismo orden en el que aparecen. Para hacerlo más fácil os diré la probabilidad de aparición de cada letra, pero antes el mensaje:
‘XNVU91PUM4FKT8XM617MRCR2Y,5 XC5M’

‘.S,9LJ4 PW.EE8JYUAG24C.SXK3TH1JF’

‘PHTIXC6QGODYZEJ 6V3Z:2OR:4U22S7I’

‘EY3,::N2HJRRXC5M.S,9LJ4 PF3T10B7′

‘V0S N86EXMEQU0B63NR ZUB1PWTDH02K’

‘ .2WJKMUUFNKM8BRXXN2D:TY1OV Z0B1′

‘GW,2S0ZE,O:EGOMYOWZMT8XY:ZEY:SQ2′

‘H 2AEKZQIOF9DIVO.G,I1OK:HDRG69R2′

‘XYM7NSVIP49ET13IN.NYU716TNVXIWJY’

‘UAFE3BBPBGXC9,FFL47U1C5M.S,9LJ4 ‘

‘PU3E7WC,HWLG28BRXXN2D:TYOCWEAKC5′

‘:Q,:VHJ.1GC1FL75DWLDPTZA526M0RCQ’

‘A6′


El mensaje lo he separado en línieas delimitadas por el símbolo (para que se vieran los espacios), pero tiene que unirse todo sin esos símbolos para poder descifrarse.

Ahora os indico la probabilidad de aparición de cada símbolo, por si os va bien saber qué letras tiene y qué letras no tiene el mensaje:
‘ ‘ : 0.183937823834
‘,’ : 0.0155440414508
‘.’ : 0.00777202072539
‘:’ : 0.00259067357513
‘A’ : 0.103626943005
‘B’ : 0.0
‘C’ : 0.0388601036269
‘D’ : 0.0284974093264
‘E’ : 0.119170984456
‘F’ : 0.0103626943005
‘G’ : 0.0
‘H’ : 0.0
‘I’ : 0.0336787564767
‘J’ : 0.00518134715026
‘K’ : 0.0
‘L’ : 0.0518134715026
‘M’ : 0.0414507772021
‘N’ : 0.0440414507772
‘O’ : 0.0569948186528
‘P’ : 0.0310880829016
‘Q’ : 0.0103626943005
‘R’ : 0.0673575129534
‘S’ : 0.0414507772021
‘T’ : 0.0310880829016
‘U’ : 0.0440414507772
‘V’ : 0.0129533678756
‘W’ : 0.0
‘X’ : 0.0
‘Y’ : 0.00259067357513
‘Z’ : 0.0
‘0’ : 0.00259067357513
‘1’ : 0.00259067357513
‘2’ : 0.00259067357513
‘3’ : 0.00259067357513
‘4’ : 0.00259067357513
‘5’ : 0.0
‘6’ : 0.0
‘7’ : 0.0
‘8’ : 0.0
‘9’ : 0.00259067357513

P.D.: Como visto así parece que me he pasado para ser el segundo criptoreto, no dudéis en preguntar ;). En uno o dos días cuelgo el código fuente del programa que he hecho para cifrar esto, puede que os sirva.