Imports System.ComponentModel
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Deshabilitamos el TextBox txtPathDiccionario para que no puedan escribir a mano en el.
txtPathDiccionario.Enabled = False
'Aplicamos filtro en el Dialogo de Seleccion de Archivo para que solo muestre archivos de texto
OpenFileDialog1.Filter = "Archivos de Texto|*.txt;*.text"
End Sub
Private Sub btnDict_Click(sender As Object, e As EventArgs) Handles btnDict.Click
' Mostramos el Dialogo de Seleccion de Archivo
Dim result As DialogResult = OpenFileDialog1.ShowDialog()
'Verificamos que el archivo haya sido seleccionado, si no fue asi, salimos
If result <> DialogResult.OK Then Exit Sub
'Escribimos la ubicacion del archivo en el TextBox
txtPathDiccionario.Text = OpenFileDialog1.FileName
'Indicamos que nuestros BW reportan progreso
bw.WorkerReportsProgress = True
End Sub
Private Sub btnInit_Click(sender As Object, e As EventArgs) Handles btnInit.Click
'Deshabilitamos los controles para que no se cambie su contenido durante la ejecucion
txtHash.Enabled = False
radSHA1.Enabled = False
radMD5.Enabled = False
btnInit.Enabled = False
btnDict.Enabled = False
'Iniciamos BW
bw.RunWorkerAsync()
End Sub
Private Sub bw_DoWork(sender As Object, e As DoWorkEventArgs) Handles bw.DoWork
'Verificamos la cantidad de lineas para mantener un conteo del progreso
Dim CantidadLineas = File.ReadAllLines(txtPathDiccionario.Text).Length
Dim LineaActual As Long = 0
'Creamos una lector para el archivo de diccionario
Dim reader As StreamReader = My.Computer.FileSystem.OpenTextFileReader(txtPathDiccionario.Text)
Dim ClaveActual As String = ""
Dim HashActual As String = ""
'Hacemos un bucle linea por linea verificando si coincide el hash con alguna del las claves en el diccionario
Do
ClaveActual = reader.ReadLine
If ClaveActual Is Nothing Then Exit Sub 'Si llegamos al final del archivo salimos.
'Ejecutamos la creacion del hash correspondiente
If radMD5.Checked = True Then HashActual = generarMD5(ClaveActual)
If radSHA1.Checked = True Then HashActual = generarSHA1(ClaveActual)
'Verificamos si coincide
If txtHash.Text = HashActual Then
'Si el hash corresponde con el generado notificamos al usuario
MsgBox("Clave encontrada: """ & ClaveActual
& """ (sin comillas).") 'Terminamos el Loop
Exit Do
End If
'Actualizacion de progreso
LineaActual = LineaActual + 1
If LineaActual > CantidadLineas / 100 Then
bw.ReportProgress(LineaActual / CantidadLineas * 100)
LineaActual = 0
End If
Loop
End Sub
Private Sub bw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bw.ProgressChanged
'Actualizamos el porcentaje del Progressbar
ProgressBar1.Value += e.ProgressPercentage
End Sub
Private Sub bw_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted
'Rehabilitamos los controles.
txtHash.Enabled = True
radSHA1.Enabled = True
radMD5.Enabled = True
btnInit.Enabled = True
btnDict.Enabled = True
ProgressBar1.Value = 0
End Sub
Function generarMD5(ByVal str As String) As String
'Funcion de generacion de hash MD5
Dim Bytes() As Byte
Dim sb As New StringBuilder()
If String.IsNullOrEmpty(str) Then Return ""
Bytes = Encoding.Default.GetBytes(str)
Bytes = MD5.Create().ComputeHash(Bytes)
For x As Integer = 0 To Bytes.Length - 1
sb.Append(Bytes(x).ToString("x2"))
Next
Return sb.ToString()
End Function
Function generarSHA1(ByVal str As String) As String
'Funcion de generacion de hash SHA1
Dim sha1Obj As New Security.Cryptography.SHA1CryptoServiceProvider
Dim bytesToHash() As Byte = System.Text.Encoding.ASCII.GetBytes(str)
bytesToHash = sha1Obj.ComputeHash(bytesToHash)
Dim strResult As String = ""
For Each b As Byte In bytesToHash
strResult += b.ToString("x2")
Next
Return strResult
End Function
End Class