import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
public class HashCracker extends JFrame {
/**
* @param args
*/
public static void main(String[] args) {
HashCracker cracker = new HashCracker();
}
private JMenuItem openItem, saveItem, quitItem;
private JButton startButton;
private JButton stopButton;
private JButton addButton;
private JTextField usernameField;
private JTextField hashField;
private JTextField maxLengthField;
private JTextField minLengthField;
private JTextField numThreadsField;
private JTable table;
private CrackerTableModel tableModel;
private Cracker cracker;
private long startTime;
public HashCracker() {
this.setLayout(new BorderLayout());
cracker = null;
setUpMenuBar();
setUpToolBar();
setUpTable();
setUpBottomBar();
setUpSidePanel();
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
String targets[] = {"c5e478e7da53b70f0fabcdefa082e1d1c5a2bc6d", "66b27417d37e024c46526c2f6d358a754fc552f3", "34800e15707fae815d7c90d49de44aca97e2d759"};
for(int i = 0; i < targets.length; i++) {
tableModel.addRow(new User(i+"", targets[i]));
}
}
public void addSolution(String password, String hash) {
tableModel.setPassword(password, hash, System.currentTimeMillis() - startTime);
}
public void signalDone() {
}
// ------------------- Private ------------------ //
private void startCracking() {
ArrayList<String> targets = new ArrayList<String>();
for(int i = 0; i < tableModel.getRowCount(); i++)
if(!tableModel.getValueAt(i, 0).equals("") && !tableModel.getValueAt(i, 2).equals(""))
if(((String) tableModel.getValueAt(i, 2)).length() == 40)
targets.add((String) tableModel.getValueAt(i, 2));
String targs[] = targets.toArray(new String[0]);
if(targs.length < 1) return;
int max = Integer.parseInt(maxLengthField.getText().trim());
int min = Integer.parseInt(minLengthField.getText().trim());
int thr = Integer.parseInt(numThreadsField.getText().trim());
if(cracker == null) {
cracker = new Cracker(targs, max, min, thr, this);
}
startTime = System.currentTimeMillis();
cracker.start();
tableModel.setEditable(false);
}
private void stopCracking() {
if(cracker != null) {
cracker.interrupt();
}
cracker = null;
}
private void addUser() {
tableModel.addRow(new User(usernameField.getText().trim(), hashField.getText().trim()));
usernameField.setText("");
hashField.setText("");
}
// -------------- GUI Set Up Code --------------- //
private void setUpMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
openItem = new JMenuItem("Open");
saveItem = new JMenuItem("Close");
quitItem = new JMenuItem("Quit");
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(quitItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
}
private void setUpToolBar() {
Box toolbarBox = Box.createHorizontalBox();
toolbarBox.setPreferredSize(new Dimension(700, 40));
startButton = new JButton("Crack!");
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
startCracking();
}
});
stopButton = new JButton("Stop");
stopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stopCracking();
}
});
toolbarBox.add(Box.createHorizontalGlue());
toolbarBox.add(startButton);
toolbarBox.add(stopButton);
add(toolbarBox, BorderLayout.NORTH);
}
private void setUpBottomBar() {
Box box = Box.createVerticalBox();
box.setPreferredSize(new Dimension(700, 80));
Box nameBox = Box.createHorizontalBox();
JLabel nameLabel = new JLabel("Username");
usernameField = new JTextField();
usernameField.setPreferredSize(new Dimension(120, usernameField.getHeight()));
nameBox.add(Box.createHorizontalStrut(10));
nameBox.add(nameLabel);
nameBox.add(usernameField);
nameBox.add(Box.createHorizontalGlue());
nameBox.add(Box.createHorizontalStrut(300));
Box hashBox = Box.createHorizontalBox();
JLabel hashLabel = new JLabel("Hash");
hashField = new JTextField();
hashField.setPreferredSize(new Dimension(350, hashField.getHeight()));
hashBox.add(Box.createHorizontalStrut(10));
hashBox.add(hashLabel);
hashBox.add(hashField);
hashBox.add(Box.createHorizontalGlue());
hashBox.add(Box.createHorizontalStrut(300));
box.add(Box.createVerticalStrut(5));
box.add(nameBox);
box.add(Box.createVerticalStrut(5));
box.add(hashBox);
addButton = new JButton("Add");
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addUser();
}
});
box.add(addButton);
nameBox.setAlignmentX(Box.LEFT_ALIGNMENT);
hashBox.setAlignmentX(Box.LEFT_ALIGNMENT);
addButton.setAlignmentX(Box.LEFT_ALIGNMENT);
add(box, BorderLayout.SOUTH);
}
private void setUpSidePanel() {
Box box = Box.createVerticalBox();
minLengthField = new JTextField("6");
minLengthField.setPreferredSize(new Dimension(40, 30));
minLengthField.setMaximumSize(minLengthField.getPreferredSize());
maxLengthField = new JTextField("8");
maxLengthField.setPreferredSize(new Dimension(40, 30));
maxLengthField.setMaximumSize(maxLengthField.getPreferredSize());
numThreadsField = new JTextField("5");
numThreadsField.setPreferredSize(new Dimension(40, 30));
numThreadsField.setMaximumSize(numThreadsField.getPreferredSize());
Box lengthBox = Box.createHorizontalBox();
lengthBox.add(new JLabel("Min"));
lengthBox.add(minLengthField);
lengthBox.add(new JLabel("Max"));
lengthBox.add(maxLengthField);
//lengthBox.add(Box.createHorizontalGlue());
Box numThreadsBox = Box.createHorizontalBox();
numThreadsBox.add(new JLabel("Num Threads"));
numThreadsBox.add(numThreadsField);
//numThreadsBox.add(Box.createHorizontalGlue());
box.add(lengthBox);
box.add(numThreadsBox);
add(box, BorderLayout.EAST);
}
private void setUpTable() {
tableModel = new CrackerTableModel();
table = new JTable(tableModel);
table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
for(int i = 0; i < table.getColumnCount(); i++) {
table.getColumnModel().getColumn(i).setPreferredWidth(CrackerTableModel.columnWidths[i]);
}
JScrollPane scrollpane = new JScrollPane(table);
scrollpane.setPreferredSize(new Dimension(700, 300));
scrollpane.setMaximumSize(new Dimension(700, 300));
add(scrollpane, BorderLayout.CENTER);
}
}