He hecho un programa muy basico que usa dos archivos, una con palabras clave y otro con numeros clave para generar combinaciones palabra-numero, aleatorias, con las que se espera que una de ellas sea la contraseña.
Lo he probado con dos cuentas de las cuales ya sabia la contraseña y en los dos casos las ha adivinado.
El problema es que el programa genera como 300 contraseñas distintas, y probarlas todas manualmente no es muy eficiente.
Mi pregunta es si se puede hacer un programa que introduzca el usuario y vaya probando todas las contraseñas. Todo esto en paginas web como gmail, outlook, instagram, etc.
Os adjunto el codigo del programa y si veis algo por pequeño que sea, por favor decidlo.
Para que el codigo funcione hay que descargarse la libreria acm de internet, os dejo el enlace por aqui:http://www.filedropper.com/acm_2
Código:
package password_cracker;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
import acm.program.ConsoleProgram;
//La libreria acm ha sido desarrollada por la universidad de standford
//Se puede encontrar mas informacion en "https://cs.stanford.edu/people/eroberts/jtf/javadoc/student/"
public class consola extends ConsoleProgram {
private static long permutaciones;
public void run() {
try {
println("Este progrograma calcula 300 combinaciones posibles entre un numero y una palabra claves"
+ " dados a traves de dos archivos de texto");
println();
println("Las posibles contraseñas se escribiran en un nuevo archivo de texto."
+ "El usuario debera introducirlas en la cuenta manualmente");
// Declaramos un objeto random
Random rand = new Random(System.currentTimeMillis());
// Declaramos archivos, lectores, escritores y buffers
File palabras = new File(
readLine("Introduce el directorio de las palabras:"));
File numeros = new File(
readLine("Introduce el directorio de los numeros:"));
File newfile = new File(
readLine("Introduce el nombre y el directorio del nuevo archivo:"));
if (!newfile.exists())
newfile.createNewFile();
FileReader filereader = new FileReader(palabras);
BufferedReader lector_palabras = new BufferedReader(filereader);
FileReader filereader2 = new FileReader(numeros);
BufferedReader lector_numeros = new BufferedReader(filereader2);
FileReader filereader3 = new FileReader(newfile);
BufferedReader lector = new BufferedReader(filereader3);
FileWriter filewriter = new FileWriter(newfile);
BufferedWriter escritor = new BufferedWriter(filewriter);
// Calculamos el numero de elementos en las listas
// Ademas marcamos el principio de los archivos para poder releerlos
// despues
lector_palabras.mark(500);
lector_numeros.mark(500);
int elements_number = contarLineas(lector_numeros);
int elements_word = contarLineas(lector_palabras);
int contador = 0;
String elementosWord[] = new String[elements_word];
String elementosNumber[] = new String[elements_number];
// Volvemos los lectores al principio del fichero
lector_palabras.reset();
lector_numeros.reset();
// Metemos los elementos de los archivos en los arrays
// correspondientes
String lectura = lector_palabras.readLine();
while (lectura != null & contador < elements_word) {
elementosWord[contador] = lectura;
lectura = lector_palabras.readLine();
contador++;
}
contador = 0;
lectura = lector_numeros.readLine();
while (lectura != null & contador < elements_number) {
elementosNumber[contador] = lectura;
lectura = lector_numeros.readLine();
contador++;
}
/*
* Usamos los elemntos de los array para generar contraseñas,cuando
* el programa detecte 300 contraseñas en el archivo, dejara de
* producir combinacionesy finalizara el programa.
*/
int passwordNumber = 0;
while (passwordNumber < 300) {
String contraseña = entrecruzar(rand, elementosWord,
elementosNumber);
comprobador(lector, contraseña, escritor);
passwordNumber = contarLineas(lector);
}
println("El programa a finalizado, puedes cerrarlo");
} catch (Exception e) {
System.out.println(e);
}
}
// cuentaLineas cuenta las lineas que hay en el archivo pasado
static public int contarLineas(BufferedReader lector) throws IOException {
int number = 0;
String lectura = lector.readLine();
while (lectura != null) {
number += 1;
System.out.println(lectura);
lectura = lector.readLine();
}
System.out.println("El numero de lineas es: " + (number - 1));
return number - 1;
}
/*
* Este metodo genera una contraseña a partir de una palabra aleatoria y un
* numero
*/
static public String entrecruzar(Random rand, String[] palabras,
String[] numeros) throws IOException {
String last = "";
last = palabras[rand.nextInt(palabras.length)]
+ numeros[rand.nextInt(numeros.length)];
return last;
}
/*
* Esta funcion se encarga de comprbar si la String acomp esta ya en la
* lista de contraseñas, y si no lo esta la añade
*/
static public void comprobador(BufferedReader lector, String acomp,
BufferedWriter escritor) throws IOException {
boolean comp = false;
String lectura = lector.readLine();
while (lectura != null) {
if (acomp == lectura)
comp = true;
lectura = lector.readLine();
if (acomp == lectura)
comp = true;
}
if (comp != true) {
escritor.write(acomp);
escritor.newLine();
}
}
}
Gracias de antemano