Foros:
Llevo bastante tiempo leyéndoos, aunque no participase hasta ahora. Os presento este pequeño algoritmo de cifrado muy simple.
Sé que os he plagiado mucho de vuestros retos para crear éste lo más sencillo, y al mismo tiempo espero que no sea demasiado fácil de reventar.
Espero vuestra sincera opinión. Y no dudéis en ponerlo a parir si es necesario, pues estoy aprendiendo y todo comentario sería de agradecer.
Al grano...
Este método de cifrado en flujo usa el desorden de la clave y del alfabeto y un simple XOR sobre el texto claro espero que os divierta.
No he creado ningún reto.
Tabla de clave
|1|2|2|3|:|;|,|.|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|_| |S|A|N|C|H|O|T|B|Ñ|D|I|P|U|C|O|E|J|Q|V|D|P|F|K|R|W|E|Q|G|L|S|X|F|R|H|M|T|
Tabla de alfabeto
|: |; |, |. |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 |_ | |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|
1) PUNTOS DE INSERCIÓN
2) Espacio si la cave es más larga se añaden más
3) CARACTER DE POSICIÓN
Funcionamiento:
Lo primero es extender la clave para obtener una de un tamaño como mínimo de 36, usaremos el método ya usado en otros como omelette, el +1. Se toma el carácter de posición de la clave [3] en este caso [C] se compara con la clave y obtenemos [I]. Extraemos el carácter de la posición [C] lo colocamos en la posición [1] y desplazamos todos los demás caracteres. Ahora miramos en el alfabeto el numero que corresponde [I=12] con esto hacemos XOR sobre el carácter correspondiente en el texto claro. Con la tabla del alfabeto sacamos el número de la posición del carácter claro y lo ponemos en la posición [:] desplazando los demás números.
En este ejemplo la clave usada fue [SANCHO].

Algoritmo
Al menos por lo que a mí respecta, la explicación debería ser mucho más detallada, con ejemplos y paso a paso, de otro modo me siento incapaz de implementarlo. Y de paso podrías poner un texto cifrado, a ver si el personal se anima a romperlo. Lo malo es que en este momento hay unos cuatro retos activos, y a lo mejor te toca esperar un poco.
Bienvenido al club.
no lo veo
No acabo de verlo. ¿qué texto se cifra y cual es el resultado?. Luego, eso de 1 2 2 3, ¿es correcto?.
Cuando tenemos muy claro en nuestra cabeza un algoritmo tenemos tendencia a extendernos poco por que pensamos que el resto de la humanidad comparte esa claridad con nosotros. A mi me pasa demasiado a menudo y es una tendencia equivocada. Mira de extenderte aunque creas que estás explicando obviedades y presenta un ejemplo paso a paso, operación a operación y así garantizas que todos te pillemos la idea.
Respecto a copiarnos. Para eso los exponemos, para dar ideas y que otros puedan aprovecharlas. De eso se trata y haces muy bien en coger lo que creas útil.
Mi pequeño engendro
Es que se me da como el culo explicarme asi que hare un pequeño ejemplo.
Clave: SANCHO
Texto ha cifrar: PANZA
Texto cifrado: TIFRO
Primero extendemos la clave, supongo que esta parte me la puedo saltar pues es el mismo método que con omelette, y la colocamos en la tabla de claves
y creamos la tabla del alfabeto
el motivo de que se coloque de esta manera se basa en que [_] es el caracter que más sale en un texto por general y que des pues de signo de puntuación suele haber un [_] pero no es relevante
Empecemos con el ejemplo, posición 3 de la tabla de claves que es C, C que es I ahora miramos el alfabeto y obtenemos 12 y el texto claro P que es 20 hacemos 12 xor 20 =24 que es T, ya tenemos la primera letra cifrada
Ahora empezamos con los desordenes cojemos el caracter de la clave que usamos de la posición C que es I y la colocamos en la posición 1 desplazando los demás caracteres el resultado
y cogemos el valor del caracter del texto claro que era P y lo desplazamos a la Posición : y desplazamos los demás caracteres, el resultado es:
seguimos con el siguiente caracter. Posición 3 que es N que es F que es 8 con A del texto claro que es 3 8XOR3=11 que es I ya tenemos el segundo; Y seguimos desordenando Posición N a la posición 1 y desplazamos, Posición A a la posición : los resultados
Seguimos
Posición 3 que es A que es T que es 24 con N que es 16. 24XOR16=8 que es F ya tenemos la siguiente y desordenamos
movemos T de la posición A a la Posición 1 y desplazamos los demás caracteres hacemos lo mismo con el alfabeto 16 a la posición : los resultados
y seguimos, posición 3 que es S que es G que es 8 con Z que es 30, 8 XOR 30 = 22 que es R.
Movemos de la posición S la G a la posición 1 y desplazamos los demás caracteres. Acemos lo mismo valos de Z pasa a : y desplazamos el resto de valores los resultados:
y seguimos, posición 3 que es I que es O que es 17 con A que es 0, 17xor0=17 que es O y ya tenemos el texto cifrado
Texto cifrado: TIFRO
Es pero que ahora quede un poco más claro.
Espero no haberme equivocado con el cifrado, pues lo hice ha mano.
Como podéis observar tanto la clave como el alfabeto se van desordenando progresivamente de esta manera evitamos el análisis estadístico.
Una gran debilidad es que si tienes el principio del texto en claro el desorden del alfabeto no sirve de nada y se podría atacar fácilmente la clave, para eso tengo una versión 2 que creo que corrige ese problema, pero en este momento no seria capad de explicarlo
Hola ha todos
Hola ha todos
LlamameX lo de 1223 si es correcto, realmente el 2 solo es para separar el ultimo caracter de inserción con el de posición, además puede haber tantos 2 como se quiera dependiendo del tamaño de la clave, puse 2 como pude poner puntos suspensivos.
Lo de no poner un texto cifrado es que no pude implementar una aplicación, la programación la tengo tan abandonada, hace más de 10 años que no me meto en ello, y cifra a mano aunque se puede es un poco pesado :)
Y de todas maneras se que ya tenéis varios retos en marcha
PD.
Gracias espero que el ejemplo que puse sirva para entender su funcionamiento.
Dudas
Tengo algunas dudas. Por ejemplo, esos números 1 2 2 3 ¿son parte del secreto que comparten emisor y receptor? Es decir: ¿Son parte de la clave, como la palabra SANCHO?
Por otra parte, aún no acabo de ver el algoritmo, pero es que yo soy especialmente espeso para estas cosas.
Vale lo pillo, pero
¿Por qué la posición 3?, ¿es por diseño?, ¿puede ser otra?. Tampoco acabo de ver el motivo de poner 4 caracteres extra a la clave para pasar de 32 a 36.
Como primera impresión es interesante, sobre todo por que parece fuerte para ser manual. Ahora tengo bastante lío con FOTP pero cuando tenga un rato lo implemento y así le acabo de ver las tripas.
1 2 2 3
Lo del 1 2 2 3 no es parte del secreto sino del algoritmo.
Si la clave es menor de 36 se entiende si es más el numero de 2 aumentaría. Creo que con un ejemplo se entenderá mejor:
es cierto que no es necesario extender la clave hasta 36 que se podría hacer como en el desorden del alfabeto con 32, pero si uno pone una cave más larga se entiende mejor el motivo de los 2.
Puse 1 2 2 3 como pude poner * - - #
Metodo extendido del engendro ¿Si o NO?
Hola.
No se si quedo todo claro, y me pongo ha explicar el método extendido.
Este método creo que corrige el problema de tener parte del texto claro que hace inútil el proceso de desordenar el alfabeto, además de hacer el cifrado más fuerte.
Pero eso solo es mi opinión, lo mismo meto la pata y lo único que hace es que además de hacerlo más lento lo vuelve más inseguro.
No temáis no modifica demasiado la implementación que podáis tener; Apenas se añadirían unas pocas lineas de código al anterior.
Otra cosa que se me avía pasado, que no le puse nombre al engendro. Se admiten sugerencias
"Se admiten sugerencias"
Pues ahí va una que duele bastante a la vista y obliga a recordarlo aunque no se quiera:
Cifrado HA-CULLO
La verdad
La verdad es que la ortografía ha salido malherida de este experimento. Pero la ortografía no es inmutable, y lo que a tí
o a mí nos pueda escocer en los ojos, tal vez mañana sea la regla establecida. También podríamos llamarle Cifrado Heterógrafo.
Yo le llamaria oruga
O Caterpillar si te molan los anglicismos, mas que nada por la manera en que se mueven los caracteres. Pero tu eres el padre de la criatura así que a ti te corresponde el honor.
Respecto al tema de meter ya la versión dura, exponla y vemos si parece aportar o no seguridad. Como ya te dije estoy algo liado ahora para implementar cualquiera de las dos versiones, casi no puedo ni dedicarle tiempo a FOTP y antes de pasar a otro tema querría dejar éste acabado.
Me gusta
Me gusta oruga como nombre.
Cifrado Oruga que bien
Metodo extendido
Empezaré con el método extendido.
Esto solo es la modificación; No explicare el cifrado en si, sino solo la modificación, pues el resto permanece igual.
1) Tomamos la clave extendida que le llamaremos [claveA] y la copiamos a [claveB].
2) Ciframos [claveB] con [claveA] por el método normal, y obtenemos [claveC], además del alfabeto y la claveA desordenada.
3) Pasamos [claveA] a [claveB] y [claveC] a [claveA]. (claveB=claveA; claveA=claveC). Ahora la nueva clave (claveA) sera la que usaremos para cifrar el texto texto claro.
Para aumentar la seguridad repetimos el proceso desde el punto 2 cada 32 caracteres del texto claro.
PD.:
Como podéis observar la modificación es mínima pero la seguridad aumenta considerablemente. Y ya no usamos la propia clave para cifrar el texto claro, sino unas claves derivadas.
PD2:
Este método creo que no se podrá reventar salvo por diccionario y fuerza bruta. Pero con los genios que tenemos en este foro. Seguro que encuentran las debilidades por las que atacarlo.
Primer fallo de seguridad localizado
Este fallo depende de la calidad de la clave y sus primeros 5 caracteres, que podrían acortar la clave útil.
Un ejemplo de clave inútil
Aunque parezca una clave segura esta clave se quedad en los 5 primeros.
Se que es muy exagerado; que nadie pondrá cinco dos puntos al principio pero también afecta en otras combinaciones menos obvias.
Posibles soluciones:
1) Desordenar la clave al principio (Podría solucionarlo, pero no me gusta porque añade más código).
2) Extender la clave siempre 32 caracteres más (Esta me parece la mejor opción pues no modifica apenas el código y fuerza ha usar la clave completa).
3) En el primer proceso de cifrado al cifrar la misma clave esa se invertir las posiciones de los caracteres en claveB. (ver método extendido)
Para mi la mejor solución seria los métodos 2 y 3 que modifican poco el código.
El Reto
Se sustituyo la Ñ por ~ ya que tenia problemas con unicode
codigo usado para cifrar
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLType, PairSplitter, ExtCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; Memo2: TMemo; Tclave: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure TclaveClick(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; TAlfabeto : string; TclaveA : string; TclaveB : string; TclaveC : string; Tclaro : string; Tcifrado : string; TcA : char; TcB : char; TcC : char; i : byte; num1,num2,codigo,LongitudT,LongitudC,LongitudCB,Posicion,NumC,NumT,NumTC : integer; Const CAlfabeto = ':;,.ABCDEFGHIJKLMN~OPQRSTUVWXYZ_'; implementation {$R *.lfm} { TForm1 } procedure TForm1.TclaveClick(Sender: TObject); begin end; procedure TForm1.Button1Click(Sender: TObject); begin //TAlfabeto := AnsiToUTF8(Calfabeto); TAlfabeto := ':;,.ABCDEFGHIJKLMN'+'~'+'OPQRSTUVWXYZ_'; TclaveA := Tclave.Text; LongitudC := Length (TclaveA); //Extensión de la clave 32 Caracteres for num1 := 1 to 32 do begin Posicion := Pos (TclaveA[num1], TAlfabeto); if posicion<>0 then //comprueba que el caracter este en el alfabeto begin TcA :=TAlfabeto[posicion]; if Posicion = 32 then TcB :=TAlfabeto[1] else begin TcB :=TAlfabeto[posicion+1]; end; //Delete (TAlfabeto, posicion, 1); //TAlfabeto := TcA+TAlfabeto; TclaveA := TclaveA+TcB; end; end; //Cifrado de la clave LongitudCB := Length (TclaveA); TclaveB:=''; TclaveC:=''; for num1:=1 to LongitudCB do //genera la clave B con la A begin TclaveB:= TclaveA[num1]+TclaveB; end; for num1:=1 to LongitudCB do begin //Posición Clave TcA:=TclaveA[LongitudC]; Posicion := Pos (TcA, CAlfabeto); TcB:=TclaveA[Posicion+LongitudC]; NumC:=Pos (TcB, CAlfabeto)-1;//Númeno de clave Delete (TclaveA, Posicion+LongitudC, 1); TclaveA:=TcB+TclaveA; //Posición Texto num2:= Pos (TclaveB[num1],CAlfabeto); NumT:= Pos (CAlfabeto[num2],TAlfabeto)-1; NumTC:= NumC xor NumT;// Número de Tecto TclaveC:=TclaveC+CAlfabeto[NumTC+1]; TcA:=TAlfabeto[NumT+1]; Delete (TAlfabeto, NumT+1, 1); TAlfabeto:=TcA+TAlfabeto; end; TclaveB:=TclaveA; TclaveA:=TclaveC; //Cifrado Texto Claro Tclaro := Memo1.Text; Tcifrado :=''; LongitudCB := Length (Tclaro); for num1:=1 to LongitudCB do begin //Posición Clave TcA:=TclaveA[LongitudC]; Posicion := Pos (TcA, CAlfabeto); TcB:=TclaveA[Posicion+LongitudC]; NumC:=Pos (TcB, CAlfabeto)-1;//Númeno de clave //Posición Texto num2:= Pos (Tclaro[num1],CAlfabeto); if num2>0 then begin Delete (TclaveA, Posicion+LongitudC, 1); TclaveA:=TcB+TclaveA; NumT:= Pos (CAlfabeto[num2],TAlfabeto)-1; NumTC:= NumC xor NumT;// Número de Tecto Tcifrado:=Tcifrado+CAlfabeto[NumTC+1]; TcA:=TAlfabeto[NumT+1]; Delete (TAlfabeto, NumT+1, 1); TAlfabeto:=TcA+TAlfabeto; if num1 mod 32 = 0 then Tcifrado:=Tcifrado+#10; end; end; Memo2.Text := UTF8ToAnsi(Tcifrado); end; procedure TForm1.Button2Click(Sender: TObject); begin end; end.Texto cifrado con la clave A
texto claro
Un Pequeño Error en el codigo
He cometido un pequeño error en el código en la linea 129
donde pone
tiene que poner
una sola letra y todo a la mierda
El texto cifrado no vale
el correcto
texto cifrado
texto claro
clave : "A"
fe de erratas
En el anterior mensaje donde pone linea 126 es la linea 129.
Estoy más tonto. Solo hago cometer errores estúpidos.
Tranquilo
Ya está corregido
Pistas y aplicación
El texto está en español la clave es legible y la primera letra del texto claro es "T"
Pistas:
La aplicación para Linux 64 que permite cifrar y descifrar el reto:
Aplicación:
http://amonshare.com/65g1cy5qk525/oruga_2.64.html
Otra aplicación modificada con soporte unicode, no sirve para el reto, Linux 64.
http://amonshare.com/6zegm1cusjud/orugav2.5.64.html
Aplicación para Windows
La aplicación para Windows, solo la probé en wine 1.4 y funciona.
http://amonshare.com/u15d2tm34v7k/cifrado_oruga_redo_windows.7z.html
opinar