Diccionario de Fuerza Bruta Tipo v2

Iniciado por RJuegos, 3 Julio 2021, 06:52 AM

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

RJuegos

Yo por desgracia, no lo he probado mi propio diccionario  :-( porque mi pc de escritorio no tiene tarjeta de red, no tiene para detectar wifis, pero estoy seguro de su eficaz por el motivo que lo acabo de explicar arriba a El_Andaluz. Podría probarlo por mi tablet pero se que no es potente como una pc, me lee las claves como 1 clave por 4 o 5 seg. si no recuerdo mal. La aplicación se llama WIBR+ y es para android si les interesa saber.

RJuegos

Diccionario Fuerza Bruta v2 Actualizado

*Se borran sílabas innecesarias lo que hara mas rapido formar palabras.
+Se agregan nuevas sílabas, para mas posibilidades de palabras.


(Resumido)

RJuegos

#12
Un problema tenia con mi pc que es vieja y mi diccionario se perdio, asi que deje de hacerlo un tiempo y luego empiezo de vuelta, asi que esta ves les traigo el
Diccionario Incompleto Liviano un total de Claves 12.142.685

Por Mega Link...
https://mega.nz/file/rAo2mRaC#sZyn3nhqSQKCSSjF20zORsbdBBfhLE3gaRxO5HKrH0w

Tamaño Real: 116 MB
Comprimido: 13,1 MB
Claves Total: 12.142.685

*Se borran las siguientes combinacion en la ultima silaba

eñ, iñ, oñ, uñ

porque no hay palabras que terminen con esas combinaciones.

+Se agrega una combinacion en la ultima silaba

au

Para mas posibilidades de palabras claves ejemplo: gatomiau, gatoguau, marichau, etc

RJuegos

Volvi de vuelta lo siento mi pc es vieja deja de funcionar por un tiempo y luego anda,
es un problema con el disco rigido. Dejando eso al lado, traje un diccionario un poco mas
completo que el anterior y añadido mas silabas y numeros para mas posibilidades de formar
nuevas palabras.

Diccionario FB V2 (Incompleto Mediano) Claves total: 19.011.126

Link: https://mega.nz/file/XRJCBJTQ#Qal9vC16SSKDje-1bbOQLYWAlR-e_Eufgq-xHueNpRs

Tamaño Real: 183MB
Tamaño Comprimido: 20,9MB
Total de Claves: 19.011.126

Claves que empiecen con ba****** y de 8 letras lo desifra.

Claves que empiecen con beba**** bebe**** y de 8 letras lo desifra.

Claves que empiecen con bebia*** bebib*** bebic*** bebid*** y de 8 letras lo desifra.

RJuegos

Diccionario FB V2 (Incompleto Mediano) INFO de Actualizacion...

+Las siguientes combinaciones apareceran en cualquier posicion

au ck dy

Claves au de ejemplo: autoauto, auxilio8, etc.
Claves dy de ejemplo: freddy99, miodaddy, wifiandy, wifidady, etc.
Claves ck de ejemplo: backback, hackhack, hackers9, rockrock etc.

+Las siguientes combinacion no aparecera al final de la silaba
pero si antes del final

ct nd

Claves ct de ejemplo: victoria, bacteria, conectar, victima, etc.
Claves nd de ejemplo: mundos99, mirando5, fondomar, wendifea, etc.


*Se borro la combinacion al final de la silaba

aq eq iq oq uq

porque no hay palabras que terminen con esas combinaciones.

+Se añadio las siguiente combinacion

z + Numeros ej: z5

Claves de ejemplo: lapizzz6, pezzzzz9, etc.

+Numeros al final de las palabras

34 56 78

claves de ejemplo: unodos34, cuatro56, sietey78, etc.

Serapis

No termino de entender tu idea de 'diccionario'.

Básicamente tu me estás diciendo, que si no hay una palabra que termine en iñ, no puede existir una contraseña que acabe en 'iñ'... puedes explicar por qué???.

Te recuerdo que el diccionario de la RAE, no recoge palabras como 123456, ni siquiera 1234... y qué?. Quién o dónde se exige que una contraseña tenga que ser una palabra que exista en la RAE?.

Al margen de ello, es bastante estéril crear diccionarios y tener que almacenarlos.
La idea es que en vez de crear un programa que cree un diciconario, se cree en todo caso, una librería (instanciable o tipo API) con al menos dos funciones, una para inicializar, donde se pasan los parámetros que determinen las salidas que podrá proveer y otra función para iterar sobre ellas, partiendo de la previa. La función de inicialización debería admitir también como parámetro la entrada vigente y si se pasa nulo, se genera la primera, así se puede parar en cualquier momento y reanudar en otro instante justo desde donde se dejó.

RJuegos

Cita de: Serapis en 31 Octubre 2021, 23:00 PM
No termino de entender tu idea de 'diccionario'.

Básicamente tu me estás diciendo, que si no hay una palabra que termine en iñ, no puede existir una contraseña que acabe en 'iñ'... puedes explicar por qué???.

Te recuerdo que el diccionario de la RAE, no recoge palabras como 123456, ni siquiera 1234... y qué?. Quién o dónde se exige que una contraseña tenga que ser una palabra que exista en la RAE?.

Al margen de ello, es bastante estéril crear diccionarios y tener que almacenarlos.
La idea es que en vez de crear un programa que cree un diciconario, se cree en todo caso, una librería (instanciable o tipo API) con al menos dos funciones, una para inicializar, donde se pasan los parámetros que determinen las salidas que podrá proveer y otra función para iterar sobre ellas, partiendo de la previa. La función de inicialización debería admitir también como parámetro la entrada vigente y si se pasa nulo, se genera la primera, así se puede parar en cualquier momento y reanudar en otro instante justo desde donde se dejó.

Si estoy haciendo un programa consola y una con interfaz gráfica que genere este patrón, mientras estoy haciendo un diccionario con el patron con nuevos añadidos y mostrarlos aqui para que vallan viendo y probando, luego de añadir tantas silabas o combinaciones posibles para que no se me escapen palabras muy posible que esten como claves, crear ese patrón a un programa que las genere, por ahora no está escrito en un lenguaje de programación como para convertirlo en un programa, pero me sirve para poder enterlo mejor y pasarlo mas fácilmente a un lenguaje de programación mas desarrollado.

No dije que debe existir una palabra que termine en ñ para que exista una contraseña
que acabe en ñ, sino que es muy poco probable que una contraseña puede terminar en ñ, no digo que no existe, pero es poco probable porque la mayoría de las contraseñas tienen un nombre, de su mascota, calle, hijo, pelis personajes cantantes favoritos, objetos, etc. Te he dicho esto antes, solo es probabilidad. Pero si tienes una mejor idea de añadir esta combinación me gustaría saberlo, para mejorar el diccionario y probar su eficaz.

Serapis

#17
Citar...Pero si tienes una mejor idea de añadir esta combinación me gustaría saberlo...
Pués sí.
Si tu consideras que la mayoría de contraseñas utiliza sílabas del alfabeto humano, entonces lo razonable es que primero crees un algoritmo para obtener las sílabas del alfabeto humano (tampoco sobra en ese supuesto, añadir dígitos, pares y tríos de dígitos, ya que esto comulga dentro de esa consideración). Este debería ser a lo sumo tu diccionario, que al ser de un tamaño 'aceptable', incluso puede residir en memoria (se carga al iniciar el programa). En vez de andar disperso con !!!!teces!!!! que poco o nada aportan y que hacen tu 'programación' infinita en el tiempo.

Tras tenerlas todas enumeradas, luego sería cuestión de combinarlas entre sí (ese array cargado en memoria) hasta formar el largo requerido (3-4-5-6 sílabas, con un simple bucle recursivo, te adjunto debajo el pseudocódigo para esto)... pero esto último ya 'en combate' ... para probar (debug) que enumera bien las combinaciones de sílabas sí es acertado pasarlo a fichero y comprobar el resultado.


funcion Combinar(entero numSilabas, entero MaxSilabas)
   numsilabas +=1
   Si (numsilabas = Maxsilabas)
       por cada silaba en arrayDiccionario
           stackClave.Append(silaba, stackClave.Size)  // <--- el parámetor size, en realidad es innecesario, se añade exclusivamente para clarificar.
           #si debug=TRUE
               GuardarAfile(stackClave.toString)
           #sino
               probarClave(stackClave.toString)    // <---- creada la contraseña se envía a donde haya que enviarla...
               // o devolver por evento, si la función que prueba la clave no está junto a esta.
           #fin si
           stackClave.Size -= silaba.size
       siguiente
   sino
       por cada silaba en arrayDiccionario
           stackClave.Append(silaba, stackClave.Size)
           llamada a combinar(numSilabas, MaxSilabas)  // <--- aquí la llamada recursiva.
           stackClave.Size -= silaba.size
       siguiente
   fin si
fin funcion


Como se puede ver es muy simple y es eficiente, luego generar la clave a medida que se necesita, hace innecesario guardar diccionarios enormes a fichero.
la variable 'stackClave', puede ser un simple array de bytes-chars que actúa como un stack, con un largo máximo de modo que pueda alojar el número de sílabas 'maxSilabas' de la más larga (así no hay necesidad de generar con cada clave un nuevo array). O bien una clase...
En cualquier caso se requieren unos métodos para manejar dicha variable de stack...
Una 'Append' que añade una silaba al final del size actual y actualiza size, tras usarla, no hace falta borrar nada, solo restar el 'size' de la última sílaba 'append'...
En fin, a buen entendedor pocas palabras bastan.

....y con esto ya tienes la mitad de tu problema, lo otra mitad es generar las sílabas del alfabeto español (o inglés o de otro idioma del que conozcas lo suficiente de su gramática).

RJuegos

Cita de: Serapis en 13 Noviembre 2021, 16:17 PM
Pués sí.
Si tu consideras que la mayoría de contraseñas utiliza sílabas del alfabeto humano, entonces lo razonable es que primero crees un algoritmo para obtener las sílabas del alfabeto humano (tampoco sobra en ese supuesto, añadir dígitos, pares y tríos de dígitos, ya que esto comulga dentro de esa consideración). Este debería ser a lo sumo tu diccionario, que al ser de un tamaño 'aceptable', incluso puede residir en memoria (se carga al iniciar el programa). En vez de andar disperso con !!!!teces!!!! que poco o nada aportan y que hacen tu 'programación' infinita en el tiempo.

Tras tenerlas todas enumeradas, luego sería cuestión de combinarlas entre sí (ese array cargado en memoria) hasta formar el largo requerido (3-4-5-6 sílabas, con un simple bucle recursivo, te adjunto debajo el pseudocódigo para esto)... pero esto último ya 'en combate' ... para probar (debug) que enumera bien las combinaciones de sílabas sí es acertado pasarlo a fichero y comprobar el resultado.

...

Como se puede ver es muy simple y es eficiente, luego generar la clave a medida que se necesita, hace innecesario guardar diccionarios enormes a fichero.
la variable 'stackClave', puede ser un simple array de bytes-chars que actúa como un stack, con un largo máximo de modo que pueda alojar el número de sílabas 'maxSilabas' de la más larga (así no hay necesidad de generar con cada clave un nuevo array). O bien una clase...
En cualquier caso se requieren unos métodos para manejar dicha variable de stack...
Una 'Append' que añade una silaba al final del size actual y actualiza size, tras usarla, no hace falta borrar nada, solo restar el 'size' de la última sílaba 'append'...
En fin, a buen entendedor pocas palabras bastan.

....y con esto ya tienes la mitad de tu problema, lo otra mitad es generar las sílabas del alfabeto español (o inglés o de otro idioma del que conozcas lo suficiente de su gramática).

El algoritmo para generar las sílabas directas e indirectas ya lo he hecho, pero como algunas silabas son menos probable que pueden estar al final de las claves, las he sacado algunas y he añadido unas nuevas manualmente, este algoritmo seria el no actualizado.

Código (pascal) [Seleccionar]
program Silabas_Directas_e_Inversa;
uses crt;

var
seleccion1, seleccion2, i, i2:Integer;
Alfabeto: array of String;
FormarSilaba:String;

const
AbcdarioSinVocales:String ='bcdfghjklmnñpqrstvwxyz';  //aqui la enie no aparece pero esta
Vocales:String ='aeiou';

begin
  clrscr();
  seleccion1:=1; //Parte Generar Silabas Directas...
  for i:=1 to Length(AbcdarioSinVocales) do
  begin
  seleccion2:=1;
   for i2:=1 to Length(Vocales) do
   begin
   FormarSilaba:=Concat(AbcdarioSinVocales[seleccion1], Vocales[seleccion2]); //unir letra de AbcdarioSinVocales a una letra de Vocales
   WriteLn(FormarSilaba); //Mostrando resultado
   seleccion2:=seleccion2+1; //Siguiente letra de Vocales
   end;
  seleccion1:=seleccion1+1; //Siguiente letra de AbcdarioSinVocales
  end;
  seleccion1:=1;//Parte Generar Silabas Inversa o indirectas...
  for i:=1 to Length(AbcdarioSinVocales) do
  begin
  seleccion2:=1;
   for i2:=1 to Length(Vocales) do
   begin
   FormarSilaba:=Concat(Vocales[seleccion2], AbcdarioSinVocales[seleccion1]);//unir letra de Vocales a una letra de AbcdarioSinVocales
   WriteLn(FormarSilaba); //Mostrando resultado
   seleccion2:=seleccion2+1;
   end;
  seleccion1:=seleccion1+1;
  end;
  readln;
end.


Esta parte del programa consola la tengo lista, aunque sigo actualizando y añadiendo cosas nuevas y necesarias para que funcione el programa. Gracias por tu tiempo por ayudar aunque no soy un gran experto algo pude entenderlo, se que hace algunos código mas tu explicación mas o menos pude entenderlo mejor que quieres decir.

Serapis

#19
Lo que estás haciendo no es generar sílabas en todo caso serían dígrafos.
En realidad, lo de menos es el nombre, sino la funcionalidad, y desde luegro, de ese modo no podrás inscribir sílabas muy específicas pero también muy presentes como por ejemplo las que aparecen en la palabra 'constructor', sus sílabas son 'cons-truc-tor', pero t código no generaría los digrafos 'ns' y 'tr' porque solo une silabas con consonantes y viceversa, además eso tolera ciertas construcciones que muy probablemente no se den en palabras (ciñéndonos al caso tu premisa del uso de palabras), o aunque se den su frecuencia sea realmente escasa.

En realidad tu algoritmo de sílabas debiera generar las sílabas que toleran las reglas de silabeo de la gramática española, es decir tu algoritmo debiera considerar dichas reglas e implementarlas en un algoritmo, para poder reconocerlas.
Luego generalas todas supone elegir una entre (al menos) dos estrategias...
- Alimentar el algortimo con pseudosílabas generadas a partir de un algoritmo de bucles (el anterior que te dí vale a condición de que el array contenga los caracteres a-z, y el largo vaya pasando por 1, 2, 3 ,4, 5 y 6 (en español es imposible generar sílabas más largas de 6 y cuesta encontrar ejemplos de estas, incluso de 5)). Cada pseudosílaba es una proposición que el algoritmo de silabeo demuestra si pertenece o no a la gramática española, si el resultado es favorable se añade a la lista.
En este caso, el algoritmo recibe pues un string que es una posible sílaba y el algoritmo debe demostrar si lo es o no.

- Alimentar el algoritmo con textos procedentes de obras en español.
En este caso el algoritmo lo que recibe es un texto que se compone de palabras  y el algoritmo, lo que hace es la partición silábica. Luego con cada sílaba hallada se localiza si ya se tiene almacenada, en caso negativo se añade a la lista.

Ambos algoritmos difieren muy poco. En el primero recibe un string y verifica si al completo es o no una silaba, en el segundo se recibe una palabra y va tomando caracteres formando así sílabas (saltando espacios y caracteres de puntuación cuando aparezcan), con cada una encontrada devuelve la posición alcanzada en la palabra (o devuelve la sílaba), para seguir en una nueva llamada a continuación del punto previo.
La mayor diferencia no reside en el algoritmo de silabeo (que es el mismo en ambos casos), si no en el que alimenta a dicho algoritmo.

Desde luego el algoritmo de silabeo tiene su trabajillo (no es complicado peor lleva su tiempo), primero hay que empaparse (ponerse al día y refrescar lo olvidado) de las reglas de silabeo de la gramática española (desde mis tiempos de estudiante, ignoro si alguna de estas reglas ha cambiado, como sí han ido cambiando las reglas de ortografía (las 'reglas' de cualquier índole, tienen un carácter de 'constante, en el tiempo', pero con tantos y tan frecuentes cambios, más bien dichas reglas ya, parecen 'variables, cada pocos años'))... y luego para hacerlo eficiente en velocidad lo adecuado sería diseñar el automáta para reconocer las sílabas en base a dichas reglas. Esto también puede resultar complicado si las capacidades como programador son limitadas...

...en el pseudocódigo anterior te había dejado una 'tarea' a tu esfuerzo, cuando lo vieras. Debe haber dos condiciones de salida, una cuando acaba el análisis y no se encontró nada (esa salida está), y la otra cuando la contraseña coincide que también debe acabar, que es la que omití... pero viendo tu código y leyendo tus explicaciones, entiendo que tu nivel de programación es el que es, luego ve a tu ritmo, a tu manera si no logras entender más allá.