Solución al último reto de criptografía que he puesto recientemente en este blog y en el que pretendo poner de manifiesto la importancia de la integridad de la información, es decir, de chequear ésta con objeto de asegurar que la información es exactamente la que el remitente nos envió y que ésta no ha sido interceptada y manipulada por un tercero.
Como en los más recientes de los posts de criptografía que he incluido en este blog, en este desafío también se ve involucrado el criptosistema de cifrado simétrico más utilizado, AES ('Advanced Encryption Standard'), en el modo de operación CBC ('Cipher Block Chaining') de los algoritmos de cifrado por bloques.
El enunciado del reto decía lo siguiente:
"Supongamos que he interceptado un criptograma de una organización criminal que sé que se ha obtenido cifrando el texto en claro con AES en modo de operación CBC y, además, que también me las he ingeniado para hacerme con el texto en claro. Los dígitos que en él figuran se corresponden con un número de cuenta bancaria en la que el miembro de la organización al que va destinado este mensaje debe ingresar una importante cantidad del dinero obtenido como consecuencia de las actividades ilícitas llevadas a cabo (ver la información de partida de la que dispongo en los recursos asociados al reto). Si pudiera modificar el criptograma para que el miembro de la organización que lo reciba vea al descifrarlo un número de cuenta mío en lugar del que se le envía entonces podría no volver a trabajar nunca más :). El problema es que desconozco la clave de cifrado/descifrado, ¿me ayudas?. La solución a este reto es el nuevo vector de inicialización y el nuevo criptograma a enviar al receptor del mensaje para que ingrese el dinero en mi cuenta".
Entre los recursos asociados al reto se encuentran los siguientes:
- Criptograma: 9eaef1bbab38643957c7e9ca82d86075
- Vector de inicialización: fe5567e8d769550852182cdf69d74bb1
- Texto en claro (Número de cta.): 4800372564718908
- Mi número de cuenta: 3600538509837891
Como en la solución al reto anterior, antes de pasar a explicar cómo se puede resolver este desafío, comparto cómo lo preparé. Para ello, con objeto de cifrar el texto en claro del reto utilicé una de las muchas herramientas 'online' existentes:
En el gráfico anterior se puede ver toda la información correspondiente al cifrado de la que disponemos para resolver este reto e, incluso, la clave de cifrado/descifrado, pero esto último no lo sabemos :).
Pruebo a descifrarlo para ver si lo he hecho correctamente:
¡Todo listo! ;)
Solución: Dicho lo anterior, me dispongo a intentar resolver el reto.
Para ello, recuerdo el funcionamiento del descifrado en modo de operación CBC ('Cipher Block Chaining') de los algoritmos de cifrado por bloques:
Decía en las pistas que puse para ayudar a resolver este reto que aunque me he permitido una cierta licencia, yo diría que incluso excesiva :), a la hora de poner el título de este reto, posiblemente no se le escape a nadie que me estoy refiriendo al 'bit-flipping attack', que, tal y como nos cuenta wikipedia, puede consistir en que el atacante convierta el mensaje original en otro similar en el que altera cierta información a su conveniencia, y también decía que en este desafío sólo tenemos control sobre los bloques del criptograma (Ci, donde C0 = IV - Vector de inicialización), por lo que la solución a este reto pasa necesariamente por modificar éstos hasta obtener el texto plano deseado.
Para ello, inicialmente, sólo hay que tener presente una cosa: la modificación de un Byte de un bloque del criptograma (Ci) supone una modificación en el mismo Byte del bloque siguiente del texto plano (Pi+1). Decir, además, que dicha modificación supone alterar también, esta vez sin control, el texto plano (Pi) que se obtiene al descifrar el bloque que se ha modificado (Ci) del criptograma, pero como veremos más adelante en el reto no tengo que preocuparme de esto último:
En el reto sólo tenemos C0 = IV y C1, y, por tanto, sólo tengo que modificar C0 para obtener el texto en claro deseado en P1 (cambiar el valor de C0 sólo conlleva, única y exclusivamente, alterar P1). Pero, ¿con qué valor modifico C0 para que el miembro de la organización que reciba el mensaje vea al descifrarlo mi número de cuenta bancaria e ingrese el dinero en ella?. Considerando la siguiente figura:
Creo un pequeño script en python:
import binascii
criptograma_original_hex='9eaef1bbab38643957c7e9ca82d86075'
print '[+] Criptograma original (hex) :',criptograma_original_hex
IV_original_hex='fe5567e8d769550852182cdf69d74bb1'
print '[+] V. inicializ. original(hex) :',IV_original_hex
texto_plano_original_ascii='4800372564718908'
print '[+] Texto plano original (ascii):',texto_plano_original_ascii
texto_plano_original_hex=binascii.hexlify(texto_plano_original_ascii)
print '[+] Texto plano original (hex) :',texto_plano_original_hex
texto_plano_deseado_ascii='3600538509837891'
print '[+] Texto plano deseado (ascii):',texto_plano_deseado_ascii
texto_plano_deseado_hex=binascii.hexlify(texto_plano_deseado_ascii)
print '[+] Texto plano deseado (hex) :',texto_plano_deseado_hex
IV_nuevo_hex="{:02x}".format(int(IV_original_hex,16)^int(texto_plano_original_hex,16)^int(texto_plano_deseado_hex,16))
print '[+] V. inicializ. nuevo (hex) :',IV_nuevo_hex
print '[+] Criptograma nuevo (hex) :',criptograma_original_hex
Lo ejecuto:
Como se ve, tal y como he dicho antes, el bloque 1 del criptograma a enviar no varía respecto al original.
Pero veamos cómo termina esta historia: tras enviar al destinatario el mensaje cifrado éste lo descifra utilizando la clave que conoce:
Y el dinero se ingresa en mi cuenta :).
******** PRÓXIMO RETO
Reto 33: "El secreto está en el relleno".
Como en los más recientes de los posts de criptografía que he incluido en este blog, en este desafío también se ve involucrado el criptosistema de cifrado simétrico más utilizado, AES ('Advanced Encryption Standard'), en el modo de operación CBC ('Cipher Block Chaining') de los algoritmos de cifrado por bloques.
El enunciado del reto decía lo siguiente:
"Supongamos que he interceptado un criptograma de una organización criminal que sé que se ha obtenido cifrando el texto en claro con AES en modo de operación CBC y, además, que también me las he ingeniado para hacerme con el texto en claro. Los dígitos que en él figuran se corresponden con un número de cuenta bancaria en la que el miembro de la organización al que va destinado este mensaje debe ingresar una importante cantidad del dinero obtenido como consecuencia de las actividades ilícitas llevadas a cabo (ver la información de partida de la que dispongo en los recursos asociados al reto). Si pudiera modificar el criptograma para que el miembro de la organización que lo reciba vea al descifrarlo un número de cuenta mío en lugar del que se le envía entonces podría no volver a trabajar nunca más :). El problema es que desconozco la clave de cifrado/descifrado, ¿me ayudas?. La solución a este reto es el nuevo vector de inicialización y el nuevo criptograma a enviar al receptor del mensaje para que ingrese el dinero en mi cuenta".
Entre los recursos asociados al reto se encuentran los siguientes:
- Criptograma: 9eaef1bbab38643957c7e9ca82d86075
- Vector de inicialización: fe5567e8d769550852182cdf69d74bb1
- Texto en claro (Número de cta.): 4800372564718908
- Mi número de cuenta: 3600538509837891
Como en la solución al reto anterior, antes de pasar a explicar cómo se puede resolver este desafío, comparto cómo lo preparé. Para ello, con objeto de cifrar el texto en claro del reto utilicé una de las muchas herramientas 'online' existentes:
En el gráfico anterior se puede ver toda la información correspondiente al cifrado de la que disponemos para resolver este reto e, incluso, la clave de cifrado/descifrado, pero esto último no lo sabemos :).
Pruebo a descifrarlo para ver si lo he hecho correctamente:
¡Todo listo! ;)
Solución: Dicho lo anterior, me dispongo a intentar resolver el reto.
Para ello, recuerdo el funcionamiento del descifrado en modo de operación CBC ('Cipher Block Chaining') de los algoritmos de cifrado por bloques:
Decía en las pistas que puse para ayudar a resolver este reto que aunque me he permitido una cierta licencia, yo diría que incluso excesiva :), a la hora de poner el título de este reto, posiblemente no se le escape a nadie que me estoy refiriendo al 'bit-flipping attack', que, tal y como nos cuenta wikipedia, puede consistir en que el atacante convierta el mensaje original en otro similar en el que altera cierta información a su conveniencia, y también decía que en este desafío sólo tenemos control sobre los bloques del criptograma (Ci, donde C0 = IV - Vector de inicialización), por lo que la solución a este reto pasa necesariamente por modificar éstos hasta obtener el texto plano deseado.
Para ello, inicialmente, sólo hay que tener presente una cosa: la modificación de un Byte de un bloque del criptograma (Ci) supone una modificación en el mismo Byte del bloque siguiente del texto plano (Pi+1). Decir, además, que dicha modificación supone alterar también, esta vez sin control, el texto plano (Pi) que se obtiene al descifrar el bloque que se ha modificado (Ci) del criptograma, pero como veremos más adelante en el reto no tengo que preocuparme de esto último:
En el reto sólo tenemos C0 = IV y C1, y, por tanto, sólo tengo que modificar C0 para obtener el texto en claro deseado en P1 (cambiar el valor de C0 sólo conlleva, única y exclusivamente, alterar P1). Pero, ¿con qué valor modifico C0 para que el miembro de la organización que reciba el mensaje vea al descifrarlo mi número de cuenta bancaria e ingrese el dinero en ella?. Considerando la siguiente figura:
Como:
Dk(C1) = C0 XOR P1
Dk(C1) = C0 XOR P1
Donde: Dk = Función de descifrado;
C1 = Bloque 1 del criptograma original;
C0 = Bloque 0 del criptograma original (IV original);
P1 = Bloque 1 del texto plano original.
Entonces:
C1 = Bloque 1 del criptograma original;
C0 = Bloque 0 del criptograma original (IV original);
P1 = Bloque 1 del texto plano original.
Entonces:
C'0 = C0 XOR P1 XOR P'1
Donde: C'0 = Valor al que hay que modificar C0;
C0 = Bloque 0 del criptograma original (IV original);
P1 = Bloque 1 del texto plano original;
P'1 = Valor deseado para el bloque 1 del texto plano.Creo un pequeño script en python:
import binascii
criptograma_original_hex='9eaef1bbab38643957c7e9ca82d86075'
print '[+] Criptograma original (hex) :',criptograma_original_hex
IV_original_hex='fe5567e8d769550852182cdf69d74bb1'
print '[+] V. inicializ. original(hex) :',IV_original_hex
texto_plano_original_ascii='4800372564718908'
print '[+] Texto plano original (ascii):',texto_plano_original_ascii
texto_plano_original_hex=binascii.hexlify(texto_plano_original_ascii)
print '[+] Texto plano original (hex) :',texto_plano_original_hex
texto_plano_deseado_ascii='3600538509837891'
print '[+] Texto plano deseado (ascii):',texto_plano_deseado_ascii
texto_plano_deseado_hex=binascii.hexlify(texto_plano_deseado_ascii)
print '[+] Texto plano deseado (hex) :',texto_plano_deseado_hex
IV_nuevo_hex="{:02x}".format(int(IV_original_hex,16)^int(texto_plano_original_hex,16)^int(texto_plano_deseado_hex,16))
print '[+] V. inicializ. nuevo (hex) :',IV_nuevo_hex
print '[+] Criptograma nuevo (hex) :',criptograma_original_hex
Lo ejecuto:
Vector de inicialización a enviar (IV = C0) = f95b67e8d16d5f08541523dd66d642b8
Bloque 1 del criptograma a enviar (C1) = 9eaef1bbab38643957c7e9ca82d86075
Como se ve, tal y como he dicho antes, el bloque 1 del criptograma a enviar no varía respecto al original.
Pero veamos cómo termina esta historia: tras enviar al destinatario el mensaje cifrado éste lo descifra utilizando la clave que conoce:
Y el dinero se ingresa en mi cuenta :).
******** PRÓXIMO RETO
Reto 33: "El secreto está en el relleno".
Comentarios
Publicar un comentario