Autor
|
Tema: Generar diccionarios con Phython. (Leído 1,059 veces)
|
Tachikomaia
Desconectado
Mensajes: 1.460
Hackentifiko!
|
GPT me dió este código: import itertools # Definimos el alfabeto incluyendo la ñ alfabeto = "abcdefghijklmnñopqrstuvwxyz" # Generamos todas las combinaciones de 4 letras combinaciones = itertools.product(alfabeto, repeat=4) # Convertimos las combinaciones en una lista de strings resultado = [''.join(combinacion) for combinacion in combinaciones] # Mostramos las primeras 10 combinaciones como ejemplo print(resultado[:10]) # Si necesitas guardarlas en un archivo with open("combinaciones.txt", "w", encoding="utf-8") as archivo: for combinacion in resultado: archivo.write(combinacion + "\n")
Quisiera que me expliquen algunas cosas... resultado = [''.join(combinacion) for combinacion in combinaciones]
La variable resultado es... ''.juntar(¿?) para ¿? en combinaciones. ¿Qué es combinacion y qué hace todo eso exactamente? Nunca les vi sentido a los for xP with open("combinaciones.txt", "w", encoding="utf-8") as archivo:
Con abrir archivo combinaciones.txt, ¿w?, parámetro que no necesito, como archivo Me habían dado otra forma de guardar: with open("passwords_python.txt", "w") as txt:
Por eso dije que lo de encoding no lo necesito, lo que no entiendo es la w y que uno dice archivo y el otro txt ¿eso último es un nombre de resúmen que se le pone al archivo para referirse a él dentro del programa? Y eso de "con abrir (nombre)" tampoco parece tener sentido. Lo normal es cosas como "with a hammer, drive a nail", o sea, "con objeto, hacer algo". Si se dice "con verbo, hacer algo", también podría entenderlo, pero aquí la acción parece el verbo, no sé, no es algo como "Crear archivo (nombre)", eso sí tendría sentido. for combinacion in resultado: archivo.write(combinacion + "\n")
Para ¿? en resultado al archivo agregarle (¿? + salto de línea) No sé qué es combinacion, tal vez algo que itertools crea por defecto, o sea, esa variable no se definió.
|
|
|
En línea
|
|
|
|
EdePC
|
0. Python es un lenguaje "diferente" puede llevar cierta similitud con los lenguajes clásicos pero ten una mente flexible porque muchas cosas solo se parecerán un poco o serán cosas totalmente diferentes a las que ya conozcas aunque te parezcan familiares o simplemente serán "increíbles" XD Quisiera que me expliquen algunas cosas... resultado = [''.join(combinacion) for combinacion in combinaciones]
La variable resultado es... ''.juntar(¿?) para ¿? en combinaciones. ¿Qué es combinacion y qué hace todo eso exactamente? Nunca les vi sentido a los for xP - Se lee desde el for, ese for lo que hace es crear una variable combinacion que irá tomando cada uno de los valores de combinaciones- combinaciones sería como un Array de Arrays, por ejemplo equivaldría a hacer: combinaciones = [['a','a','a','a'], ['a','a','a','b'], ['a','a,'a','c'], etc]- Ahora vayamos a los corchetes [ ... ], hay un ''.join(combinacion) que sería el cuerpo del for y lo que hace es unir lo que en ese momento tenga la variable combinacion, por ejemplo si tuviera el Array ['a','a','a','a'] lo une quedando un String: 'aaaa'. Por último, como todo está encerrado entre los dichosos corchetes cada variable combinación se irá adjuntando en un Array y se guardará en la variable resultado, por ejemplo al final equivaldría a: resultado = ['aaaa', 'aaab', 'aaac', etc]NOTA: Lo que seguramente conoces como Arrays en lenguajes como ActionScript en Python se llaman Listas (List) y son prácticamente iguales, los llamo Arrays en los ejemplos para que sea más amigable para tí, también espero que estés familiarizado con los Arrays en ActionScript. with open("combinaciones.txt", "w", encoding="utf-8") as archivo:
Con abrir archivo combinaciones.txt, ¿w?, parámetro que no necesito, como archivo Me habían dado otra forma de guardar: with open("passwords_python.txt", "w") as txt:
Por eso dije que lo de encoding no lo necesito, lo que no entiendo es la w y que uno dice archivo y el otro txt ¿eso último es un nombre de resúmen que se le pone al archivo para referirse a él dentro del programa? - 'w' o "w" (write, permiso de escritura) es un String que determina con que permisos vas a abrir el archivo, si no pones nada por defecto lo abrirá como solo lectura "r" y obviamente te dará error si intentas escribir en él. - El encoding es importante cuando usas caracteres fuera del ASCII, por ejemplo una palabra que siempre prueban para la codificación en el lenguaje español es ñandú, lleva ñ y ú que rompen muchas cosas. Si no lo especificas se usa la codificación que usa el Sistema Operativo, en mi caso con Windows usa ANSI, pero ahora todo suele utilizar la codificación UTF-8, también dependerá de tu programa con el que abres el archivo resultante, si intentan utilizar o detectan una codificación que no corresponde se verán caracteres extraños. - Si, tanto archivo como txt serán la variable con la que te podrás referir al archivo abierto luego en el código. Y eso de "con abrir (nombre)" tampoco parece tener sentido. Lo normal es cosas como "with a hammer, drive a nail", o sea, "con objeto, hacer algo". Si se dice "con verbo, hacer algo", también podría entenderlo, pero aquí la acción parece el verbo, no sé, no es algo como "Crear archivo (nombre)", eso sí tendría sentido. for combinacion in resultado: archivo.write(combinacion + "\n")
Para ¿? en resultado al archivo agregarle (¿? + salto de línea) No sé qué es combinacion, tal vez algo que itertools crea por defecto, o sea, esa variable no se definió. - combinacion es una variable creada ahí mismo para ser utiliza por el FOR, IN resultado especifica una variable ITERABLE existente, que sea iterable implica que se pueda descomponer en otras variables y tomar cada una de estas para que combinacion tome ese valor en cada iteración del bucle FOR, por ejemplo python que es muy flexible puedes iterar Strings: nombre = "pepe", es válido poner: for letra in nombre, letra irá tomando una a una las letras de "pepe", otro ejemplo más clásico: vocales = ["a", "e", "i", "o", "u"], también es válido poner: for vocal in vocales, donde vocal irá tomando cada vocal del Array vocales. - El for que estamos viendo está iterando cada palabra generada, con archivo.write escribes en el archivo, pero obviamente debes poner un salto de línea luego de cada palabra "\n" para que no quede todo en una sola línea - Por último el WITH lo que hace acá es encerrar parte del código de la apertura de un archivo para que terminado ese código se cierre el archivo automáticamente, claro, porque si dejas el archivo abierto no lo liberas (tanto en código como en memoria), acá no es tan necesario porque muerto el programa cerrado el archivo, pero si necesitas cerrarlo en la ejecución del programa es útil, otra opción es hacer el cerrado manual: open("combinaciones.txt", "w", encoding="utf-8") as archivo: for combinacion in resultado: archivo.write(combinacion + "\n") close(archivo)
|
|
|
En línea
|
|
|
|
Danielㅤ
|
Hola, además de la buena explicación de EdePC, agrego que el parámetro "w" en la función with open("combinaciones.txt", "w", encoding="utf-8") significa "escribir", mientras que la "r" significa "leer", cuando hay un "rb" significa "leer binario" mientras que "wb" significa "escribir binario". El for en Python es un bucle, éste lenguaje tiene 2 tipos de bucles, el for y el while. Al último de tu mensaje preguntaste que es "combinacion" haciendo referencia a ésta parte del código que has dejado: for combinacion in resultado:
combinacion es una variable temporal que la crea el bucle for y que con cada iteración va obteniendo un valor distinto. Esta parte del código: with open("passwords_python.txt", "w") as archivo:
respondiendo lo que has preguntado, "passwords_python" es tan sólo el nombre del archivo mientras ".txt" sería la extensión de ese archivo, ahora bien que significa "archivo"? es un objeto que lo crea with y ese objetivo sirve para poder escribir en el archivo por eso esta parte: archivo.write(combinacion + "\n")
el "\n" es un salto de línea que se deja al final de la línea para que el próximo contenido a escribir comience en una nueva línea. Por último una corrección al código del compañero EdePC, el cierre del archivo no es de ésta forma: close(archivo)
sinó de ésta: archivo.close()
Saludos
|
|
« Última modificación: 28 Noviembre 2024, 23:12 pm por Danielㅤ »
|
En línea
|
|
|
|
Tachikomaia
Desconectado
Mensajes: 1.460
Hackentifiko!
|
- Se lee desde el for, ese for lo que hace es crear una variable combinacion que irá tomando cada uno de los valores de combinaciones Acabo de ver que for puede significar otras cosas además de para o por: Pero en algunos casos también puede indicar dirección (hacia, con destino a) y tiempo (durante).Intento lo de la mente flexible pero si lo que leo no parece tener una traducción digamos lógica, no me gusta xD ¿Cómo se traduciría más o menos literalmente al español, esa línea de código? "Juntar en combinacion, lo que está en combinaciones", podría ser, pero ¿por qué dice combinacion 2 veces? ¿Y los corchetes, las comillas y el punto, para qué? Pregunto por si tiene algún motivo importante digamos, si es como una configuración, sino bueno, es así y ya xD un Array de Arrays, por ejemplo equivaldría a hacer: combinaciones = [['a','a','a','a'], ['a','a','a','b'], ['a','a,'a','c'], etc] Entonces ¿no hay algo más eficiente que itertools? Algo que cree un array de strings, por ejemplo. Yo las combinaciones las suelo generar con variables, whiles e ifs. Eso que me dijo GPT es mucho más simple, claro, a 1era vista, porque si por ejemplo se quiere que la 1era letra sea mayúscula... o que pueda haber espacio pero no al principio ni al final... En fin, por ahora me limité a intentar entender lo que me dijeran. - Ahora vayamos a los corchetes [ ... ], hay un ''.join(combinacion) que sería el cuerpo del for y lo que hace es unir lo que en ese momento tenga la variable combinacion, por ejemplo si tuviera el Array ['a','a','a','a'] lo une quedando un String: 'aaaa'. Por último, como todo está encerrado entre los dichosos corchetes cada variable combinación se irá adjuntando en un Array y se guardará en la variable resultado, por ejemplo al final equivaldría a: resultado = ['aaaa', 'aaab', 'aaac', etc] Esto no lo entendí mucho. Entiendo lo que hace el código, pero no cómo se relaciona con el resultado, es como si me dijeran que escribir "guitar" convierte números en strings. Supongamos que las combinaciones fuesen 4: [['a','a'], ['a','b'], ['b','a'], ['b','b']] Entonces, la traducción del código podría ser: Poner en resultado cada output (llamado combinacion), de: De combinaciones, ir tomando cada lista, convertirla en string, y formar una nueva lista. Supongo que es más simple, pero no imagino cómo, porque están usando una variable combinacion que parece servir de puente, cuando podría ser un proceso más directo, algo como: resultado = join(each list in combinaciones) o combinaciones = join(each list in combinaciones) ¿no? ... El for que estamos viendo está iterando cada palabra generada
"for combinacion in resultado:" A ver, sería como "A cada elemento en resultado, tomarlo de a uno y ponerlo en combinacion" Creo que así me queda mucho más claro, o puesto en el mismo orden original sería: "En combinacion, ir guardando uno a la vez los elementos de resultado" Luego combinacion puede ser usado para algo... Entendí que with cierra el archivo pero no qué tiene que ver la palabra esa con cerrar un archivo. El método manual que pusiste es mucho más claro.
|
|
|
En línea
|
|
|
|
EdePC
|
¿Cómo se traduciría más o menos literalmente al español, esa línea de código? "Juntar en combinacion, lo que está en combinaciones", podría ser, pero ¿por qué dice combinacion 2 veces? ¿Y los corchetes, las comillas y el punto, para qué? Pregunto por si tiene algún motivo importante digamos, si es como una configuración, sino bueno, es así y ya xD
Pasa que en Python se pueden simplificar las cosas y puede llegar a verse algo raro (recomprimido) el código porque hay varias instrucciones encadenadas en una misma línea. Ya debe queda claro que lo siguiente: combinaciones = itertools.product(alfabeto, repeat=4) es como decir: combinaciones = [['a','a','a','a'], ['a','a','a','b'], ['a','a,'a','c'], etc]También debería quedar claro el uso de FOR IN, supongo que aún no lo has usado en ActionScript aunque su funcionamiento es un poco diferente, por ejemplo: vocales = ["a", "e", "i", "o", "u"] for (index in vocales) { trace(vocales[index]) }
- Nótese el uso de un plural (vocales) para nombrar a un Array, en ActionScript index tomará las pociones numéricas de cada elemento del Array (0, 1, 2, 3, 4) por eso se usa vocales[index] para mostrar cada valor del Array. La idea es recorrer un Iterable (Array, Objeto) y trabajar con cada miembro de ese iterable.- En Python la diferencia es que en lugar de un índice (index) directamente se utiliza cada uno de los valores, sería algo así (código ficticio): vocales = ["a", "e", "i", "o", "u"] for (vocal in vocales) { trace(vocal) }
Lo que python sería: vocales = ["a", "e", "i", "o", "u"] for vocal in vocales : print(vocal)
- Nótese que es más legible llamar vocales al Array (objeto iterable) y vocal a la variable que irá tomando cada valor del Array. Entonces la línea recomprimida: resultado = [''.join(combinacion) for combinacion in combinaciones]
- Es en sí varias instrucciones a la vez, la estructura ejemplificada de esa instrucción sería: [vocal for vocal in vocales], lo del FOR IN ya está claro, pero no tiene cuerpo, su cuerpo está a la izquierda y ahí debe estar la variable vocal y los cambios que se le harán a dicha variable, como todo está entre corchetes implica que en cada iteración el resultado del cuerpo del for se irá agregando a un Array (List o lista en Python). - El ''.join(combinacion) que es el cuerpo del FOR lo que hace es unir un Array usando el String especificado '' (dos comillas simples, nada en este caso porque ese String está vacío), el Array a unir es combinacion, recordar que combinación irá teniendo los valores: ['a','a','a','a'], ['a','a','a','b'], ['a','a,'a','c'], etc, por lo que irá devolviendo: 'aaaa', 'aaab', 'aaac', etc, y repito, como TODO esa instrucción recomprimida está entre corchetes esos valores devueltos formarán un nuevo Array cuyos miembros serán los valores devueltos, en resumen sería algo como: resultado = ['aaaa', 'aaab', 'aaac', etc]
--- Ya en otro mensaje te dejé la forma clásica de usar python para crear diccionarios, supongo que es más legible y más ahora, tiene 6 rondas de for por lo que generará combinaciones de 6 caracteres: AAAAAA, AAAAAB, AAAAAC, etc con el juego de caracteres (charset) dado charset = "ABCDEF0123456789" with open("passwords_python.txt", "w") as txt : for a in charset : for b in charset : for c in charset : for d in charset : for e in charset : for f in charset : txt.write(a + b + c + d + e + f + "\n")
Si quieres hacer comprobaciones previas las puedes hacer en los cuerpos de algún for o antes de escribir en el archivo
|
|
|
En línea
|
|
|
|
Tachikomaia
Desconectado
Mensajes: 1.460
Hackentifiko!
|
Ya lo entiendo más... Ya en otro mensaje te dejé la forma clásica de usar python para crear diccionarios Lo había visto pero en el resultado me pareció que faltaban casos, ahora lo probé de nuevo y no, no sé qué pasó. Lo que tenía en AS por ahora es: Mayu = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"; Minu = "abcdefghijklmnñopqrstuvwxyz "; // Para determinar qué tan lejos puede llegar, // ya que si va a modificar el 1er caracter... // o el último, no debe ser espacio: MaximoChar = 26; Chars = 4; Char1 = 0; Char2 = 0; Char3 = 0; Char4 = -1; PunteroDeChars = 4; function MakePassword () { CharaModificar = "Char"+PunteroDeChars; EvaluedCharaModificar = eval(CharaModificar); // Si el caracter señalado puede cambiar: if (EvaluedCharaModificar < MaximoChar) { // Cambiarlo: // EvaluedCharaModificar++; set (CharaModificar, EvaluedCharaModificar+1); // Formar el password desde el caracter 2: Password = Minu.charat(Char2); PunteroDeChars2 = 2; do { PunteroDeChars2++; Password = Password+Minu.charat(eval("Char"+PunteroDeChars2)); } while (PunteroDeChars2<Chars); // Formar el password que inicia con minúscula: MinuPassword = Minu.charat(Char1)+Password; trace (MinuPassword); // Agregarle número: trace (MinuPassword+"6"); // Formar el password que inicia con mayúscula: Password = Mayu.charat(Char1)+Password; trace (Password); // Agregarle número: trace (Password+"6"); // Resetear puntero y el máximo valor del char: PunteroDeChars = Chars; MaximoChar = 26; } else { // Resetearlo: set (CharaModificar, 0); // Si el puntero puede bajar: if (PunteroDeChars>1) { // Bajarlo: PunteroDeChars--; if (PunteroDeChars>1) { MaximoChar = 27; } else { MaximoChar = 26; } } else { // El largo del password llegó a lo especificado, fin: gotoAndStop(2); } } } stop();
La finalización no sé si está bien. La idea era correr ese programa cambiando el bnúmero cada vez, pero como sea es muy lento. Seguiré intentando aprender Python para poder hacer algo medio así, con casos especiales.
|
|
« Última modificación: 30 Noviembre 2024, 15:25 pm por Tachikomaia »
|
En línea
|
|
|
|
EdePC
|
ActionScript 1 y 2 no están preparados para cosas extenuantes, si se detecta que un frame está ejecutando código extenuante manda alerta y ofrece cancelarlo. Quizá ActionScript 3 sea más para esas cosas pero no lo probé. Lo había visto pero en el resultado me pareció que faltaban casos, ahora lo probé de nuevo y no, no sé qué pasó. Quizá lo cerraste antes de que terminara, es bastante lo que tiene que calcular y escribir, aunque a mi me tarde algunos segundos puede que a ti te tarde algunos minutos, por ejemplo el código que pusiste al inicio del mensaje (el que te dio la IA) es demostrativo para no demasiados caracteres y/o para combinaciones cortas, estimo que tu PC podrá con hasta longitudes de 5, con 6 a mi ya me consume mis 16GB de Ram, para evitar ese alto consumo de Ram hay que evitar tener variables con contenido demasiado pesado, es decir, ir escribiendo una a una las contraseñas generadas en el archivo en lugar de guardarlo todo en una variable y luego esto al archivo. import itertools import time t = time.time() alfabeto = "ABCDEF0123456789" combinaciones = itertools.product(alfabeto, repeat=6) archivo = open("combinaciones.txt", "w") for combinacion in combinaciones : archivo.write( ''.join(combinacion) + "\n" ) archivo.close() print(time.time() - t)
Utilizo time para tomar una muestra del tiempo antes de ejecutar el código y al final de que termine vuelvo a tomar otra muestra para restarla y obtener el tiempo que tardó el código en ejecutarse, a mi me devuelve 12.860882043838501 que son casi 13 segundos, el consumo se Ram es mínimo (no más de 5MB), todo recae en el consumo de CPU aunque a mi procesador no lo satura, va al 18% con 4GHz (todos estos datos los vez en tu Administrador de Tareas), el archivo generado pesa 128MB
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Aplicacion para generar diccionarios para WPA.
Wireless en Linux
|
biznaka
|
2
|
14,331
|
13 Junio 2011, 13:59 pm
por dvdr
|
|
|
Ayuda generar diccionarios wifiway
Dudas Generales
|
4NTR4X13
|
0
|
2,833
|
8 Marzo 2012, 19:54 pm
por 4NTR4X13
|
|
|
Generar diccionarios WPA con java
Java
|
Gabilitron
|
5
|
5,738
|
19 Abril 2012, 13:55 pm
por Gabilitron
|
|
|
Generar diccionarios con condiciones (crunch hace esto?)
Wireless en Linux
|
Merphil
|
0
|
4,461
|
5 Agosto 2013, 23:08 pm
por Merphil
|
|
|
(Necesito) Scrip de python para generar diccionarios de contraseñas fuerza bruta
Hacking
|
teco77
|
4
|
4,307
|
18 Diciembre 2016, 07:23 am
por teco77
|
|