Solucionario al MiniReto de Criptografía por NitRic
Hola Amigos,
Os dejo aquí otro solucionario al minireto propuesto por Ramió en la pregunta 20, en este caso, la solución de NitRic, un nuevo jugador ;)
Saludos Malignos!
Solucionario por NitRic
El texto que me dió es:
Aunque alguien piense que el pasillo se lo va a hacer su padre, es de caballeros reconocer que el Madrid es el justo campeón y que el Barsa ha hecho el ridículo. A un día del humillante pasillo del miércoles 7 de mayo de 2008. Saludos, un culé.
Lo resolví primero sacando la clave con la ayuda. Lo que hice fue antes que nada desencriptar el texto en base64 para obtener la tira de bits encriptada, particularme como dije, la de las palabras repetidas.
Luego separé los bits resultantes en 31 tiras, y cada tira (palabra) me quedó de 7 bytes, es decir de 56 bits.
Cada tira correspondería a cada palabra y desencriptadas (en conjunto) todas deberían ser iguales, por lo tanto, también debería ser igual el primer caracter de cada palabra.
Ahora bien, asumí que el primer bit de la clave es 1 (si no hubiese sido 1, luego al tener la clave completa, sólo tendría que invertir todos sus bits (1 => 0, 0 => 1)) e hice lo siguiente:
Dado que el primer bit de la tira de bits completa (o de la primera tira de bits) es 1, y al asumir que el primer bit de la clave es 1, entonces el bit de la clave cuyo índice es 56 módulo 12 (es decir, el bit de la clave que pasaría por el primer bit de la segunda aparicion de la palabra) debería ser 1 también. Entonces tengo (% = módulo):
clave[(56 * 0) % 12] = 1
clave[(56 * 1) % 12] = 1 también
luego como el primer bit de la tercera aparición de la palabra también es 1, entonces también:
clave[(56 * 3) % 12] = 1
En fin, generalizando esto, tendría para cada bit de la clave:
clave[(56 * i) % 15 ] = tira_de_bits[56 * i]
al probarlo me di cuenta que esto cubría los 15 bits de la clave, por lo que me animé a generalizarlo dentro de un for.
Una vez obtenida la clave, simplemente tuve que hacer el XOR final sobre el texto del reto, y me quedó el texto que aparece arriba.
Acá está el código en python que resuelve el problema (el texto final lo guarda en un archivo ya que al imprimirlo en pantalla no se ven los caracteres con tildes).
Código en python:
from base64 import *
def bin(n):
b = ""
while n != 0:
b += str(n % 2)
n /= 2
return "0" * (8 - len(b)) + b[::-1]
def s2b(s):
b = ""
for d in s:
b += bin(ord(d))
return b
def b2s(b):
s = ""
for i in xrange(0, len(b), 8):
d = b[i:i+8]
s += chr(int(d, 2))
return s
words64 = "/zht21EIFbiU4oJPuijc7ip33lELCqmG+IdPuTfN/DBy3lIUG7uc/YdMpibf5jVy3U0FCaGZ/YRTtzTF4zVxwlwXE6SZ/ptCpS7A4zZu004NFqSa4YpQvyvA4Cl/wVQIFqeF8JhKuivD/zht21EIFbiU4oJPuijc7ip33lELCqmG+IdPuTfN/DBy3lIUG7uc/YdMpibf5jVy3U0FCaGZ/YRTtzTF4zVxwlwXE6SZ/ptCpS7A4zZu004NFqSa4YpQvyvA4Cl/wVQIFqeF8JhKuivD/zht21EIFQ=="
wordsS = b64decode(words64)
wordsB = s2b(wordsS)
for irep in xrange(15):
s = wordsS[irep * len(wordsS) / 31:(irep+1) * len(wordsS) / 31]
print "%02d %s" % (irep, s2b(s))
key = [0] * 15
for i in xrange(15):
key[ (56 * i) % 15 ] = int(wordsB[56 * i])
text64 = "zixww0gBWqmZ9p5KsymM/zB73E4BWrmA9MtGumfc7ip33lELWruQsYdM9jHNrzg+2lwHH7rV4p4DpibI/TwyklgXWqyQsYhCtCbA4zxs3U5ECK2W/oVMtSLeryhr1x0BFui48I9RvyOM6io+11FEEL2G5YQDtSbB/zzt3B0dWrmA9MtGumfu7itt0x0MG+id9IhLuWfJ43ls21mJGb2Z/sUDl2fZ4Xl6X1xEHq2ZsYNWuy7A4zhwxlhECqmG+IdPuWfI6jU+31SNCKua/Y5Q9nCM6zw+31wdFeiR9MsR5neUoXlN01ERHqeGvctWuGfP+jX3nA=="
textS = b64decode(text64)
textB = s2b(textS)
plainB = ""
for i in xrange(len(textB)):
c = str( int(textB[i]) ^ key[i % 15] )
plainB += c
plainS = b2s(plainB)
f = open("solucion.txt", "w")
f.write(plainS)
f.close()
Saludos!
NitRic.
PD: a modo de acompañar la explicación, el programa imprime las primeras 15 tiras de bits de cada palabra encriptada (en conjunto). Por cierto, imprime las primeras 15 palabras encriptadas ya que las siguientes apariciones se repiten (la aparición cuyo índice 15 es igual a la primera aparición, la de índice 16 igual a la segunda, etc).
Os dejo aquí otro solucionario al minireto propuesto por Ramió en la pregunta 20, en este caso, la solución de NitRic, un nuevo jugador ;)
Saludos Malignos!
Solucionario por NitRic
El texto que me dió es:
Aunque alguien piense que el pasillo se lo va a hacer su padre, es de caballeros reconocer que el Madrid es el justo campeón y que el Barsa ha hecho el ridículo. A un día del humillante pasillo del miércoles 7 de mayo de 2008. Saludos, un culé.
Lo resolví primero sacando la clave con la ayuda. Lo que hice fue antes que nada desencriptar el texto en base64 para obtener la tira de bits encriptada, particularme como dije, la de las palabras repetidas.
Luego separé los bits resultantes en 31 tiras, y cada tira (palabra) me quedó de 7 bytes, es decir de 56 bits.
Cada tira correspondería a cada palabra y desencriptadas (en conjunto) todas deberían ser iguales, por lo tanto, también debería ser igual el primer caracter de cada palabra.
Ahora bien, asumí que el primer bit de la clave es 1 (si no hubiese sido 1, luego al tener la clave completa, sólo tendría que invertir todos sus bits (1 => 0, 0 => 1)) e hice lo siguiente:
Dado que el primer bit de la tira de bits completa (o de la primera tira de bits) es 1, y al asumir que el primer bit de la clave es 1, entonces el bit de la clave cuyo índice es 56 módulo 12 (es decir, el bit de la clave que pasaría por el primer bit de la segunda aparicion de la palabra) debería ser 1 también. Entonces tengo (% = módulo):
clave[(56 * 0) % 12] = 1
clave[(56 * 1) % 12] = 1 también
luego como el primer bit de la tercera aparición de la palabra también es 1, entonces también:
clave[(56 * 3) % 12] = 1
En fin, generalizando esto, tendría para cada bit de la clave:
clave[(56 * i) % 15 ] = tira_de_bits[56 * i]
al probarlo me di cuenta que esto cubría los 15 bits de la clave, por lo que me animé a generalizarlo dentro de un for.
Una vez obtenida la clave, simplemente tuve que hacer el XOR final sobre el texto del reto, y me quedó el texto que aparece arriba.
Acá está el código en python que resuelve el problema (el texto final lo guarda en un archivo ya que al imprimirlo en pantalla no se ven los caracteres con tildes).
Código en python:
from base64 import *
def bin(n):
b = ""
while n != 0:
b += str(n % 2)
n /= 2
return "0" * (8 - len(b)) + b[::-1]
def s2b(s):
b = ""
for d in s:
b += bin(ord(d))
return b
def b2s(b):
s = ""
for i in xrange(0, len(b), 8):
d = b[i:i+8]
s += chr(int(d, 2))
return s
words64 = "/zht21EIFbiU4oJPuijc7ip33lELCqmG+IdPuTfN/DBy3lIUG7uc/YdMpibf5jVy3U0FCaGZ/YRTtzTF4zVxwlwXE6SZ/ptCpS7A4zZu004NFqSa4YpQvyvA4Cl/wVQIFqeF8JhKuivD/zht21EIFbiU4oJPuijc7ip33lELCqmG+IdPuTfN/DBy3lIUG7uc/YdMpibf5jVy3U0FCaGZ/YRTtzTF4zVxwlwXE6SZ/ptCpS7A4zZu004NFqSa4YpQvyvA4Cl/wVQIFqeF8JhKuivD/zht21EIFQ=="
wordsS = b64decode(words64)
wordsB = s2b(wordsS)
for irep in xrange(15):
s = wordsS[irep * len(wordsS) / 31:(irep+1) * len(wordsS) / 31]
print "%02d %s" % (irep, s2b(s))
key = [0] * 15
for i in xrange(15):
key[ (56 * i) % 15 ] = int(wordsB[56 * i])
text64 = "zixww0gBWqmZ9p5KsymM/zB73E4BWrmA9MtGumfc7ip33lELWruQsYdM9jHNrzg+2lwHH7rV4p4DpibI/TwyklgXWqyQsYhCtCbA4zxs3U5ECK2W/oVMtSLeryhr1x0BFui48I9RvyOM6io+11FEEL2G5YQDtSbB/zzt3B0dWrmA9MtGumfu7itt0x0MG+id9IhLuWfJ43ls21mJGb2Z/sUDl2fZ4Xl6X1xEHq2ZsYNWuy7A4zhwxlhECqmG+IdPuWfI6jU+31SNCKua/Y5Q9nCM6zw+31wdFeiR9MsR5neUoXlN01ERHqeGvctWuGfP+jX3nA=="
textS = b64decode(text64)
textB = s2b(textS)
plainB = ""
for i in xrange(len(textB)):
c = str( int(textB[i]) ^ key[i % 15] )
plainB += c
plainS = b2s(plainB)
f = open("solucion.txt", "w")
f.write(plainS)
f.close()
Saludos!
NitRic.
PD: a modo de acompañar la explicación, el programa imprime las primeras 15 tiras de bits de cada palabra encriptada (en conjunto). Por cierto, imprime las primeras 15 palabras encriptadas ya que las siguientes apariciones se repiten (la aparición cuyo índice 15 es igual a la primera aparición, la de índice 16 igual a la segunda, etc).
3 comentarios:
Buena solucion!,
Pero si lo he entendido bien creo que esos numeros "12" iniciales deberian ser en realidad 15.
Saludos,
No sabia que nitric era un cule jeje, a aguantarse si eres el mismo nitric que conozco xD(raro que no seas de boca, estudiantes o alguno d esos jeje). Anda que no paras con los retos eh, como sacas tu tanto tiempo xD
est es solo para iluminados es muy divertido desencriptar algo
Publicar un comentario