¿Puedes descifrarme?

  • 3 Respuestas
  • 789 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado 000000 000000

  • *
  • Underc0der
  • Mensajes: 21
  • Actividad:
    6.67%
  • Country: uy
  • Reputación 3
  • Twitter: https://twitter.com/LinuxpowerYT
    • Ver Perfil
    • Linuxpower-web
    • Email

¿Puedes descifrarme?

  • en: Abril 03, 2020, 09:45:42 am
Hola  ;)

Hoy traigo algo bastante especial, estos días he estado programando un cifrador.
Dato: Un cifrado no puede descifrase sabiendo los datos del cifrado de lo contrario es una codificación me explico:

El binario una de las codificaciones más famosas del mundo sabiendo el metodo de codificación podríamos descifrarlo. Pero con AES por ejemplo uno de los cifrados más conocidos aunque conozcamos el metodo de cifrado no podríamos descifralo por esa forma. Sabiendo esto continuemos.

He creado un cifrado, en python3 You are not allowed to view links. Register or Login que tiene una clave y (o al menos se intento)
no se podría descifrar sin romper la clave. Quería proponer intentar descifrar un mensaje para ver si es seguro. De esta forma la comunidad gana porque se puede jugar con el que a mi parecer es interesante y yo gano por los bugs. Win & Win.

Captura del proyecto:

You are not allowed to view links. Register or Login


(ADVERTENCIA: Solo soporta letras minusculas y números.)
Texto cifrado: 309224446557488409754066854545005782200040975244112

Si lo conseguís ponedlo abajo en los comentarios.  :P

Saludos  :)
« Última modificación: Abril 04, 2020, 11:49:48 am por Miguel Alonso »

Desconectado 000000 000000

  • *
  • Underc0der
  • Mensajes: 21
  • Actividad:
    6.67%
  • Country: uy
  • Reputación 3
  • Twitter: https://twitter.com/LinuxpowerYT
    • Ver Perfil
    • Linuxpower-web
    • Email

Re:¿Puedes descifrarme?

  • en: Abril 04, 2020, 11:44:57 am
Hola.
Un amigo dan884075 que no tiene cuenta en underc0de rompió el cifrado por una vulnerabilidad que explicará el, estoy parcheando la versión la publicaré próximamente. Aquí dejo sus palabras:

El texto codificado es: "underc0de"
y la contraseña cualquier combinación de los caracteres: "3yqa a"

Como la contraseña se codificaba como un número, resultante de la suma de números preestablecidos que codificaban los caracteres de la contraseña, la contraseña pasaba a ser un conjunto de caracteres sin importar el orden.

Utilizé este script en python para averiguar la el texto, por fuerza bruta. Se ha conseguido descifrar en 3.23 segundos.

Código: Python
  1. from time import time
  2.  
  3. TEXT_CHARACTERS = (10061, 43487, 49669, 74287, 98953, 75767, 74099, 12457, 32159, 53897, 41263, 60331, 91291, 33403, 43651, 40559, 13921, 40531, 37861, 76091, 77093, 80107, 79861, 91801, 93937, 90397)
  4. TEXT_NUMBERS = (42683, 10037, 20101, 49121, 33151, 17029, 58013, 89867, 91199, 97259)
  5. TEXT_SPACE = 99989
  6.  
  7. KEYS_CHARACTERS = (59077, 77447, 46061, 20897, 48673, 78571, 65963, 15161, 64399, 45497, 91129, 80429, 17377, 42013, 19183, 23099, 22699, 55457, 84871, 84659, 32569, 80777, 52289, 86111, 86291, 37781)
  8. KEYS_NUMBERS = (39443, 89963, 85691, 79273, 49531, 30713, 63059, 59263, 70489, 26647)
  9. KEY_SPACE = 94687
  10.  
  11. TEXTS = set(TEXT_CHARACTERS + TEXT_NUMBERS + (TEXT_SPACE,))
  12. KEYS = KEYS_CHARACTERS + KEYS_NUMBERS + (KEY_SPACE,)
  13.  
  14. MULTIPLIER = 10**(len(str(TEXT_SPACE)))
  15.  
  16. ORD_A = ord("a")
  17. ORD_Z = ord("z")
  18. ORD_0 = ord("0")
  19. ORD_9 = ord("9")
  20.  
  21. class CharacterConverter:
  22.  
  23.    def __init__(self, characters, numbers, space):
  24.       if len(characters) != ORD_Z - ORD_A + 1:
  25.          raise ValueError("longitud de la tupla de caracteres errónea")
  26.  
  27.       if len(numbers) != 10:
  28.          raise ValueError("Longitud de la tupla de números errónea")
  29.  
  30.       self.characters = characters
  31.       self.numbers = numbers
  32.       self.space = space
  33.  
  34.  
  35.    def getNumber(self, character):
  36.       if character == " ":
  37.          return self.space
  38.  
  39.       n = ord(character)
  40.  
  41.       if n >= ORD_0 and n <= ORD_9:
  42.          return self.numbers[n - ORD_0]
  43.  
  44.       elif n >= ORD_A and n <= ORD_Z:
  45.          return self.characters[n - ORD_A]
  46.  
  47.       else:
  48.          raise ValueError("Caracter no válido")
  49.  
  50.    def getCharacter(self, number):
  51.       if number == self.space:
  52.          return " "
  53.  
  54.       elif number in self.numbers:
  55.          return chr(self.numbers.index(number) + ORD_0)
  56.  
  57.       elif number in self.characters:
  58.          return chr(self.characters.index(number) + ORD_A)
  59.  
  60.       else:
  61.          raise ValueError("Número no encontrado")
  62.  
  63.  
  64. TEXT_CONVERTER = CharacterConverter(TEXT_CHARACTERS, TEXT_NUMBERS, TEXT_SPACE)
  65. KEY_CONVERTER = CharacterConverter(KEYS_CHARACTERS, KEYS_NUMBERS, KEY_SPACE)
  66.  
  67. passwordToKey = lambda password: sum(map(KEY_CONVERTER.getNumber, password))
  68.  
  69. def encode(text, password):
  70.    """Codifica el texto que se pasa como parámetro con la contraseña indicada
  71.   text: Texto a codificar
  72.   password: Contraseña para codificar"""
  73.    num = 0
  74.  
  75.    for elem in text:
  76.       num = num * MULTIPLIER + TEXT_CONVERTER.getNumber(elem)
  77.  
  78.    key = passwordToKey(password)
  79.    return num * key
  80.  
  81.  
  82. def decode(encodedCode, password):
  83.    """Decodifica el mensaje con la contraseña indicada y devuelve el texto original
  84.   encodedCode: Mensaje a decodificar
  85.   password: Contraseña para decodificar"""
  86.    key = passwordToKey(password)
  87.  
  88.    num = encodedCode // key
  89.    return numberToText(num)
  90.  
  91.  
  92. def numberToText(num):
  93.    decoded = ""
  94.  
  95.    while num > 0:
  96.       decoded += TEXT_CONVERTER.getCharacter(num % MULTIPLIER)
  97.       num //= MULTIPLIER
  98.  
  99.    return decoded[::-1]
  100.  
  101.  
  102. def decodeGuessingPassword_passAsSet(encodedCode, maxPassSize=4):
  103.    """Devuelve el texto correspondiente a la decodificacion del mennsaje
  104.   prueba con todas las contraseñas hasta la longitud indicada
  105.   Trata las contraseñas como un conjunto de caracteres, sin orden
  106.   encodedCode: Texto codificado
  107.   maxPassSize: Longitud máxima de la contraseña"""
  108.  
  109.    notFound = True
  110.    currentKeyData = <ul class="bbc_list"><li type="circle">[/li][/list]
  111.    curSize = len(currentKeyData)
  112.    maxVal = len(KEYS) - 1
  113.  
  114.    while len(currentKeyData) <= maxPassSize and notFound:
  115.  
  116.       if checkValidDecodedMsg(encodedCode // sum((KEYS[pos] for pos in currentKeyData))):
  117.          notFound = False
  118.  
  119.       else:
  120.          i = 0
  121.          while i < curSize and currentKeyData[i] == maxVal:
  122.             i += 1
  123.  
  124.          if i != curSize:
  125.             currentKeyData[i] += 1
  126.             valCurentKeyData = currentKeyData[i]
  127.  
  128.             for i in range(i - 1, -1, -1):
  129.                currentKeyData[i] = valCurentKeyData
  130.  
  131.          else:
  132.             curSize += 1
  133.             currentKeyData = </li><li type="circle"> * curSize[/li][/list]
  134.  
  135.    if notFound:
  136.       raise ValueError("No se ha podido decodificar")
  137.      
  138.    else:
  139.       return numberToText(encodedCode // sum((KEYS[pos] for pos in currentKeyData))), getPasswordFromKeyData(currentKeyData)
  140.  
  141.  
  142. def checkValidDecodedMsg(msg):
  143.    """Comprueba que el mensaje decodificado, como múmero sea válido
  144.   msg: Mensaje a comprobar"""
  145.    while msg > 0:
  146.       if not msg % MULTIPLIER in TEXTS:
  147.          return False
  148.  
  149.       msg //= MULTIPLIER
  150.  
  151.    return True
  152.  
  153. #Devuelve la contrasena, pasando como parámetro un iterable con las posiciones en KEKS de los valores de la contraseña
  154. getPasswordFromKeyData = lambda KeyData: tuple((KEY_CONVERTER.getCharacter(KEYS[pos]) for pos in KeyData))
  155.  
  156.  
  157. def main():
  158.    coded = 309224446557488409754066854545005782200040975244112
  159.    
  160.    t0 = time()
  161.    print("Mensaje: {}, Contraseña: {}".format(*decodeGuessingPassword_passAsSet(coded, <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" />)) #Aquí al leer el post undercode cambio 8 ))) (pegado) por la ubicación de las gafas de sol.
  162.    print(f"Time: {time() - t0}")
  163.  
  164.  
  165. if __name__ == '__main__':
  166.    main()
  167.  

« Última modificación: Abril 04, 2020, 11:51:43 am por Miguel Alonso »

Desconectado AXCESS

  • *
  • Moderador Global
  • Mensajes: 743
  • Actividad:
    100%
  • Country: 00
  • Reputación 15
    • Ver Perfil
    • Email

Re:¿Puedes descifrarme?

  • en: Abril 06, 2020, 12:11:25 am
Muy interesante…
Muchas gracias por la gentileza de darle seguimiento.

You are not allowed to view links. Register or Login

Desconectado 000000 000000

  • *
  • Underc0der
  • Mensajes: 21
  • Actividad:
    6.67%
  • Country: uy
  • Reputación 3
  • Twitter: https://twitter.com/LinuxpowerYT
    • Ver Perfil
    • Linuxpower-web
    • Email

Re:¿Puedes descifrarme?

  • en: Abril 06, 2020, 11:39:53 am
You are not allowed to view links. Register or Login
Hola  ;)

Hoy traigo algo bastante especial, estos días he estado programando un cifrador.
Dato: Un cifrado no puede descifrase sabiendo los datos del cifrado de lo contrario es una codificación me explico:

El binario una de las codificaciones más famosas del mundo sabiendo el metodo de codificación podríamos descifrarlo. Pero con AES por ejemplo uno de los cifrados más conocidos aunque conozcamos el metodo de cifrado no podríamos descifralo por esa forma. Sabiendo esto continuemos.

He creado un cifrado, en python3 You are not allowed to view links. Register or Login que tiene una clave y (o al menos se intento)
no se podría descifrar sin romper la clave. Quería proponer intentar descifrar un mensaje para ver si es seguro. De esta forma la comunidad gana porque se puede jugar con el que a mi parecer es interesante y yo gano por los bugs. Win & Win.

Captura del proyecto:

You are not allowed to view links. Register or Login


(ADVERTENCIA: Solo soporta letras minusculas y números.)
Texto cifrado: 309224446557488409754066854545005782200040975244112

Si lo conseguís ponedlo abajo en los comentarios.  :P

Saludos  :)
Antes de nada gracias axcess  :D


(El proyecto esta haciéndose por dan884075 y por mi actualmente.)

Hola después de unos días mejorando el cifrado aquí traigo una nueva versión.  :)

MEJORAS:
(Ya no tiene múltiples claves)

Estube hablando con dan884075, su algoritmo de fuerza bruta con esta versión tardaría 24 años en probar todas las combinaciones sabiendo que tenemos 37 caracteres y una password de 8 caracteres 37 elevado a 8 nos salen unas 3512479453921 de probabilidades dijo que python3 es MUY lento que pasándolo a c podría acelerarlo unas 1500 veces  :'( pero aproximadamente son 8 días. Eso esta por ver. La verdad estoy muy contento con el resultado espero que lo disfruten tanto como yo  ;)

Próximas mejoras:

-Crear una librería de python con este cifrado.

-Poder cifrar archivos.(Esto se podría hacer con un par de lineas de código actualmente el problema es que ocuparía mucho más espacio voy a ver la forma de optimizar.)

-Meter todos lo bites así con una clave de 8 caracteres sería 255 elevado a 8: 17878103347812890625 con 10 caracteres de password superariamos en probabilidades a la mismísima maquina enigma tenía 159 trillones de probabilidades esta con 10 caracteres de clave tendría un cuatrillón ciento sesenta y dos mil quinientos veintitrés trillones seiscientos setenta mil ciento noventa y un billones quinientos treinta y tres mil doscientos doce millones ochocientos noventa mil seiscientos veinticinco probabilidades. :o

Saludos.

Nueva versión You are not allowed to view links. Register or Login
« Última modificación: Abril 06, 2020, 11:57:48 am por Miguel Alonso »

 

Qué es la Dark Web, en qué se diferencia con Deep Web y cómo puedes navegar ahi

Iniciado por DUDA

Respuestas: 3
Vistas: 3851
Último mensaje Abril 21, 2017, 11:55:49 am
por DUDA