Ir al contenido principal

Criptografía (CXXIX): Solución Reto 27

El  enunciado del reto de criptografía que puse en este post era el siguiente:

"Como en otros retos que he puesto en este blog, la persona que aparece en la imagen que ilustra este post nos dirá qué criptosistema se ve involucrado, lo que además confirmaremos con la pista dada al inicio. Una vez que hayas averiguado lo anterior, supón que interceptas el siguiente criptograma:
"ZVMVCWQKXVUNPOHOKUOJTSZLGIULKCBQALFQFGBFILXIBWGC",
y que además sabes o infieres que el inicio del mismo se corresponde con el siguiente texto en claro: “THESOLUTION”.¿Puedes descifrar el criptograma y obtener así la solución de este reto?".

SoluciónEn el enunciado decía que si sabes o averiguas quién es la persona que aparece en la imagen que ilustra este post entonces también sabrás el criptosistema involucrado en este reto. Pues bien, busco con 'Google imágenes' y obtengo:
Este resultado coincide con lo que se dice al inicio del post en el que se enunció este reto respecto a que el criptosistema involucrado fue inventando por un matemático americano, y la Wikipedia nos cuenta que entre las notables aportaciones de Lester S. Hill se encuentra el conocido como cifrado de Hill.

Una vez que hemos averiguado que el texto en claro se ha cifrado utilizando el criptosistema ideado por Hill en 1929 y suponiendo, por lo que conocemos de él y por el criptograma, que está escrito en inglés y que el alfabeto utilizado se reduce a las letras mayúsculas de dicho idioma (A = 0, B = 1, C = 2, ..., Z = 25), implemento el ataque de 3 maneras diferentes:

1.- Mediante "lápiz y papel", es decir, manualmente.
2.- Utilizando una herramienta especializada.
3.- Creando un pequeño script en python para resolver el reto.

Pero antes que nada recordar que el cifrado de Hill funciona multiplicando una matriz (K) cuadrada de orden k (k filas y k columnas), que se utiliza como clave para cifrar, por cada uno de los bloques de longitud k del texto en claro (M), mientras que el descifrado se realiza multiplicando la matriz inversa de la que se ha empleado como clave en el cifrado (K−1)  por cada uno de los bloques de longitud k del mensaje cifrado o criptograma (C).

Tanto el cifrado como el descifrado se producen en el módulo (n) correspondiente al tamaño del alfabeto (en nuestro caso el número de caracteres en mayúsculas del idioma inglés, es decir, 26).

Dicho lo anterior, si conocemos parte del texto en claro y su correspondiente texto cifrado, siempre que podamos conocer el alfabeto utilizado, es decir, el módulo (n), y determinar el orden (k) de la matriz cuadrada empleada como clave (K), o lo que es lo mismo el tamaño del bloque (número de símbolos del texto en claro / criptograma que se cifran / descifran de forma simultánea - bigramas, trigramas, etc.), a partir de una matriz con el texto claro conocido (M) podemos calcular la matriz K−1 con la que descifrar el criptograma (C), de la siguiente manera:
C = K M
K = M-1 C
K-1 sería la matriz de descifrado

1.- Solución manual ("Lápiz y papel"):

Tal y como he dicho, para implementar este ataque es necesario conocer el orden (k) de la matriz cuadrada empleada como clave (K) o, lo que es lo mismo, el tamaño del bloque, y sabemos que éste tiene que ser un factor del número de caracteres del texto cifrado (C). Es decir, en nuestro caso 48, tamaño del criptograma, tiene que ser múltiplo de k. Así que nuestros posibles valores de tamaño de bloque son: 2, 3, 4, 6, 8, 12, 16, 24, 48.

También sabemos que, debido a que la matriz utilizada como clave (K) es cuadrada (k x k), para que este ataque pueda prosperar necesitamos tener al menos k2 letras de texto plano conocido (en nuestro caso conocemos 11 caracteres, “THESOLUTION”). Por tanto:
22 = 4; 4 < 11
32 = 9; 9 < 11
42 = 16; 16 > 11
...
Esto significa que para que podamos tener éxito con este ataque, se debe haber utilizado un tamaño de bloque de 2 ó 3, ya que si éste fuera mayor no conoceríamos los suficientes caracteres del texto en claro para resolver este reto y esto no tendría ninguna gracia :).

Cuatro caracteres como clave me parecen pocos, por lo que voy a suponer inicialmente que la clave utilizada tiene 9 caracteres (3 x 3), y si no consigo nada probaré con 4.

Ya que estamos trabajando con una matriz de 3 × 3, nuestro texto claro conocido, "THESOLUTION", se reduce a una longitud de bloque 9 (3 x 3): "THESOLUTI".

Por tanto, la matriz (M) con el texto claro conocido sería:
O utilizando la posición relativa de cada uno de esos caracteres en el alfabeto inglés (A = 0, B = 1, C = 2, ..., Z = 25):
Lo primero que hay que hacer es obtener la matriz inversa (M-1) de la matriz con el texto claro conocido (M). Para ello utilizo la siguiente fórmula:
Donde:
M-1: matriz inversa de M (matriz con el texto claro conocido).
CT: matriz de cofactores de M transpuesta.
|M|: determinante de M, que debe calcularse en mod n (tamaño del alfabeto), en nuestro caso en módulo 26.
(|M|)-1: inverso del determinante de la matriz M. Debe calcularse en mod (tamaño del alfabeto), en nuestro caso en módulo 26.

Por tanto:
Por otra parte, la matriz (C) con la parte del criptograma correspondiente al texto claro conocido sería:
O utilizando la posición relativa de cada uno de esos caracteres en el alfabeto inglés (A = 0, B = 1, C = 2, ..., Z = 25):
Ahora calculamos (M-1 C) mod 26:
(11 x 25 + 24 x 21 +   7 x 16) mod 26 = (275 + 504 + 112) mod 26 = 891 mod 26 = 7
(11 x 21 + 24 x   2 +   7 x 10) mod 26 = (231 +   48 +   70) mod 26 = 349 mod 26 = 11
(11 x 12 + 24 x 22 +   7 x 23) mod 26 = (132 + 528 + 161) mod 26 = 821 mod 26 = 15
(8   x 25 + 24 x 21 + 15 x 16) mod 26 = (200 + 504 + 240) mod 26 = 944 mod 26 = 8
(8   x 21 + 24 x   2 + 15 x 10) mod 26 = (168 +   48 + 150) mod 26 = 366 mod 26 = 2
(8   x 12 + 24 x 22 + 15 x 23) mod 26 = (  96 + 528 + 345) mod 26 = 969 mod 26 = 7
(12 x 25 + 13 x 21 + 12 x 16) mod 26 = (300 + 273 + 192) mod 26 = 765 mod 26 = 11
(12 x 21 + 13 x   2 + 12 x 10) mod 26 = (252 +   26 + 120) mod 26 = 398 mod 26 = 8
(12 x 12 + 13 x 22 + 12 x 23) mod 26 = (144 + 286 + 276) mod 26 = 706 mod 26 = 4
Y he obtenido la matriz transpuesta (KT) de la utilizada como clave (K) en el cifrado, por lo que esta última sería:
Y ahora estoy ya en disposición de calcular la matriz de descifrado, que es la inversa (K-1) de esta última matriz obtenida.
Donde:
K-1: matriz inversa de K (matriz con la clave utilizada en el cifrado).
CT: matriz de cofactores de K transpuesta.
|K|: determinante de K, que debe calcularse en mod n (tamaño del alfabeto), en nuestro caso en módulo 26.
(|K|)-1: inverso del determinante de la matriz K. Debe calcularse en mod (tamaño del alfabeto), en nuestro caso en módulo 26.


El proceso para realizar este cálculo es el mismo que el desarrollado más arriba para obtener M-1, por lo que me limito a indicar únicamente el resultado que se obtiene:
Y, finalmente, desciframos el criptograma. Como k = 3 procedo por bloques de 3 caracteres del criptograma.

Para el primer grupo de tres caracteres:
m1 = (12 x 25 +   5 x 21 + 22 x 12) mod 26 = 300 + 105 + 264 = 669 mod 26 = 19 =  T
m2 = (20 x 25 +   5 x 21 + 13 x 12) mod 26 = 500 + 105 + 156 = 761 mod 26 =   7 =  H
m3 = (11 x 25 +   5 x 21 + 12 x 12) mod 26 = 275 + 105 + 144 = 524 mod 26 =   4 =  E

Y así sucesivamente con el resto de bloques o grupos de tres caracteres del criptograma:

m4 = (12 x 21 +   5 x   2 + 22 x 22) mod 26 = 252 +   10 + 484 = 746 mod 26 = 18 =  S
m5 = (20 x 21 +   5 x   2 + 13 x 22) mod 26 = 420 +   10 + 286 = 716 mod 26 = 14 =  O
m6 = (11 x 21 +   5 x   2 + 12 x 22) mod 26 = 231 +   10 + 264 = 505 mod 26 = 11 =  L

m7 = (12 x 16 +   5 x 10 + 22 x 23) mod 26 = 192 +   50 + 506 = 748 mod 26 = 20 = U
m8 = (20 x 16 +   5 x 10 + 13 x 23) mod 26 = 320 +   50 + 299 = 669 mod 26 = 19 = T
m9 = (11 x 16 +   5 x 10 + 12 x 23) mod 26 = 176 +   50 + 276 = 502 mod 26 =   8 = I

m10 = (12 x 21 + 5 x 20 + 22 x 13) mod 26 = 252 + 100 + 286 = 638 mod 26 = 14 = O
m11 = (20 x 21 + 5 x 20 + 13 x 13) mod 26 = 420 + 100 + 169 = 689 mod 26 = 13 = N
m12 = (11 x 21 + 5 x 20 + 12 x 13) mod 26 = 231 + 100 + 156 = 487 mod 26 = 19 = T

m13 = (12 x 15 + 5 x 14 + 22 x   7) mod 26 = 180 +   70 + 154 = 404 mod 26 = 14 = O
m14 = (20 x 15 + 5 x 14 + 13 x   7) mod 26 = 300 +   70 +   91 = 461 mod 26 = 19 = T
m15 = (11 x 15 + 5 x 14 + 12 x   7) mod 26 = 165 +   70  +  84 = 319 mod 26 =   7 = H

m16 = (12 x 14 + 5 x 10 + 22 x 20) mod 26 = 168 +   50 + 440 = 658 mod 26 =   8 = I
m17 = (20 x 14 + 5 x 10 + 13 x 20) mod 26 = 280 +   50 + 260 = 590 mod 26 = 18 = S
m18 = (11 x 14 + 5 x 10 + 12 x 20) mod 26 = 154 +   50 + 240 = 444 mod 26 =   2 = C

m19 = (12 x 14 + 5 x  9 + 22 x 19) mod 26 = 168 +    45 + 418 = 631 mod 26 =  7 = H
m20 = (20 x 14 + 5 x  9 + 13 x 19) mod 26 = 280 +    45 + 247 = 572 mod 26 =  0 = A
m21 = (11 x 14 + 5 x  9 + 12 x 19) mod 26 = 154 +    45 + 228 = 427 mod 26 = 11 = L

m22 = (12 x 18 + 5 x 25 + 22 x 11) mod 26 = 216 + 125 + 242 = 583 mod 26 = 11 = L
m23 = (20 x 18 + 5 x 25 + 13 x 11) mod 26 = 360 + 125 + 143 = 628 mod 26 =   4 = E
m24 = (11 x 18 + 5 x 25 + 12 x 11) mod 26 = 198 + 125 + 132 = 455 mod 26 = 13 = N

m25 = (12 x   6 + 5 x  8 + 22 x 20) mod 26 =   72 +    40 + 440 = 552 mod 26 =   6 = G
m26 = (20 x   6 + 5 x  8 + 13 x 20) mod 26 = 120 +    40 + 260 = 420 mod 26 =   4 = E
m27 = (11 x   6 + 5 x  8 + 12 x 20) mod 26 =   66 +    40 + 240 = 346 mod 26 =   8 = I

m28 = (12 x 11 + 5 x 10 + 22 x   2) mod 26 = 132 +   50 +   44 = 226 mod 26 = 18 = S
m29 = (20 x 11 + 5 x 10 + 13 x   2) mod 26 = 220 +   50 +   26 = 296 mod 26 = 10 = K
m30 = (11 x 11 + 5 x 10 + 12 x   2) mod 26 = 121 +   50 +   24 = 195 mod 26 = 13 = N

m31 = (12 x   1 + 5 x 16 + 22 x   0) mod 26 =   12 +   80 +     0 =   92 mod 26 = 14 = O
m32 = (20 x   1 + 5 x 16 + 13 x   0) mod 26 =   20 +   80 +     0 = 100 mod 26 = 22 = W
m33 = (11 x   1 + 5 x 16 + 12 x   0) mod 26 =   11 +   80 +     0 =   91 mod 26 = 13 = N

m34 = (12 x 11 + 5 x  5 + 22 x 16) mod 26 = 132 +   25  + 352 = 509 mod 26 = 15 = P
m35 = (20 x 11 + 5 x  5 + 13 x 16) mod 26 = 220 +   25  + 208 = 453 mod 26 = 11 = L
m36 = (11 x 11 + 5 x  5 + 12 x 16) mod 26 = 121 +   25  + 192 = 338 mod 26 =   0 = A

m37 = (12 x   5 + 5 x  6 + 22 x   1) mod 26 =   60 +   30  +   22 = 112 mod 26 =   8 = I
m38 = (20 x   5 + 5 x  6 + 13 x   1) mod 26 = 100 +   30  +   13 = 143 mod 26 = 13 = N
m39 = (11 x   5 + 5 x  6 + 12 x   1) mod 26 =   55 +   30  +   12 =   97 mod 26 = 19 = T

m40 = (12 x   5 + 5 x  8 + 22 x 11) mod 26 =   60 +   40  + 242 = 342 mod 26 =   4 = E
m41 = (20 x   5 + 5 x  8 + 13 x 11) mod 26 = 100 +   40  + 143 = 283 mod 26 = 23 = X
m42 = (11 x   5 + 5 x  8 + 12 x 11) mod 26 =   55 +   40  + 132 = 227 mod 26 = 19 = T

m43 = (12 x 23 + 5 x 8 + 22 x    1) mod 26 = 276 +   40  +   22 = 338 mod 26 =   0 = A
m44 = (20 x 23 + 5 x 8 + 13 x    1) mod 26 = 460 +   40  +   13 = 513 mod 26 = 19 = T
m45 = (11 x 23 + 5 x 8 + 12 x    1) mod 26 = 253 +   40  +   12 = 305 mod 26 = 19 = T

m46 = (12 x 22 + 5 x 6 + 22 x    2) mod 26 = 264 +   30  +   44 = 338 mod 26 =   0 = A
m47 = (20 x 22 + 5 x 6 + 13 x    2) mod 26 = 440 +   30  +   26 = 496 mod 26 =   2 = C
m48 = (11 x 22 + 5 x 6 + 12 x    2) mod 26 = 242 +   30  +   24 = 296 mod 26 = 10 = K

Es decir, el texto en claro es:

THESOLUTIONTOTHISCHALLENGEISKNOWNPLAINTEXTATTACK

O, lo que es lo mismo:

THE SOLUTION TO THIS CHALLENGE IS KNOWN PLAINTEXT ATTACK

Por tanto, la solución a este reto es: KNOWN PLAINTEXT ATTACK.

2.- Solución mediante una herramienta especializada:

Utilizo la herramienta CrypTool (versión 1.4.40).

Tras introducir el criptograma realizo un ataque con texto claro conocido (introduciendo "THESOLUTI" como texto claro y "ZVMVCWQKX" como su correspondiente texto cifrado):
Como se observa en la figura anterior, la herramienta nos devuelve la matriz con la clave utilizada (tanto con los caracteres del alfabeto como con sus correspondientes valores numéricos).

Finalmente, desciframos el criptograma:
Por tanto, la solución a este reto es: KNOWN PLAINTEXT ATTACK.

3.- Solución creando un script de python:

from sympy import Matrix, pprint

alfabeto='ABCDEFGHIJKLMNOPQRSTUVWXYZ'

n=len(alfabeto)
print ''
print '[+] Modulo (n):', n

M = Matrix([
  [ 19,  7,  4 ],
  [ 18, 14, 11 ],
  [ 20, 19,  8 ]
])
print '[+] Matriz con texto claro conocido (M):'
pprint(M)

M_inv = M.inv_mod(26)
print "[+] Matriz inversa de M (M'):"
pprint(M_inv)

C = Matrix([
  [ 25, 21, 12 ],
  [ 21,  2, 22 ],
  [ 16, 10, 23 ]
])
print '[+] Matriz con criptograma correspondiente a texto claro conocido (C):'
pprint(C)

K = M_inv * C
for i in range(len(K)):
   K[i]=K[i]%n
print '[+] Matriz transpuesta de la utilizada como clave en el cifrado (Kt):'
pprint(K)

K = K.transpose()
print '[+] Matriz con la clave utilizada en el cifrado (K):'
pprint(K)

K_inv = K.inv_mod(26)
print "[+] Matriz inversa de K (K'):"
pprint(K_inv)

C = Matrix([
[25, 21, 12, 21, 2, 22, 16, 10, 23, 21, 20, 13, 15, 14, 7, 14, 10, 20,
 14, 9, 19, 18, 25, 11, 6, 8, 20, 11, 10, 2, 1, 16, 0, 11, 5, 16, 5, 6,
 1, 5, 8, 11, 23, 8, 1, 22, 6, 2]
])
print '[+] Criptograma (C):'
pprint(C)

texto_claro=''
i=0
while i  < len(C):
   Ci = Matrix([C[i],C[i+1],C[i+2]])
   Mi = K_inv * Ci
   for j in range(len(Mi)):
      texto_claro = texto_claro + alfabeto[Mi[j]%n:Mi[j]%n+1]
   i+=3
print '[+] Texto en claro (M):', texto_claro

Y tras ejecutar este script ya puedo ver que la solución a este reto es: KNOWN PLAINTEXT ATTACK.

******** PRÓXIMO RETO
Reto 28: "¿Más seguro cuantos más primos?".

Comentarios

Entradas populares de este blog

Criptografía (I): cifrado Vigenère y criptoanálisis Kasiski

Hace unos días mi amigo Iñaki Regidor ( @Inaki_Regidor ), a quien dedico esta entrada :), compartió en las redes sociales un post titulado "Criptografía: el arte de esconder mensajes"  publicado en uno de los blogs de EiTB . En ese post se explican ciertos métodos clásicos para cifrar mensajes , entre ellos el cifrado de Vigenère , y , al final del mismo, se propone un reto consistente en descifrar un mensaje , lo que me ha animado a escribir este post sobre el método Kasiski  para atacar un cifrado polialfabético ( conociendo la clave descifrar el mensaje es muy fácil, pero lo que contaré en este post es la forma de hacerlo sin saberla ). El mensaje a descifrar es el siguiente: LNUDVMUYRMUDVLLPXAFZUEFAIOVWVMUOVMUEVMUEZCUDVSYWCIVCFGUCUNYCGALLGRCYTIJTRNNPJQOPJEMZITYLIAYYKRYEFDUDCAMAVRMZEAMBLEXPJCCQIEHPJTYXVNMLAEZTIMUOFRUFC Como ya he dicho el método de Vigenère es un sistema de sustitución polialfabético , lo que significa que, al contrario que en un sistema de

Criptografía (XXIII): cifrado de Hill (I)

En este post me propongo explicar de forma comprensible lo que he entendido sobre el cifrado de Hill , propuesto por el matemático Lester S. Hill , en 1929, y que se basa en emplear una matriz como clave  para cifrar un texto en claro y su inversa para descifrar el criptograma correspondiente . Hay tres cosas que me gustan de la criptografía clásica, además de que considero que ésta es muy didáctica a la hora de comprender los sistemas criptográficos modernos: la primera de ellas es que me "obliga" a repasar conceptos de matemáticas aprendidos hace mucho tiempo y, desgraciadamente, olvidados también hace demasiado tiempo, y, por consiguiente, que, como dice  Dani , amigo y coautor de este blog, me "obliga" a hacer "gimnasia mental"; la segunda es que, en la mayoría de las ocasiones, pueden cifrarse y descifrase los mensajes, e incluso realizarse el criptoanálisis de los criptogramas, sin más que un simple lápiz y papel, es decir, para mi es como un pasat

¿Qué significa el emblema de la profesión informática? (I)

Todas o muchas profesiones tienen un emblema que las representa simbólicamente y en el caso de la  informática: " es el establecido en la resolución de 11 de noviembre de 1977  para las titulaciones universitarias superiores de informática, y  está constituido por una figura representando en su parte central  un  núcleo toroidal de ferrita , atravesado por  hilos de lectura,  escritura e inhibición . El núcleo está rodeado por  dos ramas : una  de  laurel , como símbolo de recompensa, y la otra, de  olivo , como  símbolo de sabiduría. La  corona  será la  de la casa real  española,  y bajo el escudo se inscribirá el acrónimo de la organización. ". Veamos los diferentes elementos tomando como ejemplo el emblema del COIIE/EIIEO (Colegio Oficial de Ingenieros en Informática del País Vasco/ Euskadiko Informatikako Ingeniarien Elkargo Ofiziala ) . Pero no sólo el COIIE/EIIEO adopta el emblema establecido en dicha resolución, sino que éste se adopta también como im