Tu necesidad está contenida en mi respuesta.
Por un lado, si tienes dos (o más) diccionarios a aplicar, puede suceder dos cosas:
-
Que prepares los ficheros antes de abordar el ataque.
En este caso, la respuesta la tienes en la parte superior de mi mensaje: Reunir un solo fichero el contenido de ambos sin repeticiones.
-
Que abordes el ataque primero con un diccionario y luego debas preparar el segundo. en este caso, la respuesta la tienes en la parte inferior de mi mensaje (solo que má s simple, al no requerir guarda cada fichero si no solo el de tu interés): Reunir en un fichero las entradas que constan en el 2º que no contan en el primero.
funcion DiferenciaFiles( RutaA, RutaB)
abrir ficheros A1(rutaA), B1(rutaB)
crear y abrir ficheros temporales A2, B2, C
THash = llenar desde fichero A1
Por cada linea1 en fichero B1
h = Hashing(linea1)
si tHash.Contiene(h)
copiar linea1 al fichero C y THash.Eliminar(h)
si no
copiar linea1 al fichero B2
fin si
siguiente
// como se han ido eliminando las entradas que están contenidas también en B1,
// al final solo quedan entradas únicas en la tabla hash.
por cada item en THash
copiar item al fichero A2
siguiente
cerrar y eliminar A1, B1
renombrar A2 como A1, y B2 como B1.
cerrar ficheros
Adicionalmente, para futuras situaciones lo preferible es que cada diccionario contenga solo entradas únicas. Puedes realizar cualquiera de las soluciones que te propuse, pues la diferencia entre ambos casos es la cantidad de ficheros resultantes (pero en ambos casos cda fichero pasa a tener entradas únicas sin repeticiónes)
- La solución de la parte superior: reúne en un solo fichero con las entradas que constan en ambos ficheros, pero sin repetidos.
- La solución de la parte inferior: te proporciona 3 ficheros distintos a partir de los 2 de entrada, los 3 tienen entradas unicas... (uno pasa a conteneder las entradas que solo constan en el él y no en el segundo, el otro pasa a tener igualmente las que solo constan en el y no en el primero, y un tercero pasa a contener las entradas que aparecían en ambos pero sin repetirse). Luego, puedes unirlos de la forma que te parezca o dejarlos sueltos.
En cualquiera de los casos dejan de existir entradas repetidas.
Con PowerShell se puede hacer fácilmente, darle x cantidad de wordlists, que ordene y quite duplicados para que luego se guarde en un nuevo wordlist limpio
mmmm... eso de fácilmente, lo tenemos que dejar aparte, si resulta ser verdad cuando dice:
...con miles de millones de palabras
Ordenar miles de millones, requiere su tiempito y me temo que tampoco tendría suficiente RAM...
Un sencillo cálculo:
Imaginemos 4.000 millones (4 es un número pequeño en cuanto a 'miles'), suponiendo solo 10 caracteres por contraseña, ...tendríamos que, mantener en memoria el array supondría unos 37Gb. de RAM (UTF8)... ya ni contamos el tiempo de carga dle fichero al array.
Un problema así no puede abordarse con RAM si no tirando de ficheros... si hay que ordenar manteniendo en fichero, entonces resulta aún más eterno (cada entrada debe ser comparada una enorme cantidad de veces, tanto más cuanto mayor sea el array). Incluso la cantidad de veces que debe escribirse es log2(4.000 millones) más o menos 32 veces (2^32 =aprox. 4 mil 300 millones).
En cambio el uso de tablas hash, tirando de ficheros, no supone una sobrecarga excesiva, porque cada entrada se escribe una sola vez y se lee (de origen una vez +) en cálculo 1 vez + la cantidad de posibles colisiones que tuviere... (pongamos que cada entrada tuviere 10-50 colisiones de media), claro que la cantidad de colisiones de promedio dependerá del algoritmo de hashing utilizado. Pero salvo un muy mal algoritmo, esto sería rápido.
Una cosa es que el código sea 'fácil' de escribir y otra muy distinta que sea rentable ejecutarlo.
...claro que al final comenta sobre diccionarios de 1 millón de entradas (que es muy asumible), nada se sabe si solo es por ejemplificar o si es más o menos el caso real y arriba se coló poniendo 'miles de millones'.
Por descontado tener diccionarios de miles de millones de entrada, es monstruosamente estúpido. Las claves deberían ser generadas automáticamente a medida que se usan... usar y consumir.