Foros:
15/05/2012: LlamameX derrota definitivamente el cifrado Omelette. Y además explica cómo lo hizo...
06/05/2012: Una excelente lección práctica sobre cómo atacar un texto cifrado, de la mano de sqrmatrix.

Para ver en detalle la evolución del ataque a Omelette, siempre nos quedará París, el javascript de LlamameX, y el Visual Basic de Tokamak.
Pero para facilitar las cosas a nuestro amado público, que tanto nos quiere y a quien tanto debemos, vamos a intentar poner aquí un breve resumen.
Se llama omelette (tortilla) porque consiste en la alteración de los bits de texto plano, moviéndolos de aquí para allá, con una cierta (limitada) aleatoriedad que proviene exclusivamente de la clave.
El alfabeto base y la codificación en bits
El alfabeto base es de 32 caracteres
A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z _ . , ; :
que pueden codificarse mediante cinco bits de forma que a la "A" le correspondería el código 00000, y a ":" el código 11111
El alfabeto derivado
Para confundir al enemigo, el alfabeto se trastoca a partir de la clave introducida por el usuario. Para ello hay que determinar la que será la primera letra del nuevo alfabeto: Se suman los valores (las posiciones) de las letras de la clave. Si la clave fuera "VALE", el cálculo sería el siguiente:
V=20 A=00 L=11 E=04
P[0] = Σ K[i] modulo 32 = (22 + 00 + 11 + 04) modulo 32 = 37 modulo 32 = 5
Con lo que la primera letra a extraer será la "F"
A partir de ahí las siguienes letras se extaerán mediante la fórmula:
P[i+1] = (P[i] + K[j]) modulo L-alfa
P[1] = (5 + 22) modulo 31 = 27
que corresponde al puunto "."
Obsérvese que la operación módulo utiliza la longitud menguante del alfabeto de partida. El resultado final, para la clave "VALE" será el alfabeto
derivado:
F . , K O J L X : ; A Q V _ B S Z N Ñ I U W Y E R C D H M T G P
Después de los ataques realizados, se ve que hubiera sido más conveniente generar el alfabeto derivado a partir de la clave extendida, que veremos a continuación, hélas.
La clave extendida
Ya se ha dicho que la aleatoriedad del proceso depende de la clave, por lo que ésta ha de ser lo más compleja posible. No es conveniente obligar a recordar claves abstrusas y kilométricas, por lo que se aplica un procedimiento para extender la clave hasta 160 caracteres, que se basa en añadir caracteres con la sencilla fórmula:
K[i+L] = K[i] + 1 donde L es la longitud de la clave
Es decir, añadir la letra siguiene a la primera de la clave, la siguiente a la segunda, etc, y así sucesivamente.
En nuestro caso, la clave extendida sería:
V A L E W B M F X C N G Y D Ñ H Z E O I _ F P J . G Q K , H R L ; I S M : J T N A K U Ñ B L V O C M W P D N X Q E Ñ Y R F O Z S G P _ T H Q . U I R , V J S ; W K T : X L U A Y M V B Z N W C _ Ñ X D . O Y E , P Z F ; Q _ G : R . H A S , I B T ; J C U : K D V A L E W B M F X C N G Y D Ñ H Z E O I _ F P J . G Q K , H R L
Aunque parezca una trivialidad, el resultado es algo más complejo cuando se toman los valores de los caracteres en el alfabeto derivado:
Valores de la clave: 12 10 06 23 21 14 28 00 07 25 17 30 22 26 18 27 16 23 04 19 13 00 31 05 01 30 11 03 02 27 24 06 09 19 15 28 08 05 29 17 10 03 20 18 14 06 12 04 25 28 21 31 26 17 07 11 23 18 22 24 00 04 16 15 30 31 13 29 27 11 01 20 19 24 02 12 05 15 09 21 03 29 08 07 06 20 10 22 28 12 14 16 17 21 25 13 18 07 26 01 04 22 23 02 31 16 00 09 11 13 30 08 24 01 27 10 15 02 19 14 29 09 05 25 20 08 03 26 12 10 06 23 21 14 28 00 07 25 17 30 22 26 18 27 16 23 04 19 13 00 31 05 01 30 11 03 02 27 24 06
Obsérvese que hay cierta aleatoriedad. Con una clave algo más fuerte no aparece ninguna periodicidad. Esta pseudoaleatoriedad es la base del cifrado Omelette.
El algoritmo de cifrado3
Consiste en:
1. Descomponer el texto plano en bloques de 32 caracteres. Si el último bloque tiene menos de 32 caracteres, se completará con letras del alfabeto base obtenidas a partir de las posiciones de la clave expandida, mediante:
Pos[i] = (K[i] + 1)(i + 1) modulo 32
donde K(i) son las sucesivas letras de la clave.
Se añade 1, tanto a la posición de la letra clave como al valor del índice, para evitar todos los productos nulos que se darían para todas las ocurrencias del primer carácter del alfabeto derivado en la clave, y del primer carácter de la misma.
2. Convertir cada bloque en una ristra de bits, a razón de cinco bits por símbolo, según se mostró anteriormente. Eso nos da bloques de 160 bits. Por eso la clave ha de medir 160 caracteres.
3. Ir extrayendo de la ristra los bits que tengan las posiciones dadas por:
Pos[i] = (K[i] + 1)(i + 1) modulo 160
4. Colocar el bit extraído al principio (izquierda) o al final (derecha) de la ristra, según la siguiente tabla:
i--------K[i]-----destino ============================ par------par------derecha impar----impar----derecha par------impar----izquierda impar----par------izquierda
5. Juntar los bloques y tomar los bits de cinco en cinco para extraer las letras correspondientes del alfabeto.
El descifrado
1. A partir de la clave, se genera el alfabeto derivado como se definió en la fase de cifrado.
2. Se expande la clave y se le asignan a sus caracteres las posiciones en el nuevo alfabeto, igual que en el cifrado.
3. Se descompone el texto cifrado en bloques de 32 caracteres.
4. Se codifica cada bloque en binario usando cinco bits por carácter.
5- Se revierte el proceso de dispersión de bits tomando la clave por el final, y aplicando las reglas establecidas en el cifrado, es decir, tomar el bit de la derecha del bloque o de la izquierda, según los valores de K(i) y de (i) (ver la tabla correspondiente).
6. Se inserta el bit en el bloque en la posición dada por
Pos[i] = (K[i] + 1)(i + 1) modulo 160
7. Al terminar de recorrer toda la clave en sentido inverso, se decodifican los bits resultantes, tomados de cinco en cinco, con lo que se obtendrán los caracteres en claro, si todo ha funcionado bien.
Como habréis podido comprobar, no se trata realmente de un cifrado, no hay operaciones complicadas, ni operaciones XOR, ni nada de nada. Como decía Tokamak, es como una etapa que podría encadenarse en cualquier algoritmo. Tan sólo se baten los bits hacia la izquierda o hacia la derecha, chac, chac, chac, y ya está:

Ejemplo
Cifremos el texto:
EN_UN_LUGAR_DE_LA_MANCHA,_DE_CUY O_NOMBRE_NO_QUIERO_ACORDARME,_VI VIA_NO_HA_MUCHO_UN_HIDALGO_DE_LO S_DE_LANZA_EN_ASTILLERO,_ROCIN_F LACO_Y_GALGO_CORREDOR.
con la descrita clave “VALE”, para aprovechar todo lo que ya hicimos con el alfabeto derivado y la clave extendida. Se obtiene el cifrado:
YVYWHAWHQTBÑÑ;Ñ:RR_WSCLKWIYCB;MU VGGO,GSIZBODTQU_LF:ID;G,_,TIBÑ,O WS,PQKDV,;JEZPBYSIBIQVJZFÑQIJNUG AHIEE.LYLALHVA,GEUMAÑD_.:B.OXRTD LZ.MQ_G,UVJAVTQLQM.OXEDÑEÑINNMO.
Si se descifra, se obtiene el texto:
EN_UN_LUGAR_DE_LA_MANCHA,_DE_CUY O_NOMBRE_NO_QUIERO_ACORDARME,_VI VIA_NO_HA_MUCHO_UN_HIDALGO_DE_LO S_DE_LANZA_EN_ASTILLERO,_ROCIN_F LACO_Y_GALGO_CORREDOR.NVUAÑZLIIE
Para hacer pruebas disponéis de un texto completo del Quijote, limitado al alfabeto base y cifrado con la misma clave “VALE”, en este fichero que empieza así:
B,NZTSW,WAS.WDQXFVGAKQÑXHEVTXEGN .NWD:CEE_WESVTLHR,ÑM._XUFRXPPF.X CPWRN.;IDÑOH_TKKSV.QDU_M__S,,:T_ QISIGJPU,MZHQAMEREFÑWBEA:LPYSJV; SQTI,CH_FC,SYHVVGRSVQHCEHÑIGKV:E FBBT_MSMTQ.DVMDLÑKLONGTMQZZYGMX; CCT.OBZYQMODÑ.PCUPWAOQPX;DMM;ÑXQ VCHRUSSOH;APMVTJKMRTTQF__AQX:WKQ SPQZQWLLI:BU:QXLQ_RMDCTEEV_QTBQY DCENEKJHPZOHQTZGMKOÑMRT.KEXUS_UV UTDAGZPLMPYUKZSX;S:T;ADC;YLKRP_T C;LÑ:CBYVK;ETJPPSPWTAAGG;;SCCVLF PBQVHPHHM;QH;GYOPWDX_;RYNVÑEWEAM UCLEA,SXDÑEXEGPE.KGTBRDG,.,VEUKY ÑQ;.RIXUCPJUQ.JMGRIX:;IE_.YSZGGL Y_QÑFHPÑC_CEHQOJJ_HPSBÑLWCVQBTPM QB,G_NGÑSXCPDP_XSGNTYUÑRAH,XYRUÑ EGBDS._YKYSVSQÑPSS:TSUDMVPJXTGJG MOAKE_UJAXWMRLGLNNIPTSJTA_LÑPNDY TEHGSBRZ,MEPCTSXEP:TAY_FMA.Q.JKP ;SAGO;WYHBXBZLMXSBJRELPENLAXUJQT :XRXL.P_BJEÑ,RS,PÑDAIPVÑZTQPXNFM UPQHFHQMCXESVPSPSZ,QLQF:VDJYYR;A TTNANDNSZGL;IEXS;_GSHMLPSPTQL_CE BESNTE_._BBH;NDVPHEGNRHH,SOL.PXY ,VJL;ZUPMP.X,CLZ;_.ITPZ:UGMSLNIT NBPYJUWÑZWSDYXB,PXXPWMKMQH.THCB: CR:MJCVHTBODQDBDEPJW.RACK.OU_PAM ;K:PU_ANEN;EQJÑAQS,WHQNEPS;BHGJG R:WSGVAQRGV;QQRBGROBOHNX_LWIHHÑ, DESQLEJWV;LEXIMVMB:TJWJQSIALJSLM CASENABEKHCUHAGY:HÑ:Q_JHO__GJMXE NBDGIGÑELDXKIM;IWSQDHJ.N_WPBFYTP VYÑNJTGODGWEMZJMZÑ.ENZNBCNDJQIDA KGA.H;_JJ:HODJCLL,DMH,NPWMODEHEB TPJTBHQTYRODIW_:RWICQKCICÑP_.NGE RTZAPUAXZ::.GNU_VSBTB,C;YD;KXYXH GS;DSPGXH.ÑSUQ.BQ_RMXRMHFHXSLMKO ,FVRTBCYJQACRJAHXHEQTRPPLP;BZUVJ
El reto
El desafío consiste en descifrar este otro fichero, que empieza así:
KYUGIIFXZGBEV:::SMUD.NLMJBBPCQCT ÑYVKV.OVINCPMPMÑHYNWBC,:KQGKJBFU Z.N.IWQJAEGR,.NCRFCVLBÑ_FDNZ_QL: RKKK,BI.KÑ_GUVROHGHJPBHFSISSDEGH MHWZFHBF:RKL:YPXGÑQVVSEUB:Ñ_INKU ;__D,FZJ__:E,JD.EXH.MEND.KLÑFGHF BGBUOHTR__TG,;A.IPFFPMU,X:YZ:;SV ,:TGEKK:NAJIOAICE:QTQ.JNW.FKEHÑV I:XCUDA.,O:GYKPKLVBCKORDFIGYG_:A DV.VCKD:TVHÑ,HGOM,_BK_VCKDSSX:ZÑ :FRL,FNÑSF.VBZIXM,WNÑEED_AVZ_.CE .AIPHYDKUTVLOFIIZIHNPB.DN;CP,QÑE DZ,;WÑDÑRZIUO::ODUCLRBJSWZPXX:_Ñ T.UJBZZKKDSQBJZ,ZHHCRBLFMEBAF:WM Z:IUEXFXII;KMQACSXHLBUMFWM.X.NEE CGX:_IC:BIGMIH:NSM,BPRQVXXWIKNKO MD.IBHKKYG,RPPDIJVFYHGFQIQIJSGNÑ IVXQUMGKXSL:LWGCII,UBCW:RAZEVÑ_Z _EUZVYIWDVDZZCNCQMGTOESBOMPG_EU, QZGPUYUGP,Z,RWNSQNFG,LUF,FD_UUX: ZF_XV,PD.XKTOKMF;NPTGITPYKJDXUN. C:IKJ_MZF_CÑSWGQEÑFMW_HFZOPYZTDG U:_BYWRRNYVCHVO.BQBT.P,TIG_XL:WN CMGK::RVIILFGE:VJVKYE_HS;JNZRONK TJQNBGJX_CUMO_HWG,ESXGBAJYC,Z:YH :FZZRURDKOD;BZKZBHB_FZQ,FSFACTKG ÑHUVEHB;E,ZX.E:CX,:VOYNHW_QYDNUX ::CVGAZC,HIGCGUZBDMÑ;CGB_.KVD:BU IVT_SGFOSVHHZ,EKTK_HR_YEL.HCSCIZ ;ABOKDÑCCEÑLO:CZMU:YÑEYMYIK_LIJ_ C_FL,UZÑYHK.CAZTC.OOYIJY_KH.F.ZA SJ.N_I;YQTDYIESZTHNOROVINSRE,PXM JCBÑV,ZPH:TMFDN:_GQNPJVB.EIMÑKBJ Z_GGBVEROGGP:WKKPJ,CMOLUIYFRW.VM VFLBL:HVDXPXSW,ZPGQ_GEJEÑU,ZLOC; KNWRK:H:U,DF.FV:TK:JJOJZSTPNMLFA AOHÑZUYR_ZXLZFX:M,WZHNVG,MFLFQRF XLRDWGJ;GFPWFOTOGOFVUZEU,AGFXMXR IBT,ZFBP.WL:FDG_BIXIBDJYHD,UY:GW HMEJJGCI__AWFREEZFKJYOFKTTK,HQÑ: TV::B.TOCE.OBQPQÑIOBÑEYDNQ:TZFA_ AI,ARUCKOCPÑJN:HX,G,NZQS__RCTKGB BDNUGDIXQ.XVGKBYDIKYEUGKTSRG.QAG YZDIIERGÑBX_U;JYYÑA.ONDPJYFP:QGZ ZGSIXBTUO,Y_WCZZTQOQMKJ,DUAZ_IJH
Gracias por vuestra paciencia.

Mil gracias, Agustín
Te agradezco de verdad este resumen.
Después de todas las movidas del sitio estoy con stress postraumático ;)
Olvido
Pues se me ha olvidado poner el cifrado problema. En cuanto pueda lo haré.
Duda
No tengo ni idea, pero en donde dice:
V=20 A=00 L=11 E=04
P[0] = Σ K[i] modulo 32 = (22 + 00 + 11 + 04) modulo 32 = 37
modulo 32 = 5
O la V es igual a 22 o la suma debería modificarse, es así??
22
La V vale 22, como puede verse en el alfabeto. Se trata de un error.
Errores
Posts repetidos por error. La conexión wifi hecha con la tostadora no va bien.
Enlaces muertos
Parece que en el artículo están mal los enlaces al fichero cifrado del Quijote completo con la clave "VALE", y al fichero cifrado del reto. Cosas del cortar y pegar (mal).
Vaya!
Era una cuestión de comillas.
Ya está reparado.
Merci
Merci beaucoup!
Ataque a Omelette Aux Bits con texto conocido
Bueno, aquí explicaré el ataque a Omelette Aux Bits con texto conocido. Perdonad que haya tardado tanto, pero las circunstancias no me dejaron escribir ni desarrollar el ataque antes.
En el anterior ataque que publiqué, se necesitaba el alfabeto desordenado. En este ataque sólo se necesita texto y criptograma suficientemente largos. Este ataque no permitirá resolver el reto, pero creo que va a resultar interesante.
Este ataque se ha alargado un poco, así que lo escribiré en varias partes.
Como curiosidad interesante, en el anterior ataque obtuvimos una tabla de cifrado y su correspondiente tabla de descifrado que nos permitían, junto con el alfabeto desordenado, cifrar y descifrar los mensajes encriptados con la misma clave. Si consideramos el par alfabeto desordenado-tabla cifrado/descifrado como clave, tenemos que con este ataque que presento aquí obtenemos 240 claves (al menos para el ejemplo dado), es decir, 240 pares alfabeto desordenado-tabla cifrado/descifrado que permiten cifrar y descifrar mensajes encriptados con una misma clave. Si no me equivoco, este número se debe a que obtenemos claves para todas las permutaciones de los 5 bits de cada carácter (5!=120) y sus valores binarios inversos (cada valor tiene su inverso), por lo que tenemos en total 2*120=240 claves.
Ataque a Omelette Aux Bits con texto conocido. Paso 1
En este primer paso determinaremos en qué columnas del criptograma se reparten los bits del texto claro, aunque todavía no podremos determinar qué bits del texto claro están en qué columnas del criptograma, ni las posiciones exactas dentro de estas columnas (posiciones de bits dentro del bloque de 160 bits de la codificación binaria del bloque).
Tenemos que recordar que tanto el texto como el criptograma se dividen en bloques de 32 caracteres, codificados de la misma manera, y que los bits del texto claro no cambian su valor en el criptograma, aunque sí su posición.
Una observación simple y básica que tenemos que tener en cuenta es que letras diferentes tendrán codificaciones diferentes, y letras iguales codificaciones iguales. Otra observación es que, si tomamos todos los posibles valores binarios de "n" bits, de forma que compartan "m" bits con un mismo valor, tendremos en total 2^(n-m) valores diferentes.
Tomemos una determinada columna del texto claro. Sabemos que los bits de esa columna estarán repartidos en diferentes columnas del criptograma. Tomemos aquellos bloques del texto claro para los que la columna en cuestión tiene el mismo carácter. En el ejemplo dado por Agustín, tomemos, por ejemplo, todos los bloques cuya primera columna (columna 0) comience por "A", esto es:
A_DEL_REY_NUESTRO_SEÑOR,_DE_LOS_
AÑOS._JUAN_GALLO_DE_ANDRADA._TES
ADA_PLANA_Y_FIRMADO_AL_FIN_DEL_D
...
Sabemos que los bits de esta letra, cuya codificación desconocemos porque desconocemos el alfabeto desordenado, estarán repartidos por las columnas del criptograma. Sabemos que los bits estarán siempre en las mismas posiciones, y que su valor no varía. Supongamos que hemos determinado la columna del criptograma en la que se encuentra un bit del texto claro. Puesto que el bit siempre tendrá el mismo valor (porque estamos tomando siempre la misma letra del texto claro), si reunimos todas las letras de la misma columna en la que está codificado el bit del texto en claro, nos encontramos con que reuniremos un máximo de 16 letras, y no de 32, porque hay un bit que siempre toma el mismo valor, así que sólo pueden variar los 4 restantes, es decir, tenemos 2^4=16 valores diferentes posibles. Si tuviéramos codificados en esa columna 2 bits, reuniríamos como máximo 8 letras diferentes, y así sucesivamente.
Podemos aprovechar esta característica para averiguar en qué columnas de caracteres están los bits de la primera columna del texto. El procedimiento es simple. Tomamos todos los bloques del texto claro que tengan la primera letra igual. Por ejemplo, tomamos todos aquellos cuya primera letra sea "A". Ahora obtenemos todos los bloques del criptograma correspondientes a estos bloques de texto. Lo siguiente es ir reuniendo las letras de cada columna. Así, reunimos todas las letras de la primera columna por un lado, todas las letras de la segunda columna, por otro lado, y así sucesivamente. Para cada columna obtendremos un determinado número de letras diferentes.
Para el ejemplo dado, obtenemos las siguientes letras:
Columna 0: ABDEGHIKLÑPQSXY,
Columna 1: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 2: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 3: ABDEGHIKLÑPQSXY,
Columna 4: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 5: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 6: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 7: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 8: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 9: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 10: FNZ.
Columna 11: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 12: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 13: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 14: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 15: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 16: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 17: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 18: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 19: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 20: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 21: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 22: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 23: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 24: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 25: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 26: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 27: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 28: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 29: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 30: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Columna 31: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ_.,;:
Dada la observación anterior, si en una columna obtenemos más de 16 letras diferentes, sabemos con seguridad que en esa columna no hay ningún bit de la columna 0, porque es imposible tener más de 16 valores de 5 bits diferentes que compartan un mismo bit con un mismo valor. Así, aquellas columnas para las que obtengamos más de 16 letras diferentes quedan descartadas como columnas que alberguen un bit de la columna que estamos estudiando. En el ejemplo, las únicas columnas que no superan los 16 bits son la 0, la 3 y la 10. Tenemos, pues, las columnas de interés:
Columna 0: ABDEGHIKLÑPQSXY,
Columna 3: ABDEGHIKLÑPQSXY,
Columna 10: FNZ.
Siguiendo con la observación anterior, aquellas columnas que tengan entre 9 y 16 letras diferentes tendrán, como mucho, un bit de la columna del texto claro que estamos estudiando. Aquellas que tengan entre 5 y 8 letras diferentes tendrán, como mucho, 2 bits de la columna de estudio del texto claro, las que tengan entre 3 y 4 letras diferentes tendrán como mucho 3 bits, las que tengan 2 letras diferentes tendrán como mucho 4 bits diferentes, y las que tengan 1 única letra tendrán como mucho 5 bits diferentes. Decimos "como mucho", porque podría ocurrir que no hubiera suficientes letras, y el número de bits sea menor, incluso nulo.
En el ejemplo, observamos que en la columna 0 habrá como mucho un bit, en la columna 3 también habrá como mucho 1 bit, y en la columna 10 habrá como mucho 3 bits. El hecho de que haya potencias de 2 en el número de letras diferentes es un indicio de que el número de bits es el máximo permitido, es decir, que en el ejemplo, es indicio de que tenemos 1 bit en la columna 0, otro en la columna 3, y 3 en la columna 10. Además, como el número de bits de cada carácter es de 5, si la suma de estos máximos de bits es igual a 5, es casi una certeza de que hemos determinado correctamente el número de bits. En nuestro caso, tenemos 1+1+3=5, con lo que suponemos que hemos determinado correctamente el número de bits de la columna 0 del texto claro en cada columna del criptograma, esto es:
Tenemos un bit de la columna 0 del texto claro en la columna 0 del criptograma
Tenemos un bit de la columna 0 del texto claro en la columna 3 del criptograma
Tenemos tres bits de la columna 0 del texto claro en la columna 10 del criptograma
Todavía no sabemos qué bits de la columna 0 están en qué columna del criptograma.
Esto se repite para el resto de las columnas del texto claro, obteniendo así una lista de las columnas en las que están los bits de cada columna del texto claro en el criptograma. Esta lista la usaremos más adelante para obtener la tabla de cifrado/descifrado.
Si por casualidad, con una letra del texto claro no obtenemos resultados concluyentes, probaremos con otra, hasta obtenerlos. Es posible que las letras obtenidas no coincidan con diferentes letras elegidas del texto, pero su número, para los casos correctos, sí que coincidirá.
Ataque a Omelette Aux Bits con texto conocido. Paso 2
En este segundo paso agruparemos las letras del alfabeto en grupos que comparten un determinado bit (no sabemos cuál) con un determinado valor (tampoco sabemos cuál) cuando obtenemos su codificación con el alfabeto desordenado (que de momento desconocemos).
En el paso anterior obtuvimos grupos de letras diferentes para cada columna del criptograma. Las que nos interesaron entonces fueron las que tenían 16 o menos letras. En este paso nos interesarán aquellas que tengan exactamente 16 letras.
Como vimos en el anterior paso, que una columna tenga entre 9 y 16 letras diferentes es indicio de que esas letras comparten un mismo bit con un mismo valor. Supongamos que conocemos qué letras comparten un cierto bit. Sabemos que los grupos de estas letras serán de 16 letras diferentes. Por otro lado, si queremos ver qué letras comparten el mismo bit, pero con valor opuesto, basta obtener el conjunto complementario, es decir, las otras 16 letras del alfabeto. Por ser conjuntos complementarios, su intersección será nula.
El interés de agrupar las letras por un determinado bit en común con un mismo valor es el siguiente. Supongamos que conocemos la codificación de todas las letras. Podemos obtener fácilmente los conjuntos en los que las letras comparten un cierto bit con un cierto valor. Supongamos que tenemos esos conjuntos. Serán 10 en total, pues tenemos 5 bits, cada uno de los cuales puede tomar 2 valores. Ordenemos los conjuntos por el orden de bit menos significativo que representan, y los emparejamos con su complementario. Es decir, el primer conjunto representa las letras que tienen el bit menos significativo a 0, emparejado con su complementario (es decir, el que tiene el bit menos significativo a 1), el segundo está formado por las letras que tienen el segundo bit menos significativo a 0, y su complementario, y así sucesivamente.
Teniendo así los conjuntos, tomemos una letra cualquiera. Determinemos a qué conjuntos pertenece. Los conjuntos a los que pertenecerá serán aquellos que tengan su correspondiente bit al mismo valor que el bit de la letra. Si a cada conjunto le damos la etiqueta "0" o "1" en función del valor que tome el bit que representan, y escribimos estas etiquetas en orden según el conjunto tomado por la pertenencia de la letra, obtendremos la representación binaria del código de la letra. Es decir, que si disponemos de los conjuntos de letras por bits que comparten, podremos obtener una representación binaria de cada letra.
Pues bien, si obtenemos en el paso anterior los conjuntos de 16 letras (verificando que son letras que comparten un mismo bit con un mismo valor), estamos obteniendo los conjuntos que buscamos. En el ejemplo anterior, para la columna 0 del texto claro, teníamos:
Columna 0: ABDEGHIKLÑPQSXY,
Es decir, que estas letras comparten un mismo bit (no sabemos cuál) con un mismo valor (tampoco sabemos cuál). Su conjunto complementario será "CFJMNORTUVWZ_.;:", que son las letras que comparten el mismo bit que las otras, pero con valor opuesto.
Si observamos la columna 1 del texto claro, tenemos:
Columna 0: EFIJKLNÑOUWXYZ.,
Columna 1: CDEGHIMNÑPRTUWYZ
Columna 9: ABDFGLMÑORUVYZ,:
Columna 10: CEHJNPQSTWX_.;
Columna 11: ABFJKLOQSVX_.,;:
Nos interesan las columnas 0, 1, 9 y 11. La columna 10 no tiene 16 letras, por lo que no podemos determinar todas las letras que comparten el mismo bit. Si observamos, tenemos ya 4 conjuntos de letras diferentes, que con sus respectivos conjuntos complementarios, suman ya 8 conjuntos, es decir, que nos falta un conjunto más, con su complementario, para tener todos los conjuntos de letras agrupados por bits individuales compartidos:
ABDEGHIKLÑPQSXY, <-> CFJMNORTUVWZ_.;:
EFIJKLNÑOUWXYZ., <-> ABCDGHMPQRSTV_;:
CDEGHIMNÑPRTUWYZ <-> ABFJKLOQSVX_.,;:
ABDFGLMÑORUVYZ,: <-> CEHIJKNPQSTWX_.;
Siguiendo así, acabamos obteniendo los siguientes conjuntos de letras:
ABDEGHIKLÑPQSXY, <-> CFJMNORTUVWZ_.;:
ABCDGHMPQRSTV_;: <-> EFIJKLNÑOUWXYZ.,
CEHIJKNPQSTWX_.; <-> ABDFGLMÑORUVYZ,:
ACDFHIKNÑQRZ.,;: <-> BEGJLMOPSTUVWXY_
CDEGHIMNÑPRTUWYZ <-> ABFJKLOQSVX_.,;:
Con este método puede que no haga falta recorrer todas las columnas y todas las letras para obtener los conjuntos de letras. Basta obtener 10 grupos de letras diferentes de 16 letras cada uno.
Como se dijo en el anterior paso, si con una letra del texto claro no obtenemos resultados concluyentes, podemos probar con otra, hasta obtenerlos. Si aún así, para un determinado conjunto no obtenemos sus 16 letras, siempre podemos buscar entre todos los conjuntos obtenidos aquellos que sepamos con seguridad que representan el mismo, y hallar su unión. Dados dos conjuntos de 9 o más letras cada uno, ambos pertenecerán al mismo conjunto si su intersección tiene 9 o más letras. Téngase en cuenta que estamos hablando de los conjuntos con estas características que estamos buscando, y esto no puede generalizarse a la teoría de conjuntos :). En caso de encontrar dos de estos conjuntos con una intersección de 9 o más letras, los uniremos para obtener nuevas letras (si es que tienen letras que no comparten). Si dos conjuntos con 9 letras o más tienen una intersección nula, entonces uno pertenece al complementario del conjunto al que pertenece el otro. Por otro lado, si tenemos un conjunto completo de 16 letras, podemos obtener el complementario directamente.
Ahora ya tenemos los diferentes conjuntos agrupados por un mismo bit con un mismo valor, pero no sabemos qué bit comparten ni qué valor tiene ese bit. Esto lo averiguaremos en el siguiente paso.
Ataque a Omelette Aux Bits con texto conocido. Paso 3
En este paso obtendremos la tabla de cifrado/descifrado y el alfabeto desordenado. En el paso anterior obtuvimos la agrupación de las letras por conjuntos en los que comparten un mismo bit con un mismo valor, aunque no sabemos qué bit comparten, ni qué valor comparten.
Los conjuntos que obtuvimos son:
ABDEGHIKLÑPQSXY, <-> CFJMNORTUVWZ_.;:
ABCDGHMPQRSTV_;: <-> EFIJKLNÑOUWXYZ.,
CEHIJKNPQSTWX_.; <-> ABDFGLMÑORUVYZ,:
ACDFHIKNÑQRZ.,;: <-> BEGJLMOPSTUVWXY_
CDEGHIMNÑPRTUWYZ <-> ABFJKLOQSVX_.,;:
Ahora mismo, podemos asignar una etiqueta "1" a cada conjunto, y una etiqueta "0" a su respectivo complementario, y tendremos una representación binaria diferente para cada letra si escribimos las etiquetas de los conjuntos a los que pertenece. Si ordenamos las letras por este valor binario, obtenemos un alfabeto desordenado, que puede ser el alfabeto que nos permita descifrar el criptograma o no. Si no es el alfabeto que buscamos, podemos cambiar las etiquetas "0" y "1" de uno o más conjuntos y volver a probar. Pero no sólo eso, sino que podemos cambiar el oden en que se escriben estas etiquetas para obtener otro valor binario. Si probamos todas las combinaciones posibles, al final obtendremos el alfabeto desordenado correcto.
El número de formas en que pueden darse valores "0" y "1" a los conjuntos es de 2^5, pues tenemos 5 grupos, cuyo valor define el valor de sus respectivos grupos complementarios. El número de formas en que pueden ordenarse los conjuntos es de 5!, porque igual que antes, el orden de un conjunto es el mismo que el de su complementario. Así, pues, el número máximo de pruebas que tendremos que hacer para obtener un alfabeto desordenado correcto será: 2^5*5!=32*120=3840, que es un valor asequible para realizarlo por fuerza bruta.
Una vez establecida una permutación y una etiqueta para cada conjunto, obtendremos el alfabeto desordenado sin más que obteniendo los conjuntos a los que pertenece cada letra del alfabeto ordenado, escribiendo el valor de la etiqueta del conjunto al que pertenece en el orden que determina la permutación.
Una vez obtenido el alfabeto desordenado, tendremos que comprobar si es correcto. Hay dos formas de hacerlo. La primera es realizando el ataque con texto claro y alfabeto desordenado que expliqué anteriormente. En este caso, el algoritmo no debe detenerse cuando todas las plantillas tengan un único bit, sino que hay que realizarlo hasta el final, para descartar posibles falsos positivos. Esto nos permite obtener la tabla de cifrado/descifrado que nos permitirá cifrar/descifrar el texto/criptograma. Para asegurarnos de que hemos obtenido el par alfabeto desordenado-tabla cifrado/descifrado, bastará cifrar el texto con dicho par y ver que el criptograma obtenido coincide con el que teníamos, o bien descifrar el criptograma y ver que el texto obtenido coincide con el que teníamos. Si resulta que no hemos obtenido el alfabeto desordenado correcto, obtenemos el siguiente, cambiando las etiquetas de los conjuntos y obteniendo una nueva permutación, en orden para contemplar todos los casos.
La otra forma de obtenerlo se explica en el siguiente paso.
Ataque a Omelette Aux Bits con texto conocido. Paso 4
En el paso anterior se explicó cómo obtener el alfabeto desordenado y la tabla de cifrado/descifrado utilizando el ataque con texto claro y alfabeto desordenado. Aquí se explicará otra manera, parecida.
Si el alfabeto desordenado que hemos obtenido es correcto, podemos determinar la codificación de las letras. En el primer paso obtuvimos qué columnas del criptograma contienen los bits de una determinada columna del texto claro. Ahora que tenemos la codificación, podemos determinar exactamente qué bit del criptograma contiene a qué bit del texto claro de la columna en la que estamos trabajando.
Para ello, supongamos que estamos trabajando en la columna 0 del texto claro, y que queremos determinar qué bit del criptograma contiene el bit 0 de la columna 0 del texto claro. En el paso 0 obtuvimos las columnas del criptograma que contienen los bits de esta columna 0 del texto claro. Pues bien, trabajaremos sobre estas columnas. En nuestro caso, las columnas eran la 0, 3 y 10.
El procedimiento a seguir es muy parecido al del ataque con texto claro y alfabeto desordenado. Construimos una máscara de 5 bits para cada columna del criptograma en la que vamos a trabajar, y ponemos todos sus bits a 1. Leemos el carácter de la columna 0 del primer bloque del texto claro. En este caso, tenemos:
EL_INGENIOSO_HIDALGO_DON_QUIJOTE ---> Cogemos la "E" (columna 0)
Obtenemos el código de la letra "E" con el alfabeto desordenado que estamos probando. Ahora tomamos su bit 0. Tomamos los caracteres del criptograma en las columnas 0, 3 y 10. En este caso, tenemos:
B,NZTSW,WAS.WDQXFVGAKQÑXHEVTXEGN ---> Cogemos la "B" (columna 0), la "Z" (columna 3) y la "S" (columna 10)
Hallamos la codificación de cada una de estas letras, según el alfabeto desordenado que estamos probando. Si el bit del texto claro vale 0, hallamos el inverso de la codificación de estas letras. Si vale 1, dejamos la codificación de estas letras como está. Ahora hacemos AND de cada una de estas letras con su respectiva máscara, y guardamos el resultado en la máscara. Esto, como en el ataque con texto claro y alfabeto desordenado, dejará en cada máscara los candidatos a ser los bits en los que se mueve el bit del texto claro que estamos estudiando.
Pasamos al siguiente bloque del texto claro, en este caso "_DE_LA_MANCHA_TASA_YO,_JUAN_GALL", tomamos la letra de la columna 0, obtenemos su codificación, tomamos su bit 0, tomamos el siguiente bloque del criptograma, cogemos las letras de las columnas 0, 3 y 10, obtenemos su codificación, la invertimos si el bit del texto claro vale 0, y hacemos AND con sus respectivas máscaras, y así hasta terminar con todos los bloques del texto claro.
Si en algún momento las diferentes máscaras toman simultáneamente el valor 0, entonces el alfabeto desordenado está mal, porque debería haber un bit de la columna 0 en alguna de las columnas de trabajo del criptograma, y hemos descubierto que no es así. Si al finalizar el proceso más de una máscara tiene un valor no nulo, también está mal el alfabeto desordenado (o no tenemos suficiente texto), porque un bit del texto sólo puede aparecer en un bit del criptograma.
Si el alfabeto desordenado está bien, y tenemos suficiente texto, al final sólo una máscara debería tener activo un único bit (si tuviera más de un bit activo, o bien el alfabeto desordenado está mal, o bien no tenemos suficiente texto). En este caso, hemos obtenido en qué bit del criptograma está el bit del texto claro con el que hemos trabajado (la posición será 5*columna de la máscara+posición del bit que está activo, la posición cuenta de más significativo a menos significativo). Este valor lo vamos almacenando en una tabla, que será la tabla que nos permitirá descifrar (hacemos tabla[0]=posición del bit).
Este proceso se repite para cada bit del carácter con el que estamos trabajando, y con cada carácter del texto claro. Si en algún paso se produce un error, el alfabeto desordenado que hemos elegido está mal, y tenemos que obtener otro y repetir el proceso.
Para obtener el siguiente alfabeto, cambiamos las etiquetas de cada conjunto, y obtenemos una nueva permutación, en orden, para explorar todos los casos.
Una vez terminado el proceso, tenemos el alfabeto desordenado y la tabla de descifrado (o de cifrado, dependiendo de cómo se hayan guardado los datos y se interpreten). La tabla que permite realizar la operación inversa se halla invirtiendo la tabla obtenida (haciendo tabla2[tabla[i]]=i). Para asegurarnos de que hemos obtenido el alfabeto desordenado y la tabla de cifrado/descifrado correctos, bastará cifrar el texto con este par y comprobar que el criptograma obtenido coincide con el que teníamos, o bien descifrar el criptograma y comparar el texto obtenido con el que teníamos.
Pues bien, realizando este ataque con el ejemplo dado por Agustín, utilizando todos los posibles alfabetos desordenados, resulta que se obtienen 240 pares de alfabetos desordenados-tablas cifrado/descifrado válidos que permiten cifrar y descifrar el problema. Lo curioso de estos pares es que la mitad corresponden a un mismo etiquetado de los conjuntos, y todas las permutaciones posibles, y la otra mitad corresponde al etiquetado inverso, con todas las permutaciones posibles. No sé si esto es aplicable a todos los casos, pero si es así, a la hora de buscar el alfabeto desordenado no hace falta permutar los conjuntos, sólo darle diferentes etiquetas a los conjuntos. Esto acelera mucho el proceso, ya que en el peor de los casos, habrá que realizar 16 pruebas (hay 32 posibles maneras de etiquetar los conjuntos, y si un etiquetado es solución, también lo será el etiquetado opuesto, si todo esto se cumple).
Quizá esto sea una debilidad, pero ahora no se me ocurre cómo utilizarla.
Pasmado
Pasmado me he quedado con la profundidad de tu estudio. Desde luego, tengo que volverlo a leer (varias veces). Cuando veo estos trabajos, creo que la pequeña triquiñuela del cifrado no està a la altura. Gracias, sqrmatrix.
¿Cómo que no está a la altura?
Todo el cifrario que has construido está más que a la altura. Míranos, a todos, devanándonos los sesos para romperlo. Si eso no es estar a la altura...
Bueno, y después de esta pequeña bronca :), agradecerte tus palabras. Todavía sigo sin ver la solución al reto. Pero bueno, seguiré pensando en él.
Ah, y las gracias a tí, por construir estos cifrarios tan malvados que tan entretenidos nos tienen :). Un saludo.
Muy bueno
Me ha gustado mucho tu ataque y me está despertando de nuevo el gusanillo (serpiente pitón a estas alturas) para retomar omelette. Yo estoy atascado en el filtrado de falsos positivos (infinidad de ellos) y tu método me está dando algunas ideas que podrían ser útiles.
Cuidado no te devore la
Cuidado no te devore la serpiente.... Gracias por tu comentario. Espero que las ideas que te surjan te permitan resolver el reto. Yo todavía no veo cómo meterle mano. A ver si poco a poco, entre todos, vamos arañando un poquito a esta bestia. A ver si a todos nos entra el gusanillo, gusanillo que se transforma en serpiente, y todas las serpientes forman una jauría de serpientes, y... creo que es hora de tomar mi medicina :)
Creo que tengo algo
Siguiendo el camino abierto por sqrmatrix y uniéndolo a mis idas de olla de los siameses creo que como mínimo confirmo mis sospechas sobre la columna 21 y de paso podemos obtener uno de los primeros grupos.
Partiendo de la base de que si realmente en la columna 21 retuviéramos 4 bits originales entonces existiría otra columna donde habría ido a parar el que nos falta, he filtrado por los carácteres más probables en la 21 para contener los 4 bits del espacio en blanco, que són la "B" y el propio "_" (el quinto será del ajeno). Mirando como quedan las columnas cuando en la 21 hay uno de estos 2 vemos que en la 10 tenemos:
Es decir 16 carácteres con aparición muy baja y 16 alta. Dado que la frecuencia de la "B" y la "_" son, sumadas de un 20% y la teórica del espacio sólo de un 18%, el carácter siamés del espacio tendría una aparición de un 2%. Así los carácteres que realmente provienen del espacio serían los que fijarían el bit de la col 10 para los de alta frecuencia y el del siamés serían los de la baja. Así el grupo quedaría como
;QAW.,TUY:ÑRPNDK <-> SLEVCHJIMBXGFOZ_
ordenado
ADKNÑPQRTUWY.,;: <-> BCEFGHIJLMOSVXZ_
Razón
Seguramente tiene razón, pero qué raro habla este hombre.
La culpa es tuya
Por desturutarme las neuronas XD
Los siameses de 5 bits
No creas que haya comprendido del todo lo que cuenta sqrmatrix, pero tengo la impresión de que releyéndolo, y con papel y lápiz, podré enterarme. Pero es que él se ha extendido durante páginas y páginas detallando su método. Creo que tu hallazgo también requeriría algo más de explicación para que los discalcúlicos nos enteremos de algo.
Me explayo un poco más
Como ya comenté en el otro foro, la peculiar distribución de frecuencias de la columna 21 indican que ahí hay algo raro. Esas frecuencias son muy similares (aunque no idénticas) a las de una distribución tipo regenta. Además parecen agruparse fácilmente por pares.
Eso me llevó a pensar que esos carácteres podían estar formados por 4 bits de un carácter original (de otra columna probablemente) + 1 bit ajeno. Así tendríamos 16 parejas que podríamos agrupar por los bits originales. A estos les llamé siameses.
Aunque intuitivamente me cuadraba no tenía una demostración de que esto era realmente así. Adaptando el método de sqrmatrix creo que lo he conseguido.
Sqrmatrix parte de disponer simultáneamente el texto claro y el cifrado para encontrar el alfabeto derivado. En el reto no tenemos esto, pero si la columna 21 tiene 4 bits originales tenemos algo muy parecido. Así, donde sqrmatrix parte de un único carácter del texto claro para ubicar sus bits en el cifrado, yo he de partir de una pareja (siameses). Como tampoco se que carácteres son siameses entre ellos lo he de suponer a partir de sus frecuencias, que sabemos que serán parecidas. Como caso más favorable busco el espacio en blanco.
En la columna 21 tengo dos carácteres con frecuencia alta, "_" y "B", ambos con alrededor de un 10%. Si son siameses la mayoría de esos "_" y "B" contienen 4 bits del espacio en blanco del texto claro y algunos (los menos) de su siamés (el que sea). Si tenemos razón, además, el bit que nos falta afectará a otra columna de manera coordinada con estos carácteres.
Así tenemos que los 5 bits del espacio en el texto claro se convierten en los 4 de la "B" y "_" más un bit en otra columna. Vamos a ver en cual. Dado que el siamés ha de tener una frecuencia muy inferior a la del espacio en blanco (su suma es inferior al 20% y el espacio debe tener un 18%), cuando en la 21 tengamos "B" o "_", a la columna afectada llegaran muchos mas veces un bit del espacio que del siamés, que será distinto ya que es el que los diferencia.
Mirando como se comportan el resto de columnas cuando en la 21 tenemos "_" o "B" nos encontramos en la 10 con las frecuencias que indicaba antes, cosa que casa maravillosamente con todas las suposiciones previas, es decir 2 grupos de carácteres con frecuencias muy distinas, uno con el bit diferenciador a 0 y otro a 1. Aún no sabemos que bit es ni cual es su valor, pero podemos afirmar que esos grupos lo comparten.
Espero que me haya quedado algo más didáctico.
ops, mal ubicado
iba como respuesta a Agustín. ¿puede moverse?
Mejor ahí
Para que todo el mundo lo vea.
Siguiendo con las influencias entre columnas
El método adaptado del de sqrmatrix va proporcionando resultados interesantes. Estoy analizando como se comoportan las demás columnas cuando en una de ellas aparece el carácter más repetido. La intención es encontrar más columnas con N bits de un byte (de 5) original, entenciendo que si cambia mucho el comportamiento de otra columna al filtrar sólo por ese eso indicará una correlación entre ellas. Por ejemplo fijando la columna 20 a "B" (el más frecuente) nos da esta afectación por columnas. Los números es el porcentaje de cambio del porcentaje (ufff) de aparición de esa letra con respecto a no filtrar, es decir, que si sin filtrar la "A" representa un 10% de las apariciones y filtrando un 15%, eso es un 50% de alteración. El resultado es en valor absoluto, puesto que nos interesa tanto los incrementos como los decrementos. No hagais mucho caso a la propia columna 20, puesto que obviamente desaparecen todos los valores salvo la "B".
Imágenes:
Estudiando
Estoy estudiando tu trabajo y el de sqrmatrix. Creo que tengo trabajo para varios días.
Y más que te preparo
Ahora estoy cazando columnas con 3 bits. La idea es que si tenemos 3 (mucho más fácil que 4) dispersamos 2 bits en otras columnas (1 o 2). Si, como es más probable, están en columnas distintas, entonces al filtrar por el carácter más frecuente la que estamos probando estaremos limitando a 4 carácteres los que nos proveerán los 3 bits de ese más frecuente. De esos 4 carácteres, además, 2 tendrán cada bit dispersado a 0 y otros 2 a 1, en las 4 combinaciones posibles puesto que es lo que les distingue.
Supongamos pues que de esos 4 carácteres algunos tienen frecuencias distintas. Que alguna de ellas o es bastante superior al resto o bastante inferior. Si es así, en alguna de las 2 columnas dispersadas tiene que haber una fuerte incidencia forzosamente y tiene que afectar a todos los carácteres, 16 de ellos subirán su porcentaje aparición y los otros 16 lo disminuirán.
Imaginemos que por ejemplo tenemos
_ = 01010
L = 00110
N = 00010
Z = 01110
Y que en la columna que estamos mirando retenemos los bits 1,4 y 5. El bit 2 y el 3 han ido a parar a las columnas Ci y Cj respectivamente, en alguna posición que desconocemos. Filtramos por el carácter más frecuente en la columna analizada. No es mucho suponer que será alguno de estos valores por incluir a "_". En la columna Ci no vamos a notar gran cosa puesto que las frecuencias de "_" y "Z" sumadas pueden equilibrarse con las de "L" y "N", pero en Cj el cambio tiene que ser muy notable puesto que tendremos las frecuencias de "_" y "N" frente a las de "L" y "Z". Todos los carácteres que compartan ese bit a 0 en la columna Cj subiran y los que lo tengan a 1 bajarán. Con esto podremos crear otra pareja de grupos del método de sqrmatrix.
Si por mala suerte los 4 carácteres tienen una frecuencia parecida no podremos determinar nada. En ese caso podemos probar otro carácter de la misma columna (el 2º en número de apariciones) o decidir que no tiene 3 bits originales.
Mañana recupero mi entorno de programación, me pongo a ello y a ver si saco algo en claro de todo esto.
Ánimo
He estado ausente muchísimo tiempo y, con el trabajo que sigo teniendo, no creo que pueda contribuir para nada a la resolución de este reto. Pero bueno, simplemente os envío mis ánimos y ya veo que a pesar del cambio os seguís divirtiendo.
Saludos
AgustínB
La yema y la clara
Antes de encerrarme con una caja de Lexatín y una botella de sifón, para tratar de desenredar las sofisticadas ideas de sqrmatrix y LlamameX, voy a poner una idea que igual les sirve a ellos más que a mí. Me refiero a la cantidad de yema que hay en la tortilla, es decir, al número de "unos" que tenemos en una línea, y el que supuestamente deberíamos tener.
Como el número de unos y de ceros del cifrado coincide exactamente con el del texto en claro, sería posible extraer alguna información con respecto al alfabeto modificado. Me explico:
En el alfabeto estándar, a la A le corresponde el binario más bajo, "00000", mientras que al símbolo ":" le corresponde el más alto, "11111". Dado que en el texto hay una distribución de frecuencias de cada símbolo, en el texto plano hay una cantidad determinada de unos y de ceros. Y en cada línea hay una cantidad que podemos estimar o incluso determinar exactamente, si nos tomamos la molestia de contar la letras. Llamaremos al número de "unos", la "yema". Ocurre que al establecer el alfabeto modificado, las letras se desplazan, correspondiéndoles nuevos códigos binarios. Eso quiere decir que la cantidad de yema en todo el texto -y en cada línea- aumentará o disminuirá. Si la E, o la A, cuyos códigos son pobres en unos, se desplazan hacia la parte alta del alfabeto, aumentará la yema. Por el contrario, si el separador o los signos de puntuación se desplazan hacia la parte baja, la cantidad de yema disminuirá. Es de temer que ambos efectos estén generalmente compensados, y no se puedan extraer conclusiones; pero como una idea es una idea, aunque sea birriosa, ahí la pongo, junto a las estadísticas que he obtenido del texto del Quijote completo. No lo he hecho con el cifrado, porque no sé si vale la pena:
No creo que se pueda sacar nada de ahí
Era una alternativa a la que le di vueltas un tiempo, pero realmente no podemos decir nada a priori de la asignación de 1s y 0s a los carácteres puesto que después también desaparecen sin dejar rastro. Es decir, podemos codificar la A como 00000 o 11111 pero cuando encontremos una A en el cifrado no tendremos ni idea en principio de como hemos llegado hasta ella. De hecho, que Sqrmatrix encuentre exactamente 240 distribuciones de alfabeto que le sirvan (2*5!) es indicativo exactamente de eso, de que nos da igual que los 0s sean 1s o los 1s 0s y de como los ordenemos entre ellos.
Me lo temía
Tan solo tenía la esperanza de que sirviera para acotar las posiciones de algunas letras en el alfabeto derivado, pero he cometido un grave error de concepto, y es que no podemos saber cuántos bits tenemos porque no coocemos el alfabeto derivado.
Estoy siguiendo
con mucho interes la evolucion gastronomica de agus, y como poco a poco se estan merendando la omelette nuestros hambrientos cocos, en una pausa para el cafe no he podido contenerme y me he puesto a reir pensando en cual será el proximo "guiso" que se cueza en sus fogones, quizas unas ¿lentils aux sausage?, estoy impaciente por ver el segundo plato, digno de los mejores paladares lugareños!.
Imágenes:
Saludos
ElCojo
¡Aaaaah!
¡Qué hambre!
El complemento indispensable
de todo buen criptoanalista, unas buenas lentejas con su chorizo, su oreja y su tintorro, para atacar cualquier problema intratable con actitud optimista!
Saludos
ElCojo
¡Confirmación!
Vamos bien. Acabo de obtener confirmación. 2 Columnas me dan la misma distribución de bits, es decir, que el grupo es correcto y toda la teoría es válida. Por el momento ya tengo 6 grupos. Sólo me faltan 4 para tener una ataque contra el alfabeto derivado.
Hasta ahora tengo
que nervios, que nervios XDD
Y otra más
Congruente con Col 15 -> 25
Huy, huy, huy
Agustín: ¡Que nos cascan los
huevos!!Antes
Este hombre me va a romper la triquiñuela antes de que yo haya comprendido su método.
Ahora cuesta encontrar combinaciones
Creo que ya he agotado las de 3 bits y estoy con las de 2. He encontrado otra congruente con 15 -> 25 que sería 9 -> 13, pero necesito 2 parejas de grupos nuevas y ahora con tan pocos bits ya todos los repartos son mucho más difusos, puesto que son más carácteres a sumar y se compensan más entre ellos. Toca entonces buscar más confirmaciones antes de dar por bueno un grupo.
Todos los grupos obtenidos y verificados
Col 20 -> 8 ABCDFHLMÑOTWY_;: <-> EGIJKNPQRSUVXZ.,
Col 21 -> 10 ADKNÑPQRTUWY.,;: <-> BCEFGHIJLMOSVXZ_
Col 15 -> 25 ADFGJKMNÑOPRXZ_: <-> BCEHILQSTUVWY.,;
Col 17 -> 11 BDEFGHIKNWYZ_.,: <-> ACJLMÑOPQRSTUVX;
Col 17 -> 10 AEFGHJLMNPQSW.;: <-> BCDIKÑORTUVXYZ,_
Col 16 -> 30 confirma 17 -> 11
Col 16 -> 11 confirma 17 -> 10
Pasando a fase 2, id poniendo la mesa
¡¡¡Ahivalahostia!!!
Esta vez parece que va en serio. Y yo con estos pelos.
Si si, esto está encarrilado
La prueba del nueve, que no había hecho y que me habría servido para encontrar el quinto grupo a partir de los otros 4, es asignar 0 o 1 según izquierda y derecha y ver si asigna un único valor a cada carácter. Como veo que es así ya no me cabe duda de que los valores son correctos.
De hecho éste es uno de los alfabetos derivados posibles.
No por mucho madrugar
El alfabeto derivado es
ZIXVK,RUGEJSN.PQ_BOCDYÑTFHML:WA;
Y la clave empieza por "NO_POR_MUCHO_MADRUGAR".
Aún no descrifro todo pero casi
¡amanece mas temprano!
Jajaja, ¡está escrito al revés y se saltó mis palabras probables! ¡buen intento!
Los últimos 160 carácteres al revés
.ZUL_ARODAUGICAPA_,ELBICNEVNI_,ARERTSOP_AL_ED_Y_SOURTSNOM_SOREDADREV_SOL_ED_EUQSOB_LE_AICAH_,ETSIRT_ERBMOH_ERBOP_,AIROLG_ED_Y_ROMA_ED_OSOISNA_,OÑEUQEP_OURTSNOM_ERBOP_,OZRAMOB_ED_OURTSNOM_ERBOP_,ESARTSARRA_EM_Y_ARAGEC_SOL_ELBACALPMI_EHCON_AL_EUQ_ED_SETNA_,NOREIV_SOJO_SIM_EUQ_,ODAPSIRC_EUQIÑEM_IM_NE_,OMITLU_OL_,ORUP_ORECA_E_ZHE_,
Imagino que se trata de
http://patriciadamiano.blogspot.com.es/2008/09/manuel-mujica-linez-bomar...
¡Una ración de tortilla, por favor!
Agustín!!!!!!
¿Qué te dije?
Primero nos casca los huevos y ahora se quiere comer la tortilla!!!
LlamameX, eres el más grande
Habría que componerte un pasodoble, como a los toreros. Cuando llegue a casa hablamos.
Como cayó Omelette
Resumen de meses de ataques y divagaciones.
Como cayó Omelette
De entrada buena parte del mérito hay que atribuírselo a Sqrmatrix, quien con su ataque con texto claro me dio la idea que finalmente tumbó al monstruo.
Como ya se vio desde el inicio Omelette tiene una gran debilidad y es que todos los bloques de 32 letras se baten igual: cada bit de un grupo de 160 va a parar a la misma posición destino. Sin embargo, no es nada fácil explotarla puesto que la codificación en bits no deja rastro en el cifrado final y no podemos saber, a priori, las asignaciones de mapas de bits a las letras. Por supuesto tampoco sabemos nada de las posiciones destino antes comentadas.
Antes de empezar el análisis comentar que hablaré de columnas de carácter y columnas de bit. Se refieren a los carácteres/bits que comparten la misma posición en cada grupo de 32/160.
Así puestas las cosas y tras algunos intentos infructuosos (debidos a interpretaciones erróneas del algoritmo) empecé a analizar las frecuencias por columnas de carácter. Rápidamente destacó una de ellas, la 21, que presentaba los siguientes porcentajes de aparición:
Lo realmente relevante no son solo las frecuencias altas, sino los casi ceros. Tener un 0 para un valor en una de las columnas es realmente difícil, ya que quiere decir que hay poquísimas combinaciones de bits que nos lo generen. Si los 5 bits vienen de carácteres distintos eso es prácticamente imposible, puesto que para cada uno de ellos hay 16 carácteres que pueden generarlo. Por ejemplo, imaginemos que para ":" tenemos "01010", donde cada bit provendría de una columna original distinta C1, C2, C3, C4 y C5. En C1 hay 16 caracteres con el bit que se vino a la C21 a 0, en C2 16 a 1, etc. Es prácticamente imposible mantener ese nivel casi a 0 sabiendo que trabajamos con unos 152.000 carácteres, unas 4750 filas.
Así pues hemos de concluir que en esa columna de carácter los bits que tenemos no provienen todos de carácteres ditintos. Tendremos 2 o más bits que vienen de la misma columna original. Si nos fijamos entonces en el resto de la distribución vemos otra cosa llamativa y es que es muy fácil agruparlos por pares de frecuencias similares. Si pensamos que la distribución de los bits individuales es bastante uniforme (esperamos un 50% de 1s y otro de 0s por columna de bit), vemos que la diferencia en un único bit nos provocaría este efecto, puesto que si los carácteres de la 21 están compuestos por [b0,b1,b2,b3,b4], la "B" y el "_" podrían tener coincidentes b0,b1,b2 y b3 y tener b4 formado por un 50% de 0s y otro de 1s.
A partir de aquí empecé a aventurar ataques basados en obtener las sumas de frecuencias por pares (lo que llamé siameses) respecto a una distribución estandard del castellano. la intención era obtener un alfabeto derivado que cuadrara tanto en las frecuencias como en el posible reparto de bits. Esos ataques ofrecían tal cantidad de falsos positivos que los hacían inviables.
Ahí estaba atascado hasta la aportación de Sqrmatrix quien genialmente analizó como sería un ataque para obtener el alfabeto derivado si dispusiéramos del texto claro y del cifrado (de lectura imprescindible).
Aunque el método no era directamente aplicable, puesto que no disponía del texto en claro si me encendió la bombilla. En vez de atacar los más que posibles 4 bits de la columna 21 había que ir a buscar nuestro bit prófugo y ver como alteraba otra columna.
Sabía que muy probablemente "B" y "_" del cifrado escondían 4 bits del carácter más probable del texto original, el "_", así que si me limitaba a ver que le ocurría a las demás columnas cuando en la 21 sólo aparecían "B"s y "_"s tenía que notar algo, ya que de los dos carácteres que nos proporcionaban esos 4 bits de la 21 uno era mucho más probable que el otro. con lo cual el número de 1s respecto a 0s en el bit prófugo sería muy distinto. Eso tenía que provocar una polarización de los carácteres en la columna destino. Los 16 que tuvieran el bit prófugo con el valor más probable habían de aumentar su aparición respecto a los 16 que lo tuvieran con el valor más improbable (nótese que no sabemos si ese valor probable es 0 o 1, pero eso nos da igual, sólo nos interesa distinguir los grupo de 16 que lo tienen con el mismo valor).
Ahí obtuve el primer resultado relevante. La polarización se producía muy notablemente en la columna 10 separándose muy claramente 16 valores altos respecto de 16 bajos.
Esto me permitió crear el primer grupo
ADKNÑPQRTUWY.,;: <-> BCEFGHIJLMOSVXZ_
La importancia de estos grupos es que, como se verá más adelante, nos permitirán trabajar con un número muy reducido de alfabetos derivados (2^5 * 5! = 3840) respecto del total de posibles (32!= 2,63x10^35), pasando de ser un problema casi imposible a casi trivial.
Los demás grupos costaron ya un poco más de obtener, ya que la circunstancia de la columna 21 no parece repetirse en el resto del texto. Así seguíamos teniendo que trabajar con bits prófugos de columnas que retuvieran algunos bits originales. El siguiente caso más favorable sería tener 3 de ellos y que se hubieran dispersado los otros 2. Habiendo 2 prófugos lo más probable es que hubieran ido a parar a columnas distintas. Si por mala suerte huieran ido a la misma seguramente no podríamos explotarlo ya que no podríamos polarizarla lo suficiente al compensarse entre ellos.
Si esos dos prófugos están en columnas distintas también podemos buscar la polarización. No conseguiermos resultados tan evidentes como en la 10 pero si habrá afectaciones detectables.
Empezamos filtrando ahora por un único valor en la columna analizado. Dado que queremos seguir trabajando con el "_" original apostamos por el que sea el más frecuente en la misma. Puesto que pensamos que puede haber 3 bits ahora fijados tendremos 4 carácteres (L1,L2,L3 y L4) que los compartirán y que diferiran en los bits (b1,b2) prófugos. Si f(Li) es la frecuencia de Li sabemos que uno de ellos será más probable que el resto. Supongamos que es L1. El peor escenario para conseguir la polarización sería que f(L1)+f(L2)=f(L3)+f(L4) puesto que en la columna donde L1 y L2 tengan b1 con el mismo valor compensarán el de L3 y L4, pero eso forzsamente implicará que donde lo tengan distinto (b2) se diferencien mucho, puesto que f(L1) es máxima y por tanto f(L1)+f(L3)>f(L2)+f(L4).
Con estas premisas construí una hoja de cálculo donde ver visualmente estas afectaciones. En dicha hoja comparaba las alteraciones que implicaban en todas las columnas el hecho de filtrar una de ellas por un valor. Sabemos que si se dan las anteriores condiciones la columna afectada se polarizará como hacía la 10. 16 valores incrementarán su presencia relativa y otros 16 la disminuirán. Así fui probando candidatos tomando como base columnas donde hubiera variaciones grandes de valor entre el máximo y el mínimo (inidcando que retenían grupos de bits originales). Encontré con esté método dos grupos disntintos más
Y me dio un vuelco el corazón al encontrar el grupo obtenido en la 21 repetido en otra columna. Esto confirmaba todas las teorias y validaba el grupo encontrado.
Ya lanzado encontré otras confirmaciones pero se me iban acabando las columnas óptimas y aún me faltaban 2 grupos. Las frecuencias cada vez estaban menos polarizadas con lo que me fui quedando con los candidatos más sólidos pero sin darlos por válidos hasta obtenerlos de nuevo en otra columna. Haciéndolo así acabé obteniendo los 5 grupos finales.
Antes de pasar al ataque del alfabeto derivado aún quise hacer una última comprobación. ¿Serían estos grupos capaces de generar un alfabeto coherente?. para ello asignando 0 o 1 según el carácter estuviera a la derecha o a la izquierda deberían proporcionar una única combinación para cada carácter. Comprobándolo resulto que si (afortunadamente).
Las combinaciones eran únicas y por tanto eran una base para generar el alfabeto. El siguiente paso era obtenerlos todos y determinar cual de ellos provenía de la clave. Para generar un alfabeto se asigna a cada pareja de grupos un orden dentro del carácter y se determina si estar a la derecha o a la izquierda equivale a 0 o 1. el número obtenido de convertir esos bits a decimal para cada letra serán la posición del carácter en el candidato a alfabeto derivado. En el caso de la comprobación el alfabeto sería:
Aquí, conociendo al enemigo, sospeché que habría usado texto en claro como clave, con lo que simplifiqué el ataque para buscarlo específicamente. Yo ya tenía un método recursivo para analizar alfabetos derivados y obtener claves de longitud inferior a 32. Esté método venía a ser
funcion calcularClave(I,alfareducido,Pos){ L=longitud(alfareducido) nuevaPos=posicionLetra(clave[I],alfareducido) K=(nuevaPos-Pos) mod L mientras(K<32) si (sumaMod32(clave[0..I])=alfacript[0] y alfabase[K]=clave[0]) mostrar candidato si no { clave[I]=alfabase[K] calcularClave(I+1,alfareducido-alfacript[I],nuevaPos) } K=K+L } } calcularClave(0,alfacript,clave[0])El problema es que ese análisis, aunque habíamos reducido enormemente el número de alfabetos derivados, seguía siendo muy costoso al multiplicarlo por casi 4000 casos. Así pues, me encomendé a los dioses de la aritmética modular y obvié la comprobación de las subramas buscando acertar a la primera (cosa probable en los primeros pasos) en la búsqueda del texto claro de Agustín. Así visualmente encontré en la posición 2024
Y desde ahí Omelette, ya herido de muerte, empezó a desangrarse. Aunque aún le quedaban fuerzas para un último coletazo. Aunque quedaba claro que la clave estaba inspirada en el refranero no acababa de descifrarla. tenía un método semimanual buscando palabras probables para el caso en que la clave fuera mayor de 32 letras y no conseguía resultados... hasta que cambié el método y me puse a buscar "_". Una de las soluciones, la del refrán puro y duro, me daba una cantidad enorme de ellos pero el texto no tenía sentido hasta que (autocolleja por lento) vi que estaba escrito de derecha a izquierda.
Tras unas carcajadas solitarias que me convirtieron en foco de atención de los presentes, buscar la fuente del texto original y comunicar la caída del monstruo a la comunidad.
Los resultados.
Y una vez más mi aprecio y reconocimiento a Sqrmatrix sin cuya aportación esto no habría sido posible.
Júbilo
La gente que nunca haya presentado un reto quizá no pueda imaginar la inmensa alegría que produce su caída, cuando se realiza mediante el ingenio y la sutileza, provocando el desarrollo de trabajos mucho más interesantes que el pobre artilugio de la criatura muerta. Mi enhorabuena y mi agradecimiento a LlamameX y a sqrmatrix. Estoy escribiendo desde un móvil. A la noche volveré.
Enhorabuena... con compromiso
Agustín, infosniper, LlamameX y srqmatrix lucirán este verano flamantes camisetas de Kriptópolis sobre sus apolíneos cuerpos.
Voto a Bríos que lo harán!
Gracias
La llevaremos con orgullo.
Estooo... Lo del apolíneo cuerpo está más difícil.
Páginas
opinar