AlexCTF - CR2 Many time secrets (100pts)

Este era el segundo reto de crypto de AlexCTF, el cual consistía en romper el cifrado “one time pad” (OTP).

.0x00 Intro

En este caso la descripción decía lo siguiente:

This time Fady learned from his old mistake and decided to use onetime pad as his encryption technique, but he never knew why people call it one time pad!

Y nos daban un fichero con el siguiente contenido:

0529242a631234122d2b36697f13272c207f2021283a6b0c7908
2f28202a302029142c653f3c7f2a2636273e3f2d653e25217908
322921780c3a235b3c2c3f207f372e21733a3a2b37263b313012
2f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d
283f652c2b31661426292b653a292c372a2f20212a316b283c09
29232178373c270f682c216532263b2d3632353c2c3c2a293504
613c37373531285b3c2a72273a67212a277f373a243c20203d5d
243a202a633d205b3c2d3765342236653a2c7423202f3f652a18
2239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c
263e203d63232f0f20653f207f332065262c3168313722367918
2f2f372133202f142665212637222220733e383f2426386b

.0x01 OTP 101

El cifrado OTP se consigue haciendo XOR del mensaje con una Key. Por lo tanto nos queda algo tal que así:

ciphertext = mensaje xor key

El problema de este cifrado es la reutilización de la misma clave para diferentes mensajes, volviendo a las formulas:

ciphertext1 xor ciphertext2 = (msg1 xor key) xor (msg2 xor key) = msg1 xor msg2

Donde se puede ver que la key pasa a ser irrelevante.

.0x02 Profit!

El proceso de descifrado mediante crib dragging sigue el siguiente flujo:

  1. Adivinar una palabra que pueda aparecer en el texto (crib) y encodearla en hexa.
  2. XOR entre los mensajes cifrados.
  3. XOR entre cada posición de la palabra del primer paso y los textos cifrados.
  4. Si el resultado es legible y parece ser una palabra real, se van añadiendo más palabras/letras en el. En caso contrario, se hace el XOR con la palabra en otra posición.

Por suerte, no era la primera vez que nos encontrabamos ante un reto sobre OTP, así que abrimos el baúl de los recuerdos y utilizamos este script modificado con amor para nuestro reto. El script se divide en dos acciones.

Después de añadir nuestros textos cifrados, se ejecuta para obtener el crib. En nuestro caso hemos usado el ciphertext 322921780c3a235b3c2c3f207f372e21733a3a2b37263b313012 para sacar el crib, que debemos arreglar manualmente:

sed One t*m**p*d encr*pz* => sed One time pad encryptio

En segundo lugar, hardcodeamos el crib en nuestro script y obtenemos el siguiente texto:

Dear Friend This time I u nderstood my mistake and u sed One time pad encryptio n scheme, I,heard that it is the only,encryption met hod that is,mathematically proven to be not cracked ever if the,key is kept se cure, Let Me know if you a gree with mi to use this e ncryption soheme always.

Para obtener la flag simplemente añadimos un print para mostrar la key usada para cifrar el mensaje:

ALEXCTF{HERE_GOES_THE_KEY}

Made with lots of coffee and Hugo.