Foros:
Por LlamameX
Como os veo ociosos ahí va mi venganza.
RUBIK2

Bueno, tras el vapuleo del pobre CHE he decidido dejar los cifrados de flujo y pasarme a los de bloque. Con esa idea he rescatado una propuesta antigua y le he afilado los dientes y las garras para que tenga un oportunidad con vosotros. Se trata de RUBIK2, un algoritmo que tiene tres fuentes de cifrado: Un XOR entre grupos de caracteres, una sustitución (fija, en el fondo no soy tan malo) oculta y una transposición variable. La gracia es que para la transposición se usa un cubo de Rubik...
El algoritmo:
Le hacemos a la clave y al alfabeto el mismo pretratamiento que para el CHE, es decir desorden+protección+desorden según (me lo copio)
Pretratamiento
Desordenar el alfabeto base
El alfabeto base se desordena del mismo modo en que se hacía en MIMIC, es decir, se usa la clave como índice para ir extrayendo letras del alfabeto base, saltando tantas letras como la posición del caracter de la clave que estemos usando. Los saltos son cíclicos y si agotamos la clave volvemos a empezarla. Cuando hayamos extraido todas las letras habremos compuesto el alfabeto desordenado y habremos acabado. Por ejemplo, con la clave SANCHO haremos:
Primer carácter de la clave "S"=19. Avanzamos por el alfabeto base hasta la posición 19 obtenemos "S". Será el primer carácter del desordenado y lo extraemos del base. Ahora toca "A"=0. Avanzamos 0 y obtenemos "T" (hemos eliminado "S") la añadimos y la eliminamos del base. Siguiente carácter "N"=13 avanzamos cíclicamente 13 posiciones y llegamos a la posición 2, es decir "C". Seguimos hasta obtener
STCFN;XYKÑZPOQHL,:IJRWMDV_AGEUB.
Proteger la clave
Dado que este desorden es bastante vulnerable, vamos a aplicar otro pero con una clave modificada. Los pasos son
- Invertir la clave SANCHO pasa a OHCNAS
- Convetir la clave a cadena de bits (5 por carácter) pero usando la representación del alfabeto desordenado OHCNAS pasa a 011000111000010001001101000000
- Obtenemos un número de corte de la cadena multiplicando 17 por el valor en el alfabeto desordenado del último carácter de la clave y haciéndolo módulo la longitud de la cadena de bits. En este caso (17*12) mod 30 = 24.
- Cortamos la cadena de bits por ese punto y trasponemos ambos trozos 011000111000010001001101000000 pasa a 000000011000111000010001001101
- Obtenemos la representación de la clave protegida reconvirtiendo bits a carácter por el alfabeto desordenado 000000011000111000010001001101 pasa a SXYTCQ
Obtener el nuevo alfabeto desordenado
Usamos la nueva clave obtenida para desordenar una vez más el alfabeto ya desordenado (usamos el mismo sistema). Obtenemos
JOYBTMHQ,Z:KXW.NPREAU_CSLG;ÑVDIF
Cuerpo del cifrado
Una vez tenemos alfabeto y clave procedemos a cifrar el texto. Lo dividimos en bloques de 54 caracteres (pastillas del cubo). Si el texto no es lo suficientemente largo para llenar el último bloque lo rellenamos con carácteres "basura" (en mi implementación se toman carácteres del principio sumando 1 con sustitución según el alfabeto modificado (uy!)). Por ejemplo
EN_UN_LUGAR_DE_LA_MANCHA_DE_CUYO_NOMBRE_NO_QUIERO se completa con clave SANCHO como EN_UN_LUGAR_DE_LA_MANCHA_DE_CUYO_NOMBRE_NO_QUIEROSPVUP
Cada bloque, a su vez, lo dividimos en 9 subbloques de 6. Cada subbloque se cifra de la siguiente manera:
Se XORea cada carácter (su valor según el alfabeto desordenado) con los 4 siguientes cíclicamente, de manera que en cada posición del subbloque quedará el resultado del XOR de 5 elementos. Por ejemplo, tomamos el primer subbloque del texto claro anterior
Primer subbloque EN_UN_ valores 18,15,21,20,15,21 Operaciones XOR C[0]=18^15^21^20^15=09 C[1]=15^21^20^15^21=19 C[2]=21^20^15^21^18=18 C[3]=20^15^21^18^15=28 C[4]=15^21^18^15^21=19 C[5]=21^18^15^21^20=20
Con esos valores llenamos 6 pastillas del cubo. Para las siguientes 6 usaremos el segundo subbloque XOReado. Seguimos hasta llenar el cubo. Tendremos llenando las caras por filas:
cara 0 (frente): 09,19,18,09,19,20,22,27,17 cara 1 (derecha): 19,23,26,22,17,28,23,17,25 cara 2 (trasera): 09,21,12,28,09,31,16,31,24 cara 3 (izquierda): 27,25,24,28,08,18,28,24,31 cara 4 (superior): 10,09,14,20,26,24,28,15,05 cara 5 (inferior): 09,10,14,09,14,02,10,14,31
Ahora desordenaremos el cubo. Lo haremos en función de la clave de la siguiente manera:
Definimos los siguientes movimientos (cara,giros) donde cara va de 0 a 8, siendo 0 a 5 las caras anteriores y las 6, 7 y 8 las bandas centrales:
Cara 6: pastillas 01,04,07,48,49,50,25,22,19,41,40,39 Cara 7: pastillas 03,04,05,12,13,14,21,22,23,30,31,32 Cara 8: pastillas 10,13,16,46,49,52,34,31,28,37,40,43
Los giros podrán ir de 1 a 3, cosa que nos da 9x3=27. Para ir bien necesitamos disponer de 32 posibles movimientos, por lo que añadirmos al final 5 nulos. Los movimientos serán pues:
(0,1),(0,2),(0,3) (1,1),(1,2),(1,3) (2,1),(2,2),(2,3) (3,1),(3,2),(3,3) (4,1),(4,2),(4,3) (5,1),(5,2),(5,3) (6,1),(6,2),(6,3) (7,1),(7,2),(7,3) (8,1),(8,2),(8,3) (9,1),(9,2),(9,3),(9,4),(9,5)
La clave la aplicaremos buscando el movimiento correspondiente al valor (según alfabeto desordenado) del primer carácter de la clave, segun corresponda. Por ejemplo a la "S" le corresponde el valor 23, es decir, (7,3) o 3 giros a la derecha de la 3ª banda central (o un giro a la izquierda de la misma). El siguiente movimiento lo calculamos cíclicamente desde el anterior, es decir, 23+"X"=3 => (1,1). Continuamos hasta obtener toda la secuencia de movimientos que aplicamos al cubo. En nuestro caso obtenemos
cara 0 (frente): 14,19,18,09,08,18,10,27,17 cara 1 (derecha): 19,23,14,09,19,02,23,17,22 cara 2 (trasera): 16,22,09,31,17,21,10,14,31 cara 3 (izquierda): 05,28,27,24,09,25,24,31,24 cara 4 (superior): 12,28,26,20,26,20,28,15,25 cara 5 (inferior): 09,10,31,09,14,24,09,28,28
Ya sólo queda recorrer el cubo por caras y filas y recuperar el valor según el alfabeto desordenado. Obtenemos el cifrado
.AEZ,E:ÑRAS.ZAYSRCPCZFR_:.FMVÑLZGLFLXV;U;UVNGZ:FZ.LZVV
Para bloques siguientes y para evitar encolumnados evolucionamos la clave en cada bloque substituyendo cíclicamente cada carácter de la misma por el XOR (según alfabeto desordenado) con el primer carácter del bloque que vamos a cifrar. Asi, tras el primer bloque tendremos
Clave SXYTCQ Primer carácter bloque 1 "_", valor 23; K(1)=S^_=21^23=2=Y Nueva clave YXYTCQ Primer carácter bloque 2 ";", valor 12; K(1)=X^;=29^12=17=R Nueva clave YRYTCQ ...
Descifrado
El descifrado es la operación inversa, aunque hemos de tener en cuenta que los movimientos los hemos de aplicar en estricto orden contrario y con el número de giros complementario, es decir (cara,4-giros). Cargamos pues el cubo con bloques de 54 por caras y filas los valores según el alfabeto modificado de los caracteres del cifrado e invertimos los movimientos del cubo.
Recuperamos entonces el cubo original
cara 0 (frente): 09,19,18,09,19,20,22,27,17 cara 1 (derecha): 19,23,26,22,17,28,23,17,25 cara 2 (trasera): 09,21,12,28,09,31,16,31,24 cara 3 (izquierda): 27,25,24,28,08,18,28,24,31 cara 4 (superior): 10,09,14,20,26,24,28,15,05 cara 5 (inferior): 09,10,14,09,14,02,10,14,31
Volvemos a descomponerlo por subbloques y aplicamos los XOR exactamente igual que en el cifrado obteniendo los valores originales para cada uno.
A[0]=09^19^18^09^19=18 A[1]=19^18^09^19^20=15 A[2]=18^09^19^20^09=21 A[3]=09^19^20^09^19=20 A[4]=19^20^09^19^18=15 A[5]=20^09^19^18^09=21 subbloque EN_UN_
Ya sólo hemos de concatenar los subbloques para obtener el texto descifrado
EN_UN_LUGAR_DE_LA_MANCHA_DE_CUYO_NOMBRE_NO_QUIEROSPVUP
El reto
como siempre el reto consiste en descifrar un texto de longitud importante que podeis encontrar aquí. La clave es relativamente corta y con texto inteligible.
Como es habitual disponeis de una versión online aquí para poder jugar
A ver si éste os entretiene algunos días más. Ah, en previsión tengo aún en mis criaderos:
- Gravity: Cifrado por partículas en movimiento en un sistema gravitatorio de 4 masas que se desplazan.
- Railroad: Cifrado en flujo por llenado de buffers.
- RC4Lite: versión asequible de RC4.

Ya me parecía a mi que algo
Ya me parecía a mi que algo tan sencillo como el CHE no iba a volver...Es muy buena idea lo del cubo, pero implementarlo se las trae, voy a ver si soy capaz.
Te recomiendo
que cojas las funciones de giro que uso en mi javascript y las traduzcas al lenguaje que uses, ya que es la parte más tediosa de la codificación, ver que pastilla va a que sitio después de un giro. Verás que sólo uso giros a la derecha (sentido horario mirando de frente la cara que se gira) ya que podemos expresarlo todo así, aunque seguramente para diseñar un ataque necesitareis optimizar esa parte.
Uf
¿Qué clase de criatura infernal has creado?. Esto parece un monstruo enorme que casi mata con la mirada. Cada pisada suya hace tambalearse los cimientos. ¿Cómo vamos a poder con ella?. Bueno, veremos qué podemos hacer.
Por otro lado, no me he olvidado de explicar lo que tenía pensado para atacar al CHE, aunque se me complicó un poco la cosa y al final parece que voy a obtener bloques a los que atacar, en lugar de un único bloque... eso si no surgen más complicaciones. A ver si el fin de semana que viene lo puedo publicar.
Si se hace demasiado inabordable
sacaré una versión Lite sin la substitución, xoreando directamente con el alfabeto ordenado y aplicando la clave en claro (la primera, luego seguiría evolucionando)
Espera un poco, a ver cómo va
Espera un poco, a ver cómo va la cosa, a que salgan las primeras ideas de ataque. El CHE parecía también inabordable al principio, y al final no lo fue. A ver qué pasa con éste...
Será uno de los comodines
Que podreis pedir si os hacen falta. Como mucho uno cada 10 días. Pero igual peco de optimista y os lo fundís en nada.
- Cifrado del mismo texto con otra clave no conocida.
- Codificación de un texto claro conocido con la misma clave (el texto lo pongo yo, que no vaya a ser "AAAAAAAAAA...")
- Reducción de la fuerza del cifrado (la indicada).
Hasta el finde que me de
Hasta el finde que me de tiempo a implementarlo, no puedo meterme con él, ya veremos a ver que da de sí. Es muy bueno lo de cubo, en vez de ruedecitas como Enigma, hay darle vueltas a las caras del bicho, mezclando y remezclando...
Poco a poco voy desentrañando
Poco a poco voy desentrañando el código fuente, al final voy a aprender Java y todo...
Si tienes cualquier duda
Te la resuelvo. Si quieres subo una versión com más (algún) comentarios.
Ya puedes cuidarlo
Ya puedes cuidar a Tokamak, ya, que me parece que es el único que se atreve con tu criatura.
Aligual no es apto para un reto
La verdad es que me vine arriba con lo fácil que estaba cayendo todo y quizás me haya pasado. Creo que publicaré la versión lite sin alfabeto derivado e incluso sin evolucionar la clave, creo que así quedará más divertido y mantiene la esencia del algoritmo, que es de lo que se trata. Si cae muy pronto siempre podréis meteros con su primo de zumosol aprovechando la experiencia obtenida.
La puntilla
A mí lo que me da la puntilla es lo de los giros del p. cubo de Rubik, que nunca me aclaré con él. No sé si podré terminar la implementación. Pero no te arrepientas, que ya toca poner algo que no se lo coma Tokamak con sus AGs como si fuera una hamburguesa.
Tanto como atreverme...lo que
Tanto como atreverme...lo que estoy haciendo es implementarlo. Ya lo he conseguido, a falta de ese tejemaneje de "evolucionar la clave",estoy con eso ahora. Me ha venido muy bien para romper el hielo con el Javascript, que nunca me había metido con él. Incluso puse en marcha el IIS para ejecutarlo localmente, me he copiado ahí la página y el script, así que estoy pasando unos buenos ratos con este bicho. Que saque algo ya será otro cantar...
Pero que bestia soy ¡si el javascript funciona del lado del cliente!, estaba obcecado con que era como es asp, que se ejecuta del lado del servidor. No necesito el IIS pa naaaa.
Pues desinstala
Pues desinstala, y luego practícale un par de exorcismos por si acaso, que tiene la mala costumbre de dejar toda clase de restos de la posesión (incluyendo puertos abiertos en el firewall). Y a la chita callando, además, el muy ladino.
Hay un problema en el código Java
Sí, resulta que descifra bien el primer bloque de 54 bytes, pero después depende del contenido del campo TxtClaro para poder descifrar. Campo que puede estar vacío cuando simplemente quieres descifrar un texto. Es la función Evolucionar que me estaba volviendo loco..
Etiqueta java (y otras)
Recordad que podéis utilizar etiquetas como <java>, <c>, etc (en lugar de <code>) para que el código salga coloreado de acuerdo con la sintaxis propia de cada lenguaje.
Hay un recordatorio debajo de los cuadros para enviar comentarios. Es ése que dice:
Estoy haciendo una versión comentada
De momento te pongo esa función.
Es posible que lo que te lie sea la i. Esa i viene como parámetro del número de bloque que acabamos de cifrar +1. Al acabar de cifrar el bloque 0 y llamar a Evolucionar i valdrá 1, con lo que para que toque sustituir el caracter 0 de la clave por el xor calculamos j como i-1. Recuerda también que substr empieza a contar desde 0, con lo que i*LB en esta primera llamada valdrá 54 y será, por tanto, el primer carácter del segundo bloque.
A ver si esto te orienta. Debería serte familiar, está muy basado en la evolución de clave de tus TFTR.
EDICIÓN URGENTE
¡DIANTRES!
¡No caí en la cuenta! ¡Bobo de mi!
Tienes toda la razón. i no puede estar basada en el bloque a cifrar, tiene que estar basada en el último bloque cifrado. Así el descifrado no es posible.
Hago los cambios y subo el nuevo texto cifrado con el nuevo método.
ACTUALIZACION IMPORTANTE
Debido a un error de diseño visto por Tokamak (gracias) he rehecho el algoritmo de cifrado. El cambio parece algo menor (la evolución de la clave se hace según el bloque actual y no del siguiente) pero me ha obligado a cifrar de nuevo el texto del reto, con lo que el fichero se ha modificado. Aquí también tenéis la nueva versión del fichero.
Menos mal
Sí: después de intentar hacer funcionar Javascript como ASP, no era capaz de entender el funcionamiento de esa rutina, y una vez cifrado un texto, no era capaz de descifrarlo. Pero visto el astuto comienzo de mi experiencia con Javascript no acababa de reconocer que había un problema con el código, me acabas de quitar un peso de encima. Bien, veamos el nuevo artilugio..
Ejem...
...falta el rubik2.js en el RAR
(Parece que me hizo la boca un fraile, tanto pedir...)
Ahora
Que añadí el que no era
Pues ya lo he implementado, y
Pues ya lo he implementado, y está claro que es un cifrado potente, ya he efectuado un par de intentos con el AG y no he obtenido resultados. La función de coste da resultados caóticos, no hay convergencia, no muestra la bonita curva ascendente que ví en el CHE, iluminado el rostro sólo con la macilenta luz del monitor y entre risotadas maléficas... La clave está bien protegida, así que, si se puede romper, será a partir de un criptoanálisis fino y trabajoso. Quizá Sqrmatrix pueda, yo no me veo capaz, pero ojo, seguiré intentándolo...
Posibilidad
Es posible que haya una vía que puede ser explotada para el ataque mediante un AG o quizá por otras vías: Sí pudiésemos obtener la clave correspondiente a una permutación del alfabeto, tal vez fuese posible atacar este algoritmo igual que se hizo con el CHE, tratándolo como si fuese una simple clave de substitución monoalfabética. Lo primero es comprobar si se puede obtener la clave desde un alfabeto, me pongo a ello.
Problemilla con el alojamiento
Hola, estaba intentando montar un sitio un poco más apañado en el alojamiento donde pongo los scripts y su constructor de webs me ha hecho una desgracia. Para que tengais acceso a todo he hecho un apaño mientras se resuelve. La dirección de la implementación ha cambiado y ahora es
http://llamamex.nixiweb.com/rubik2/index.html
No acabo de ver viable
No acabo de ver viable obtener la clave a partir del segundo alfabeto modificado. Si por lo menos esto fuera posible habría alguna posibilidad de abrir este cubo, veremos si hay alguna buena idea por ahí, de momento yo estoy seco.
Perdonad mi ausencia. Tenía
Perdonad mi ausencia. Tenía previsto ponerme con este bicho, y con el prometido ataque del CHE, este fin de semana, pero unos imprevistos me lo han impedido.
No me he puesto a mirar este cifrario, y puede que me equivoque en lo que voy a decir. Si los movimientos emulan a un cubo de Rubik de verdad (que puede que no, porque como he dicho, no lo he mirado), nos encontramos con ciertas agrupaciones de letras, ya que lo que se mueven son pequeñas piezas cúbicas, con letras en sus diferentes caras. Así, las esquinas del cubo tendrán 3 letras que siempre permanecerán unidas, independientemente de los movimientos que hagamos, y las piezas que están entre 2 esquinas tendrán 2 letras que siempre permanecerán unidas, independientemente de los movimientos que hagamos. Por otro lado, las piezas centrales contienen una letra, pero seguirán siendo piezas centrales (aunque la posición que ocupen puede cambiar, claro). Es decir, que se hagan los movimientos que se hagan, cada letra tiene un número limitado de posiciones que puede ocupar, dependiendo del tipo de pieza al que pertenezca, y hay ciertos tipos de letras que, además de tener esta limitación de posiciones, también tendrán una limitación de letras con las que estar asociadas. Todo esto, por supuesto, visualizando cada bloque del criptograma como un cubo de Rubik. Las posiciones que ocupen las letras en cada bloque habrá que traducirlas, pero sabemos que ciertos grupos de 3 letras (los que corresponden a las esquinas) tienen la misma asociación que tenían antes de encriptarse el bloque. El problema es determinar a qué esquina pertenecían, y en qué orden estaban (porque la orientación de las piezas puede cambiar, lo que se traduce en un cambio en el orden de las letras). Lo mismo ocurre con las piezas que asocian dos letras.
Bueno, a ver si saco tiempo para ponerme a ello, y a ver si esta observación, que de momento no ayuda demasiado, puede ayudar a alguien.
Edición: Estaría bien identificar las posiciones del bloque que corresponden a cada esquina, a cada pieza entre esquinas, y a cada pieza central. Yo ahora no puedo hacerlo, pero lo haré cuando pueda, si no lo ha hecho alguien antes
Si funcionan como un cubo de rubik
Ciertamente podría haberme inventado alguna entelequia de movimientos fuera de cualquier modelo físico, eso al cifrado le hubiera dado igual, pero si he mirado de seguir escrupulosamente los movimientos del cubo, con sus ventajas y sus carencias. Los movimientos y sus correspondencias los podeis extraer de mi código. Las numeraciones corresponden a este esquema
Imágenes:
Pues tengo algo que sin duda
Pues tengo algo que sin duda tiene que ver con esos agregados de letras recalcitrantes a los movimientos.
Resulta que cifré con la clave SANCHO el documento que Agustín nos propuso para su cifrado XOR. A continuación analicé con Cryptool el resultado
para buscar n-gramas.
Resulta que los dos 5-gramas más abundantes son CQDPP y GCRVS, que concurren cada uno tres veces en el texto. El primero no es interesante, no codifica el mismo texto, ¡pero el segundo sí! en concreto el texto en claro _DE_L
He encontrado más n-gramas en esta prueba, por ejemplo CRVS codifica siempre DE_L
CQJ, codifica el texto ABE, la mayor parte de las veces:
_A_
OR_
ABE
REO
ARA
ABE
REF
RES
_PE
ABE
ABE
CRV, codifica la mayor parte de las veces el trigrama DE_
IGR
DE_
DE_
E_S
OLU
AGU
DE_
A_D
E_M
DE_
DE_
_ER
Otro muy interesante
GCRVSR siempre codifica _DE_LA
Este cubo parece que empieza a presentar alguna grieta..
Hexagramas del reto
Nº Subcadena Frequencia (en %) Frecuencia
1 .UU.OC 0.0017 2
2 ;:R_KI 0.0017 2
3 CHQURW 0.0017 2
4 FRFS;X 0.0017 2
5 GFS:IL 0.0017 2
6 GKWI:K 0.0017 2
7 PV_M@R 0.0017 2
8 SPE@HG 0.0017 2
9 TWVCMU 0.0017 2
Creo que alguno de los dos primeros codifican la misma cadena, y muy probablemente conteniendo el texto "DE_"
un dato más interesante
Hay ahí un dato más interesante. A ver si lo veis. (Uy calla)
Empiezan las rebajas
Viendo que esto está intratable, voy a empezar a rebajar la fuerza del cifrado. Creo que simplemente eliminando la evolución ya os tiene que dar algo más de juego, puesto que la secuencia de movimientos será la misma para todos los bloques y ya sabemos lo que implica eso. De momento mantengo el resto de elementos, pero si aún así se resiste quitaré primero la sustitución (segundas rebajas) y la protección de la clave (terceras).
Lo que falta por decidir es si mantenemos este reto abierto y abrimos otro con Rubik2Lite o si directamente lo sustituimos.
¿Rubik to Lite?
Yo aquí si que ya no llego; nunca resolví entero el famoso cubo del Sr. Rubik sin copiar... pero el reto es en sí muy interesante. Recuerdo que ya -Principiante-, anteriormente, había propuesto algo similar aunque mucho más informal:
Y que tú mismo, LlamameX, nos presentaste el 04 de marzo, viernes, del pasado año 2011el Cifrado Koch (Fractal2):
A ver que dicen los demás; yo creo acertado mantener este reto abierto aunque se abra otro más sencillo por ser una idea más versátil de cara a que, en un futuro, lo podáis continuar con menor fatiga.
Saludos cordiales,
Pedro Fernández
--
Siempre me gustó
Siempre me gustó la propuesta de Principiante (lástima que no la continuara y la planteara como un reto), así que me quedé con la espinita de usar el cubo como fuente de caos en un cifrado. Igual queda algo anecdótico y posiblemente derive en vulnerabilidades (el hecho de que las pastillas no sean las 54 independientes entre si sin duda es una debilidad) y se podría haber hecho una transposición que no siguiera ningún modelo físico, incluso hacer un modelo dependiente de la clave, pero para mi era un homenaje pendiente al rompecabezas que tanto me ha entretenido.
Pues antes que bajar el grado
Pues antes que bajar el grado del reto, a lo mejor es preferible dar más pistas. Por ejemplo una de las condiciones que ha de tener un buen cifrado es ser resistente al ataque por texto conocido, una de las debilidades del cifrado matricial Hill, por ejemplo. Por eso proporcionar algún fragmento en claro que contenga el texto cifrado, como hizo sqrmatrix, no debe ser considerado como una devaluación del reto.
Se pueden proporcionar otras pistas, como esa a la que aludías, que algunos somos tan zoquetes que no nos enteramos de la fiesta.
No sé que os parece....
Bueno, si os parece mejor
Ahí va la primera pista: En alguna parte del texto claro aparece una referencia a la República Democrática del Congo.
Rubik2Lite
Bueno, dado que un mes más tarde la pista sobre el texto claro tampoco ha reactivado el reto, le he bajado la dificultad al mínimo en Rubik2Lite. Sólo dejo la parte del cubo, es decir:
Para mayor facilidad el cifrado del reto corresponde al mismo texto claro que el anterior y ¡está cifrado con la misma clave!.
Si no os animais ya con esto...
Una pregunta sobre el Rubik2 Lite
Por curiosidad y si puede ser sin entrar en mucha matemática que, mísero de mí, no llegaría a entender; ¿qué pasaría si al cubo le diéramos una numeración diferente? Como, por ejemplo:
38 39 40 37 36 41 44 43 42 06 07 08 17 16 15 24 25 26 35 34 33 05 00 01 10 09 14 23 18 19 28 27 32 04 03 02 11 12 13 22 21 20 29 30 31 47 48 49 46 45 50 53 52 51En lugar de la que tú -junto a las debidas explicaciones de que la numeración podría ser cualquiera aunque habías elegido la que habías elegido por compatibilidad, he creído entender, con el genuíno cubo del Sr. Rubik- tan amablemente nos proporcionaste y vuelvo a poner aquí por comodidad; ¿LlamameX?
Gracias por este interesante reto y cordiales saludos,
Pedro Fernández
--
Imágenes:
Por pasar no pasaría nada
Las numeraciones que yo he usado sólo son útiles con mis procedimientos. Plantear otra numeración sólo implica que habrá que usar procedimientos de giro distintos a los míos. En lo que si habrá que ser escrupuloso es en los sistemas de llenado y vaciado del cubo. Es decir, yo lo lleno por caras siguiendo el orden que indico. Eso no debe cambiar. Si yo lleno como 00-01-02-03... tu deberías llenar como 06-07-08-05... ya que si no estaremos en implementaciones diferentes.
¡Ahá! Rubik2Lite asequible
Gracias LlamameX, cuando tenga un poco más de tiempo intentaré jugar con la implementación que tú mismo has hecho para ver si puedo ir comprendiendo, poco a poco, las matemáticas en que todo se sostiene.
Esta otra numeración acaracolada, por ejemplo:
44 43 42 32 31 30 20 19 18 33 21 09 08 07 06 17 29 41 51 52 53 34 22 10 01 00 05 16 28 40 50 45 46 35 23 11 02 03 04 15 27 39 49 48 47 12 13 14 24 25 26 36 37 38no valdría... ¡claro! porque habría que implementarla, a nivel software, de otra forma.
Aunque no aspiro a llegar ni por asomo a vuestro nivel, ¡entretenido sí que es!
Un saludo y gracias otra vez,
Pedro Fernández
--
¡Hala! ahora se nos acumula
¡Hala! ahora se nos acumula el trabajo tras holgazanear durante el puente
Preguntas y dudas
1. ¿Alguien me podría explicar la forma de realizar las operaciones XOR?
A mi 18^15^21^20^15=09 siempre me sale 19
Primer subbloque EN_UN_ valores 18,15,21,20,15,21 Operaciones XOR C[0]=18^15^21^20^15=09 C[1]=15^21^20^15^21=19 C[2]=21^20^15^21^18=18 C[3]=20^15^21^18^15=28 C[4]=15^21^18^15^21=19 C[5]=21^18^15^21^20=202.Si vamos llenando la caras por filas, el valor (1,4) = C[3] ¿no debería ser 28?
Con esos valores llenamos 6 pastillas del cubo. Para las siguientes 6 usaremos el segundo subbloque XOReado. Seguimos hasta llenar el cubo. Tendremos llenando las caras por filas:
cara 0 (frente): 09,19,18,09,19,20,22,27,17 cara 1 (derecha): 19,23,26,22,17,28,23,17,25 cara 2 (trasera): 09,21,12,28,09,31,16,31,24 cara 3 (izquierda): 27,25,24,28,08,18,28,24,31 cara 4 (superior): 10,09,14,20,26,24,28,15,05 cara 5 (inferior): 09,10,14,09,14,02,10,14,31Un saludo para todos
Puede ser que haya un error en el texto explicativo
Lo reviso. De hecho voy a escribir otro redactado para el Lite, ya que el ejemplo no es válido para éste.
Enunciado Rubik2Lite
No se si debería abrirse un tema nuevo. Pero de momento lo pongo aquí.
RUBIK2Lite
Rubik2 Lite es una versión reducida de Rubik2, donde se ha reducido la complejidad para facilitar su criptoanálisis. Sigue inspirado en esta propuesta publicada en el antiguo Kripópolis. Básicamente con la reducción el cifrado es una transposición fija por bloque. La gracia es que para la transposición se usa un cubo de Rubik.
El algoritmo:
Cuerpo del cifrado.
Se utilizará el alfabeto base de 32 caracteres
Se procederá entonces a cifrar el texto. Se divide éste en bloques de 54 caracteres (pastillas del cubo). Si el texto no es lo suficientemente largo para llenar el último bloque lo rellenamos con carácteres "basura" (en la implementación se usan carácteres del inicio sumando 1, pero podrían generarse aleatoriamente)
Cada bloque, a su vez, lo dividimos en 9 subbloques de 6. Cada subbloque se cifra de la siguiente manera:
Se XORea cada carácter (su valor según el alfabeto desordenado) en los 4 siguientes cíclicamente, de manera que en cada posición del subbloque quedará el resultado del XOR de 5 elementos. Por ejemplo, tomamos el primer subbloque del texto claro anterior
Con esos valores llenamos 6 pastillas del cubo. Para las siguientes 6 usaremos el segundo subbloque XOReado. Seguimos hasta llenar el cubo. Tendremos llenando las caras por filas:
Ahora desordenaremos el cubo. Lo haremos en función de la clave de la siguiente manera:
Definimos los siguientes movimientos (cara,giros) donde cara va de 0 a 8, siendo 0 a 5 las caras anteriores y las 6, 7 y 8 las bandas centrales:
Los giros podrán ir de 1 a 3, cosa que nos da 9x3=27. Para ir bien necesitamos disponer de 32 posibles movimientos, por lo que añadirmos al final 5 nulos. Los movimientos serán pues:
La clave la aplicaremos buscando el movimiento correspondiente al valor (según alfabeto desordenado) del primer carácter de la clave, segun corresponda. Por ejemplo a la "S" le corresponde el valor 19, es decir, (6,2) o 2 giros a la derecha (o izquierda) de la 1ª banda central. El resultado en el cubo será (marcando las pastillas desplazadas):
El siguiente movimiento lo calculamos cíclicamente desde el anterior. Nos toca la "A" que vale 0 es decir, (19+0) mod 32=19 con lo que volvemos a aplicar (6,2) dejando el cubo como al principio. La tercera letra de la clave, "N" vale 13, es decir que toca (19+13) mod 32=0, o sea que aplicamos (0,1). Continuamos hasta obtener toda la secuencia de movimientos que aplicamos al cubo. En nuestro caso obtenemos
Ya sólo queda recorrer el cubo por caras y filas y recuperar el valor según el alfabeto base. Obtenemos el cifrado
Descifrado
El descifrado es la operación inversa, aunque hemos de tener en cuenta que los movimientos los hemos de aplicar en estricto orden contrario y con el número de giros complementario, es decir (cara,4-giros). Cargamos pues el cubo con bloques de 54 por caras y filas los valores según el alfabeto base de los caracteres del cifrado.
Invertimos los movimientos del cubo. Para ello miramos la secuencia de movimientos que generaría cifrar con esa clave y la ejecutamos empezando por el final y hacia atrás. Los movimientos que hacemos son los complementarios (por ejemplo para (4,1) haríamos (4,3)) para dejar el cubo como estaba.
Recuperamos entonces el cubo original
Volvemos a descomponerlo por subbloques y aplicamos los XOR exactamente igual que en el cifrado obteniendo los valores originales para cada uno.
Ya sólo hemos de concatenar los subbloques para obtener el texto descifrado
El reto
como siempre el reto consiste en descifrar un texto de longitud importante que podeis encontrar aquí. La clave es relativamente corta y con texto inteligible.
Como es habitual disponeis de una versión online aquí para poder jugar
Vale. Antes de nada ..
Vale. Antes de nada voy a probar con una implementración de mi mata-mata (casi) todo, pero para no tirarme analizando claves de diferente longitud muchos años, quiero verificar que es capaz de resolver un rubik-lite con clave de longitud 8 ¿puedes ponerme un texto cifrado así?
Vale, ahi va
´Aquí lo tienes
Fíjate lo que he obtenido,
Fíjate lo que he obtenido, aunque ha sido difícil:
Por los trozos que se vislumbran:
OLUCIO
IBESRAEL
Supongo que es el texto de Rodolfo Walsh que nos puso Agustín para su cifrado, de otra manera hubiera sido imposible sacar nada con eso. ¿Estoy en lo cierto?
Estás en lo cierto
Creo que estás en lo cierto, porque las posiciones de esos dos fragmentos coinciden exactamente con las que tienen en el texto de Walsh. Sólo tú, con tus diabólicos AGs podías enfrentarte a ese monstruo.
Por cierto ¿Hbéis leído el artículo de Walsh? Es un estudio magnífico y veraz sobre el auténtico problema de Oriente Medio, causa de los terrorismos y conflictos que se nos tragarán a todos.
Lo estás, lo estás
Malditos AGs sólo sirven para atacarme a mi, que ahí sigue FOTP tan pancho XDDD
Ya me contarás la convergencia que usas, que aquí no la veo pero que claramente existe. ¿Qué función usas y como determinas que estás cerca?
Hola, pues la función de
Hola, pues la función de convergencia es la que utilizo siempre: con cada clave que prueba, el AG utiliza una implementación de Rubik-Lite para descifrar con ella los dos primeros bloques del cifrado. A continuación calcula las frecuencias de monogramas, bigramas y trigramas de ese texto en claro y las compara con las frecuencias de monogramas, bigramas y trigramas de un texto de referencia, y saca el error cuadrático entre ellas, eso es lo que hay que minimizar, con lo que hacemos converger (muy poco en este caso, como en FOTP, lo que me da esperanzas) la población de claves (eso son los cromosomas, un montón de claves inicialmente aleatorias) hacia la solución.
El texto era irreconocible. Frecuentemente se atisban posibles combinaciones de palabras, que en 99% de los casos son pura casualidad. Porque conocía el texto, si no seguramente hubiese pasado por alto esas pistas.
Si la clave es mucho más larga, me parece que mi mata-mata será como un insecticida contra un elefante...
En el reto-lite creo que en
En el reto-lite creo que en el primer bloque aparece, en alguna parte, la palabra LETRA. Tal vez también, BAJO y quizá TOMO. Pero puede que solo sean espejismos...
Páginas
opinar